Further isolate unstructured with factories.

This commit is contained in:
jregan
2018-10-06 10:44:34 -07:00
committed by Jeffrey Regan
parent 3cdfbd843b
commit 4eb2757847
31 changed files with 525 additions and 348 deletions

View File

@@ -20,13 +20,15 @@ import (
"errors"
"io"
"log"
"sigs.k8s.io/kustomize/pkg/ifc"
"sigs.k8s.io/kustomize/pkg/resmap"
"strings"
"github.com/spf13/cobra"
"sigs.k8s.io/kustomize/pkg/constants"
"sigs.k8s.io/kustomize/pkg/fs"
"sigs.k8s.io/kustomize/pkg/ifc"
"sigs.k8s.io/kustomize/pkg/loader"
"sigs.k8s.io/kustomize/pkg/resource"
"sigs.k8s.io/kustomize/pkg/target"
"sigs.k8s.io/kustomize/pkg/transformerconfig"
)
@@ -60,6 +62,7 @@ Use different transformer configurations by passing files to kustomize
// NewCmdBuild creates a new build command.
func NewCmdBuild(
out io.Writer, fs fs.FileSystem,
kf ifc.KunstructuredFactory,
decoder ifc.Decoder, hash ifc.Hash) *cobra.Command {
var o buildOptions
var p string
@@ -74,7 +77,7 @@ func NewCmdBuild(
if err != nil {
return err
}
return o.RunBuild(out, fs, decoder, hash)
return o.RunBuild(out, fs, kf, decoder, hash)
},
}
cmd.Flags().StringVarP(
@@ -119,6 +122,7 @@ func (o *buildOptions) Validate(args []string, p string, fs fs.FileSystem) error
// RunBuild runs build command.
func (o *buildOptions) RunBuild(
out io.Writer, fSys fs.FileSystem,
kf ifc.KunstructuredFactory,
decoder ifc.Decoder, hash ifc.Hash) error {
rootLoader, err := loader.NewLoader(o.kustomizationPath, "", fSys)
if err != nil {
@@ -127,6 +131,7 @@ func (o *buildOptions) RunBuild(
defer rootLoader.Cleanup()
kt, err := target.NewKustTarget(
rootLoader, fSys,
resmap.NewFactory(resource.NewFactory(kf)),
makeTransformerconfig(fSys, o.transformerconfigPaths),
decoder, hash)
if err != nil {

View File

@@ -128,7 +128,10 @@ func runBuildTestCase(t *testing.T, testcaseName string, updateKustomizeExpected
kustomizationPath: testcase.Filename,
}
buf := bytes.NewBuffer([]byte{})
err = ops.RunBuild(buf, fSys, k8sdeps.NewKustDecoder(), k8sdeps.NewKustHash())
err = ops.RunBuild(
buf, fSys,
k8sdeps.NewKustKunstructuredFactory(k8sdeps.NewKustDecoder()),
k8sdeps.NewKustDecoder(), k8sdeps.NewKustHash())
switch {
case err != nil && len(testcase.ExpectedError) == 0:
t.Errorf("unexpected error: %v", err)

View File

@@ -31,7 +31,8 @@ import (
// NewDefaultCommand returns the default (aka root) command for kustomize command.
func NewDefaultCommand(
decoder ifc.Decoder, validator ifc.Validator, hash ifc.Hash) *cobra.Command {
kf ifc.KunstructuredFactory, decoder ifc.Decoder,
validator ifc.Validator, hash ifc.Hash) *cobra.Command {
fsys := fs.MakeRealFS()
stdOut := os.Stdout
@@ -47,7 +48,7 @@ See https://sigs.k8s.io/kustomize
c.AddCommand(
// TODO: Make consistent API for newCmd* functions.
build.NewCmdBuild(stdOut, fsys, decoder, hash),
build.NewCmdBuild(stdOut, fsys, kf, decoder, hash),
edit.NewCmdEdit(fsys, validator),
misc.NewCmdConfig(fsys),
misc.NewCmdVersion(stdOut),

View File

@@ -69,3 +69,9 @@ type Kunstructured interface {
GetAnnotations() map[string]string
SetAnnotations(map[string]string)
}
// KunstructuredFactory makes instances of Kunstructured.
type KunstructuredFactory interface {
SliceFromBytes([]byte) ([]Kunstructured, error)
FromMap(m map[string]interface{}) Kunstructured
}

View File

@@ -22,6 +22,7 @@ import (
"testing"
"gopkg.in/yaml.v2"
"sigs.k8s.io/kustomize/internal/k8sdeps"
"sigs.k8s.io/kustomize/pkg/gvk"
"sigs.k8s.io/kustomize/pkg/internal/loadertest"
"sigs.k8s.io/kustomize/pkg/patch"
@@ -30,6 +31,9 @@ import (
"sigs.k8s.io/kustomize/pkg/resource"
)
var rf = resource.NewFactory(
k8sdeps.NewKustKunstructuredFactory(k8sdeps.NewKustDecoder()))
func TestNewPatchJson6902FactoryNoTarget(t *testing.T) {
p := patch.Json6902{}
_, err := NewPatchJson6902Factory(nil).makeOnePatchJson6902Transformer(p)
@@ -182,7 +186,7 @@ func TestNewPatchJson6902FactoryMulti(t *testing.T) {
id := resid.NewResId(gvk.FromKind("foo"), "some-name")
base := resmap.ResMap{
id: resource.NewFromMap(
id: rf.FromMap(
map[string]interface{}{
"kind": "foo",
"metadata": map[string]interface{}{
@@ -208,7 +212,7 @@ func TestNewPatchJson6902FactoryMulti(t *testing.T) {
}),
}
expected := resmap.ResMap{
id: resource.NewFromMap(
id: rf.FromMap(
map[string]interface{}{
"kind": "foo",
"metadata": map[string]interface{}{
@@ -296,7 +300,7 @@ func TestNewPatchJson6902FactoryMultiConflict(t *testing.T) {
id := resid.NewResId(gvk.FromKind("foo"), "some-name")
base := resmap.ResMap{
id: resource.NewFromMap(
id: rf.FromMap(
map[string]interface{}{
"kind": "foo",
"metadata": map[string]interface{}{

View File

@@ -21,6 +21,7 @@ import (
"testing"
"github.com/evanphx/json-patch"
"sigs.k8s.io/kustomize/internal/k8sdeps"
"sigs.k8s.io/kustomize/pkg/gvk"
"sigs.k8s.io/kustomize/pkg/resid"
"sigs.k8s.io/kustomize/pkg/resmap"
@@ -30,9 +31,11 @@ import (
var deploy = gvk.Gvk{Group: "apps", Version: "v1", Kind: "Deployment"}
func TestJsonPatchJSONTransformer_Transform(t *testing.T) {
rf := resource.NewFactory(
k8sdeps.NewKustKunstructuredFactory(k8sdeps.NewKustDecoder()))
id := resid.NewResId(deploy, "deploy1")
base := resmap.ResMap{
id: resource.NewFromMap(
id: rf.FromMap(
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
@@ -69,7 +72,7 @@ func TestJsonPatchJSONTransformer_Transform(t *testing.T) {
t.Fatalf("unexpected error : %v", err)
}
expected := resmap.ResMap{
id: resource.NewFromMap(
id: rf.FromMap(
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",

View File

@@ -25,19 +25,19 @@ import (
// NewResMapFromConfigMapArgs returns a Resource slice given
// a configmap metadata slice from kustomization file.
func NewResMapFromConfigMapArgs(
f *configmapandsecret.ConfigMapFactory,
func (rmF *Factory) NewResMapFromConfigMapArgs(
cf *configmapandsecret.ConfigMapFactory,
cmArgsList []types.ConfigMapArgs) (ResMap, error) {
var allResources []*resource.Resource
for _, cmArgs := range cmArgsList {
if cmArgs.Behavior == "" {
cmArgs.Behavior = "create"
}
cm, err := f.MakeConfigMap(&cmArgs)
cm, err := cf.MakeConfigMap(&cmArgs)
if err != nil {
return nil, err
}
res, err := resource.NewWithBehavior(
res, err := rmF.resF.WithBehavior(
cm, ifc.NewGenerationBehavior(cmArgs.Behavior))
if err != nil {
return nil, err

View File

@@ -26,7 +26,6 @@ import (
"sigs.k8s.io/kustomize/pkg/ifc"
"sigs.k8s.io/kustomize/pkg/internal/loadertest"
"sigs.k8s.io/kustomize/pkg/resid"
"sigs.k8s.io/kustomize/pkg/resource"
"sigs.k8s.io/kustomize/pkg/types"
)
@@ -42,7 +41,7 @@ func TestNewFromConfigMaps(t *testing.T) {
}
l := loadertest.NewFakeLoader("/home/seans/project/")
f := configmapandsecret.NewConfigMapFactory(fs.MakeFakeFS(), l)
cf := configmapandsecret.NewConfigMapFactory(fs.MakeFakeFS(), l)
testCases := []testCase{
{
description: "construct config map from env",
@@ -57,7 +56,7 @@ func TestNewFromConfigMaps(t *testing.T) {
filepath: "/home/seans/project/app.env",
content: "DB_USERNAME=admin\nDB_PASSWORD=somepw",
expected: ResMap{
resid.NewResId(cmap, "envConfigMap"): resource.NewFromMap(
resid.NewResId(cmap, "envConfigMap"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -83,7 +82,7 @@ func TestNewFromConfigMaps(t *testing.T) {
filepath: "/home/seans/project/app-init.ini",
content: "FOO=bar\nBAR=baz\n",
expected: ResMap{
resid.NewResId(cmap, "fileConfigMap"): resource.NewFromMap(
resid.NewResId(cmap, "fileConfigMap"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -109,7 +108,7 @@ BAR=baz
},
},
expected: ResMap{
resid.NewResId(cmap, "literalConfigMap"): resource.NewFromMap(
resid.NewResId(cmap, "literalConfigMap"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -133,7 +132,7 @@ BAR=baz
if ferr := l.AddFile(tc.filepath, []byte(tc.content)); ferr != nil {
t.Fatalf("Error adding fake file: %v\n", ferr)
}
r, err := NewResMapFromConfigMapArgs(f, tc.input)
r, err := rmF.NewResMapFromConfigMapArgs(cf, tc.input)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}

View File

@@ -114,10 +114,10 @@ func (m ResMap) ErrorIfNotEqual(m2 ResMap) error {
}
// DeepCopy clone the resmap into a new one
func (m ResMap) DeepCopy() ResMap {
func (m ResMap) DeepCopy(rf *resource.Factory) ResMap {
mcopy := make(ResMap)
for id, obj := range m {
mcopy[id] = resource.NewFromKunstructured(obj.Copy())
mcopy[id] = rf.FromKunstructured(obj.Copy())
mcopy[id].SetBehavior(obj.Behavior())
}
return mcopy
@@ -135,17 +135,31 @@ func (m ResMap) FilterBy(inputId resid.ResId) ResMap {
return result
}
// NewResMapFromFiles returns a ResMap given a resource path slice.
func NewResMapFromFiles(
loader ifc.Loader, paths []string,
d ifc.Decoder) (ResMap, error) {
// Factory makes instances of ResMap.
type Factory struct {
resF *resource.Factory
}
// NewFactory returns a new resmap.Factory.
func NewFactory(rf *resource.Factory) *Factory {
return &Factory{resF: rf}
}
// RF returns a resource.Factory.
func (rmF *Factory) RF() *resource.Factory {
return rmF.resF
}
// FromFiles returns a ResMap given a resource path slice.
func (rmF *Factory) FromFiles(
loader ifc.Loader, paths []string) (ResMap, error) {
var result []ResMap
for _, path := range paths {
content, err := loader.Load(path)
if err != nil {
return nil, errors.Wrap(err, "Load from path "+path+" failed")
}
res, err := newResMapFromBytes(content, d)
res, err := rmF.newResMapFromBytes(content)
if err != nil {
return nil, internal.Handler(err, path)
}
@@ -155,8 +169,8 @@ func NewResMapFromFiles(
}
// newResMapFromBytes decodes a list of objects in byte array format.
func newResMapFromBytes(b []byte, d ifc.Decoder) (ResMap, error) {
resources, err := resource.NewSliceFromBytes(b, d)
func (rmF *Factory) newResMapFromBytes(b []byte) (ResMap, error) {
resources, err := rmF.resF.SliceFromBytes(b)
if err != nil {
return nil, err
}

View File

@@ -31,6 +31,9 @@ import (
var deploy = gvk.Gvk{Group: "apps", Version: "v1", Kind: "Deployment"}
var statefulset = gvk.Gvk{Group: "apps", Version: "v1", Kind: "StatefulSet"}
var rf = resource.NewFactory(
k8sdeps.NewKustKunstructuredFactory(k8sdeps.NewKustDecoder()))
var rmF = NewFactory(rf)
func TestEncodeAsYaml(t *testing.T) {
encoded := []byte(`apiVersion: v1
@@ -44,7 +47,7 @@ metadata:
name: cm2
`)
input := ResMap{
resid.NewResId(cmap, "cm1"): resource.NewFromMap(
resid.NewResId(cmap, "cm1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -52,7 +55,7 @@ metadata:
"name": "cm1",
},
}),
resid.NewResId(cmap, "cm2"): resource.NewFromMap(
resid.NewResId(cmap, "cm2"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -72,7 +75,7 @@ metadata:
func TestDemandOneMatchForId(t *testing.T) {
rm1 := ResMap{
resid.NewResIdWithPrefixNamespace(cmap, "cm1", "prefix1", "ns1"): resource.NewFromMap(
resid.NewResIdWithPrefixNamespace(cmap, "cm1", "prefix1", "ns1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -80,7 +83,7 @@ func TestDemandOneMatchForId(t *testing.T) {
"name": "cm1",
},
}),
resid.NewResIdWithPrefixNamespace(cmap, "cm2", "prefix1", "ns1"): resource.NewFromMap(
resid.NewResIdWithPrefixNamespace(cmap, "cm2", "prefix1", "ns1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -118,7 +121,7 @@ func TestDemandOneMatchForId(t *testing.T) {
}
func TestFilterBy(t *testing.T) {
rm := ResMap{resid.NewResIdWithPrefixNamespace(cmap, "cm1", "prefix1", "ns1"): resource.NewFromMap(
rm := ResMap{resid.NewResIdWithPrefixNamespace(cmap, "cm1", "prefix1", "ns1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -126,7 +129,7 @@ func TestFilterBy(t *testing.T) {
"name": "cm1",
},
}),
resid.NewResIdWithPrefixNamespace(cmap, "cm2", "prefix1", "ns1"): resource.NewFromMap(
resid.NewResIdWithPrefixNamespace(cmap, "cm2", "prefix1", "ns1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -136,7 +139,7 @@ func TestFilterBy(t *testing.T) {
}),
}
rm1 := ResMap{
resid.NewResIdWithPrefixNamespace(cmap, "cm3", "prefix1", "ns2"): resource.NewFromMap(
resid.NewResIdWithPrefixNamespace(cmap, "cm3", "prefix1", "ns2"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -162,7 +165,7 @@ func TestFilterBy(t *testing.T) {
}
func TestDeepCopy(t *testing.T) {
rm1 := ResMap{
resid.NewResId(cmap, "cm1"): resource.NewFromMap(
resid.NewResId(cmap, "cm1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -170,7 +173,7 @@ func TestDeepCopy(t *testing.T) {
"name": "cm1",
},
}),
resid.NewResId(cmap, "cm2"): resource.NewFromMap(
resid.NewResId(cmap, "cm2"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -180,7 +183,7 @@ func TestDeepCopy(t *testing.T) {
}),
}
rm2 := rm1.DeepCopy()
rm2 := rm1.DeepCopy(rf)
if &rm1 == &rm2 {
t.Fatal("DeepCopy returned a reference to itself instead of a copy")
@@ -194,7 +197,7 @@ func TestDeepCopy(t *testing.T) {
func TestErrorIfNotEqual(t *testing.T) {
rm1 := ResMap{
resid.NewResId(cmap, "cm1"): resource.NewFromMap(
resid.NewResId(cmap, "cm1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -202,7 +205,7 @@ func TestErrorIfNotEqual(t *testing.T) {
"name": "cm1",
},
}),
resid.NewResId(cmap, "cm2"): resource.NewFromMap(
resid.NewResId(cmap, "cm2"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -218,7 +221,7 @@ func TestErrorIfNotEqual(t *testing.T) {
}
rm2 := ResMap{
resid.NewResId(cmap, "cm1"): resource.NewFromMap(
resid.NewResId(cmap, "cm1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -235,7 +238,7 @@ func TestErrorIfNotEqual(t *testing.T) {
}
rm3 := ResMap{
resid.NewResId(cmap, "cm2"): resource.NewFromMap(
resid.NewResId(cmap, "cm2"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -252,7 +255,7 @@ func TestErrorIfNotEqual(t *testing.T) {
}
rm4 := ResMap{
resid.NewResId(cmap, "cm1"): resource.NewFromMap(
resid.NewResId(cmap, "cm1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -291,7 +294,7 @@ metadata:
if ferr := l.AddFile("/home/seans/project/deployment.yaml", []byte(resourceStr)); ferr != nil {
t.Fatalf("Error adding fake file: %v\n", ferr)
}
expected := ResMap{resid.NewResId(deploy, "dply1"): resource.NewFromMap(
expected := ResMap{resid.NewResId(deploy, "dply1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
@@ -299,7 +302,7 @@ metadata:
"name": "dply1",
},
}),
resid.NewResId(deploy, "dply2"): resource.NewFromMap(
resid.NewResId(deploy, "dply2"): rf.FromMap(
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
@@ -309,9 +312,8 @@ metadata:
}),
}
m, _ := NewResMapFromFiles(
l, []string{"/home/seans/project/deployment.yaml"},
k8sdeps.NewKustDecoder())
m, _ := rmF.FromFiles(
l, []string{"/home/seans/project/deployment.yaml"})
if len(m) != 2 {
t.Fatalf("%#v should contain 2 appResource, but got %d", m, len(m))
}
@@ -333,7 +335,7 @@ metadata:
name: cm2
`)
expected := ResMap{
resid.NewResId(cmap, "cm1"): resource.NewFromMap(
resid.NewResId(cmap, "cm1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -341,7 +343,7 @@ metadata:
"name": "cm1",
},
}),
resid.NewResId(cmap, "cm2"): resource.NewFromMap(
resid.NewResId(cmap, "cm2"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -350,7 +352,7 @@ metadata:
},
}),
}
m, err := newResMapFromBytes(encoded, k8sdeps.NewKustDecoder())
m, err := rmF.newResMapFromBytes(encoded)
fmt.Printf("%v\n", m)
if err != nil {
t.Fatalf("unexpected error: %v", err)
@@ -362,7 +364,7 @@ metadata:
func TestMergeWithoutOverride(t *testing.T) {
input1 := ResMap{
resid.NewResId(deploy, "deploy1"): resource.NewFromMap(
resid.NewResId(deploy, "deploy1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
@@ -372,7 +374,7 @@ func TestMergeWithoutOverride(t *testing.T) {
}),
}
input2 := ResMap{
resid.NewResId(statefulset, "stateful1"): resource.NewFromMap(
resid.NewResId(statefulset, "stateful1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "StatefulSet",
@@ -383,7 +385,7 @@ func TestMergeWithoutOverride(t *testing.T) {
}
input := []ResMap{input1, input2}
expected := ResMap{
resid.NewResId(deploy, "deploy1"): resource.NewFromMap(
resid.NewResId(deploy, "deploy1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
@@ -391,7 +393,7 @@ func TestMergeWithoutOverride(t *testing.T) {
"name": "foo-deploy1",
},
}),
resid.NewResId(statefulset, "stateful1"): resource.NewFromMap(
resid.NewResId(statefulset, "stateful1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "StatefulSet",
@@ -428,7 +430,7 @@ func TestMergeWithoutOverride(t *testing.T) {
func generateMergeFixtures(b ifc.GenerationBehavior) []ResMap {
input1 := ResMap{
resid.NewResId(cmap, "cmap"): resource.NewFromMap(
resid.NewResId(cmap, "cmap"): rf.FromMap(
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "ConfigMap",
@@ -442,7 +444,7 @@ func generateMergeFixtures(b ifc.GenerationBehavior) []ResMap {
}),
}
input2 := ResMap{
resid.NewResId(cmap, "cmap"): resource.NewFromMap(
resid.NewResId(cmap, "cmap"): rf.FromMap(
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "ConfigMap",
@@ -463,7 +465,7 @@ func generateMergeFixtures(b ifc.GenerationBehavior) []ResMap {
func TestMergeWithOverride(t *testing.T) {
expected := ResMap{
resid.NewResId(cmap, "cmap"): resource.NewFromMap(
resid.NewResId(cmap, "cmap"): rf.FromMap(
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "ConfigMap",

View File

@@ -26,7 +26,7 @@ import (
// NewResMapFromSecretArgs takes a SecretArgs slice, generates
// secrets from each entry, and accumulates them in a ResMap.
func NewResMapFromSecretArgs(
func (rmF *Factory) NewResMapFromSecretArgs(
f *configmapandsecret.SecretFactory,
secretList []types.SecretArgs) (ResMap, error) {
var allResources []*resource.Resource
@@ -38,10 +38,10 @@ func NewResMapFromSecretArgs(
if args.Behavior == "" {
args.Behavior = "create"
}
res, err := resource.NewWithBehavior(
res, err := rmF.resF.WithBehavior(
s, ifc.NewGenerationBehavior(args.Behavior))
if err != nil {
return nil, errors.Wrap(err, "NewWithBehavior")
return nil, errors.Wrap(err, "WithBehavior")
}
allResources = append(allResources, res)
}

View File

@@ -27,7 +27,6 @@ import (
"sigs.k8s.io/kustomize/pkg/gvk"
"sigs.k8s.io/kustomize/pkg/ifc"
"sigs.k8s.io/kustomize/pkg/resid"
"sigs.k8s.io/kustomize/pkg/resource"
"sigs.k8s.io/kustomize/pkg/types"
)
@@ -55,7 +54,7 @@ func TestNewResMapFromSecretArgs(t *testing.T) {
}
fakeFs := fs.MakeFakeFS()
fakeFs.Mkdir(".")
actual, err := NewResMapFromSecretArgs(
actual, err := rmF.NewResMapFromSecretArgs(
configmapandsecret.NewSecretFactory(fakeFs, "."), secrets)
if err != nil {
@@ -63,7 +62,7 @@ func TestNewResMapFromSecretArgs(t *testing.T) {
}
expected := ResMap{
resid.NewResId(secret, "apple"): resource.NewFromMap(
resid.NewResId(secret, "apple"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "Secret",
@@ -76,7 +75,7 @@ func TestNewResMapFromSecretArgs(t *testing.T) {
"DB_PASSWORD": base64.StdEncoding.EncodeToString([]byte("somepw")),
},
}).SetBehavior(ifc.BehaviorCreate),
resid.NewResId(secret, "peanuts"): resource.NewFromMap(
resid.NewResId(secret, "peanuts"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "Secret",
@@ -111,7 +110,7 @@ func TestSecretTimeout(t *testing.T) {
}
fakeFs := fs.MakeFakeFS()
fakeFs.Mkdir(".")
_, err := NewResMapFromSecretArgs(
_, err := rmF.NewResMapFromSecretArgs(
configmapandsecret.NewSecretFactory(fakeFs, "."), secrets)
if err == nil {

View File

@@ -29,46 +29,53 @@ import (
"sigs.k8s.io/kustomize/pkg/resid"
)
// Resource is map representation of a Kubernetes API resource object
// paired with a GenerationBehavior.
type Resource struct {
ifc.Kunstructured
b ifc.GenerationBehavior
// Factory makes instances of Resource.
type Factory struct {
kf ifc.KunstructuredFactory
}
// NewWithBehavior returns a new instance of Resource.
func NewWithBehavior(obj runtime.Object, b ifc.GenerationBehavior) (*Resource, error) {
// NewFactory makes an instance of Factory.
func NewFactory(kf ifc.KunstructuredFactory) *Factory {
return &Factory{kf: kf}
}
// WithBehavior returns a new instance of Resource.
// TODO(monopole): This runtime dependence must be refactored away.
// The logic calling this has to move to k8sdeps.
func (rf *Factory) WithBehavior(
obj runtime.Object, b ifc.GenerationBehavior) (*Resource, error) {
// TODO(monopole): This k8sdeps dependence must be refactored away.
u, err := k8sdeps.NewKunstructuredFromObject(obj)
return &Resource{Kunstructured: u, b: b}, err
}
// NewFromMap returns a new instance of Resource.
func NewFromMap(m map[string]interface{}) *Resource {
// FromMap returns a new instance of Resource.
func (rf *Factory) FromMap(m map[string]interface{}) *Resource {
return &Resource{
Kunstructured: k8sdeps.NewKunstructuredFromMap(m),
Kunstructured: rf.kf.FromMap(m),
b: ifc.BehaviorUnspecified}
}
// NewFromKunstructured returns a new instance of Resource.
func NewFromKunstructured(u ifc.Kunstructured) *Resource {
// FromKunstructured returns a new instance of Resource.
func (rf *Factory) FromKunstructured(
u ifc.Kunstructured) *Resource {
if u == nil {
log.Fatal("unstruct ifc must not be null")
}
return &Resource{Kunstructured: u, b: ifc.BehaviorUnspecified}
}
// NewSliceFromPatches returns a slice of resources given a patch path
// SliceFromPatches returns a slice of resources given a patch path
// slice from a kustomization file.
func NewSliceFromPatches(
ldr ifc.Loader, paths []patch.StrategicMerge,
decoder ifc.Decoder) ([]*Resource, error) {
func (rf *Factory) SliceFromPatches(
ldr ifc.Loader, paths []patch.StrategicMerge) ([]*Resource, error) {
var result []*Resource
for _, path := range paths {
content, err := ldr.Load(string(path))
if err != nil {
return nil, err
}
res, err := NewSliceFromBytes(content, decoder)
res, err := rf.SliceFromBytes(content)
if err != nil {
return nil, internal.Handler(err, string(path))
}
@@ -77,20 +84,26 @@ func NewSliceFromPatches(
return result, nil
}
// NewSliceFromBytes unmarshalls bytes into a Resource slice.
func NewSliceFromBytes(
in []byte, decoder ifc.Decoder) ([]*Resource, error) {
funStructs, err := k8sdeps.NewKunstructuredSliceFromBytes(in, decoder)
// SliceFromBytes unmarshalls bytes into a Resource slice.
func (rf *Factory) SliceFromBytes(in []byte) ([]*Resource, error) {
kunStructs, err := rf.kf.SliceFromBytes(in)
if err != nil {
return nil, err
}
var result []*Resource
for _, u := range funStructs {
result = append(result, NewFromKunstructured(u))
for _, u := range kunStructs {
result = append(result, rf.FromKunstructured(u))
}
return result, nil
}
// Resource is map representation of a Kubernetes API resource object
// paired with a GenerationBehavior.
type Resource struct {
ifc.Kunstructured
b ifc.GenerationBehavior
}
// String returns resource as JSON.
func (r *Resource) String() string {
bs, err := r.MarshalJSON()

View File

@@ -18,14 +18,17 @@ package resource
import (
"reflect"
"sigs.k8s.io/kustomize/internal/k8sdeps"
"testing"
"sigs.k8s.io/kustomize/internal/k8sdeps"
"sigs.k8s.io/kustomize/pkg/internal/loadertest"
"sigs.k8s.io/kustomize/pkg/patch"
)
var testConfigMap = NewFromMap(
var factory = NewFactory(
k8sdeps.NewKustKunstructuredFactory(k8sdeps.NewKustDecoder()))
var testConfigMap = factory.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -36,7 +39,7 @@ var testConfigMap = NewFromMap(
const testConfigMapString = `unspecified:{"apiVersion":"v1","kind":"ConfigMap","metadata":{"name":"winnie"}}`
var testDeployment = NewFromMap(
var testDeployment = factory.FromMap(
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
@@ -68,7 +71,8 @@ func TestResourceString(t *testing.T) {
}
}
func TestNewResourceSliceFromPatches(t *testing.T) {
func TestSliceFromPatches(t *testing.T) {
patchGood1 := patch.StrategicMerge("/foo/patch1.yaml")
patch1 := `
apiVersion: apps/v1
@@ -122,8 +126,7 @@ WOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOT: woot
},
}
for _, test := range tests {
rs, err := NewSliceFromPatches(
l, test.input, k8sdeps.NewKustDecoder())
rs, err := factory.SliceFromPatches(l, test.input)
if test.expectedErr && err == nil {
t.Fatalf("%v: should return error", test.name)
}

View File

@@ -47,12 +47,14 @@ type KustTarget struct {
hash ifc.Hash
ldr ifc.Loader
fSys fs.FileSystem
rf *resmap.Factory
tcfg *transformerconfig.TransformerConfig
}
// NewKustTarget returns a new instance of KustTarget primed with a Loader.
func NewKustTarget(
ldr ifc.Loader, fSys fs.FileSystem,
rf *resmap.Factory,
tcfg *transformerconfig.TransformerConfig,
d ifc.Decoder, h ifc.Hash) (*KustTarget, error) {
content, err := ldr.Load(constants.KustomizationFileName)
@@ -70,6 +72,7 @@ func NewKustTarget(
kustomization: &k,
ldr: ldr,
fSys: fSys,
rf: rf,
tcfg: tcfg,
decoder: d,
hash: h,
@@ -146,10 +149,10 @@ func (kt *KustTarget) loadCustomizedResMap() (resmap.ResMap, error) {
return nil, err
}
patches, err := resource.NewSliceFromPatches(
kt.ldr, kt.kustomization.PatchesStrategicMerge, kt.decoder)
patches, err := kt.rf.RF().SliceFromPatches(
kt.ldr, kt.kustomization.PatchesStrategicMerge)
if err != nil {
errs.Append(errors.Wrap(err, "NewSliceFromPatches"))
errs.Append(errors.Wrap(err, "SliceFromPatches"))
}
if len(errs.Get()) > 0 {
@@ -183,13 +186,13 @@ func (kt *KustTarget) loadCustomizedResMap() (resmap.ResMap, error) {
func (kt *KustTarget) generateConfigMapsAndSecrets(
errs *interror.KustomizationErrors) (resmap.ResMap, error) {
cms, err := resmap.NewResMapFromConfigMapArgs(
cms, err := kt.rf.NewResMapFromConfigMapArgs(
configmapandsecret.NewConfigMapFactory(kt.fSys, kt.ldr),
kt.kustomization.ConfigMapGenerator)
if err != nil {
errs.Append(errors.Wrap(err, "NewResMapFromConfigMapArgs"))
}
secrets, err := resmap.NewResMapFromSecretArgs(
secrets, err := kt.rf.NewResMapFromSecretArgs(
configmapandsecret.NewSecretFactory(kt.fSys, kt.ldr.Root()),
kt.kustomization.SecretGenerator)
if err != nil {
@@ -201,8 +204,8 @@ func (kt *KustTarget) generateConfigMapsAndSecrets(
// Gets Bases and Resources as advertised.
func (kt *KustTarget) loadResMapFromBasesAndResources() (resmap.ResMap, error) {
bases, errs := kt.loadCustomizedBases()
resources, err := resmap.NewResMapFromFiles(
kt.ldr, kt.kustomization.Resources, kt.decoder)
resources, err := kt.rf.FromFiles(
kt.ldr, kt.kustomization.Resources)
if err != nil {
errs.Append(errors.Wrap(err, "rawResources failed to read Resources"))
}
@@ -223,7 +226,8 @@ func (kt *KustTarget) loadCustomizedBases() (resmap.ResMap, *interror.Kustomizat
errs.Append(errors.Wrap(err, "couldn't make ldr for "+path))
continue
}
target, err := NewKustTarget(ldr, kt.fSys, kt.tcfg, kt.decoder, kt.hash)
target, err := NewKustTarget(
ldr, kt.fSys, kt.rf, kt.tcfg, kt.decoder, kt.hash)
if err != nil {
errs.Append(errors.Wrap(err, "couldn't make target for "+path))
continue
@@ -252,7 +256,8 @@ func (kt *KustTarget) loadBasesAsFlatList() ([]*KustTarget, error) {
errs.Append(err)
continue
}
target, err := NewKustTarget(ldr, kt.fSys, kt.tcfg, kt.decoder, kt.hash)
target, err := NewKustTarget(
ldr, kt.fSys, kt.rf, kt.tcfg, kt.decoder, kt.hash)
if err != nil {
errs.Append(err)
continue
@@ -268,7 +273,7 @@ func (kt *KustTarget) loadBasesAsFlatList() ([]*KustTarget, error) {
// newTransformer makes a Transformer that does everything except resolve generated names.
func (kt *KustTarget) newTransformer(patches []*resource.Resource) (transformers.Transformer, error) {
var r []transformers.Transformer
t, err := transformers.NewPatchTransformer(patches)
t, err := transformers.NewPatchTransformer(patches, kt.rf.RF())
if err != nil {
return nil, err
}

View File

@@ -88,6 +88,9 @@ metadata:
]`
)
var rf = resmap.NewFactory(resource.NewFactory(
k8sdeps.NewKustKunstructuredFactory(k8sdeps.NewKustDecoder())))
func makeLoader1(t *testing.T) ifc.Loader {
ldr := loadertest.NewFakeLoader("/testpath")
err := ldr.AddFile("/testpath/"+constants.KustomizationFileName, []byte(kustomizationContent1))
@@ -116,7 +119,7 @@ var ns = gvk.Gvk{Version: "v1", Kind: "Namespace"}
func TestResources1(t *testing.T) {
expected := resmap.ResMap{
resid.NewResIdWithPrefixNamespace(deploy, "dply1", "foo-", "ns1"): resource.NewFromMap(
resid.NewResIdWithPrefixNamespace(deploy, "dply1", "foo-", "ns1"): rf.RF().FromMap(
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
@@ -149,7 +152,7 @@ func TestResources1(t *testing.T) {
},
},
}),
resid.NewResIdWithPrefixNamespace(cmap, "literalConfigMap", "foo-", "ns1"): resource.NewFromMap(
resid.NewResIdWithPrefixNamespace(cmap, "literalConfigMap", "foo-", "ns1"): rf.RF().FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -168,7 +171,7 @@ func TestResources1(t *testing.T) {
"DB_PASSWORD": "somepw",
},
}).SetBehavior(ifc.BehaviorCreate),
resid.NewResIdWithPrefixNamespace(secret, "secret", "foo-", "ns1"): resource.NewFromMap(
resid.NewResIdWithPrefixNamespace(secret, "secret", "foo-", "ns1"): rf.RF().FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "Secret",
@@ -188,7 +191,7 @@ func TestResources1(t *testing.T) {
"DB_PASSWORD": base64.StdEncoding.EncodeToString([]byte("somepw")),
},
}).SetBehavior(ifc.BehaviorCreate),
resid.NewResIdWithPrefixNamespace(ns, "ns1", "foo-", ""): resource.NewFromMap(
resid.NewResIdWithPrefixNamespace(ns, "ns1", "foo-", ""): rf.RF().FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "Namespace",
@@ -207,7 +210,7 @@ func TestResources1(t *testing.T) {
fakeFs := fs.MakeFakeFS()
fakeFs.Mkdir("/")
kt, err := NewKustTarget(
l, fakeFs, transformerconfig.MakeDefaultTransformerConfig(),
l, fakeFs, rf, transformerconfig.MakeDefaultTransformerConfig(),
k8sdeps.NewKustDecoder(), k8sdeps.NewKustHash())
if err != nil {
t.Fatalf("unexpected construction error %v", err)
@@ -232,7 +235,7 @@ func TestResourceNotFound(t *testing.T) {
fakeFs := fs.MakeFakeFS()
fakeFs.Mkdir("/")
kt, err := NewKustTarget(
l, fakeFs, transformerconfig.MakeDefaultTransformerConfig(),
l, fakeFs, rf, transformerconfig.MakeDefaultTransformerConfig(),
k8sdeps.NewKustDecoder(), k8sdeps.NewKustHash())
if err != nil {
t.Fatalf("Unexpected construction error %v", err)
@@ -255,7 +258,7 @@ func TestSecretTimeout(t *testing.T) {
fakeFs := fs.MakeFakeFS()
fakeFs.Mkdir("/")
kt, err := NewKustTarget(
l, fakeFs, transformerconfig.MakeDefaultTransformerConfig(),
l, fakeFs, rf, transformerconfig.MakeDefaultTransformerConfig(),
k8sdeps.NewKustDecoder(), k8sdeps.NewKustHash())
if err != nil {
t.Fatalf("Unexpected construction error %v", err)

View File

@@ -18,18 +18,22 @@ package transformers
import (
"reflect"
"sigs.k8s.io/kustomize/pkg/resid"
"testing"
"sigs.k8s.io/kustomize/internal/k8sdeps"
"sigs.k8s.io/kustomize/pkg/gvk"
"sigs.k8s.io/kustomize/pkg/resid"
"sigs.k8s.io/kustomize/pkg/resmap"
"sigs.k8s.io/kustomize/pkg/resource"
"sigs.k8s.io/kustomize/pkg/types"
)
func TestImageTagTransformer(t *testing.T) {
var rf = resource.NewFactory(
k8sdeps.NewKustKunstructuredFactory(k8sdeps.NewKustDecoder()))
m := resmap.ResMap{
resid.NewResId(deploy, "deploy1"): resource.NewFromMap(
resid.NewResId(deploy, "deploy1"): rf.FromMap(
map[string]interface{}{
"group": "apps",
"apiVersion": "v1",
@@ -60,7 +64,7 @@ func TestImageTagTransformer(t *testing.T) {
},
},
}),
resid.NewResId(gvk.Gvk{Kind: "randomKind"}, "random"): resource.NewFromMap(
resid.NewResId(gvk.Gvk{Kind: "randomKind"}, "random"): rf.FromMap(
map[string]interface{}{
"spec": map[string]interface{}{
"template": map[string]interface{}{
@@ -97,7 +101,7 @@ func TestImageTagTransformer(t *testing.T) {
}),
}
expected := resmap.ResMap{
resid.NewResId(deploy, "deploy1"): resource.NewFromMap(
resid.NewResId(deploy, "deploy1"): rf.FromMap(
map[string]interface{}{
"group": "apps",
"apiVersion": "v1",
@@ -128,7 +132,7 @@ func TestImageTagTransformer(t *testing.T) {
},
},
}),
resid.NewResId(gvk.Gvk{Kind: "randomKind"}, "random"): resource.NewFromMap(
resid.NewResId(gvk.Gvk{Kind: "randomKind"}, "random"): rf.FromMap(
map[string]interface{}{
"spec": map[string]interface{}{
"template": map[string]interface{}{

View File

@@ -20,6 +20,7 @@ import (
"reflect"
"testing"
"sigs.k8s.io/kustomize/internal/k8sdeps"
"sigs.k8s.io/kustomize/pkg/gvk"
"sigs.k8s.io/kustomize/pkg/resid"
"sigs.k8s.io/kustomize/pkg/resmap"
@@ -41,10 +42,12 @@ var pvc = gvk.Gvk{Version: "v1", Kind: "PersistentVolumeClaim"}
var crb = gvk.Gvk{Group: "rbac.authorization.k8s.io", Version: "v1", Kind: "ClusterRoleBinding"}
var sa = gvk.Gvk{Version: "v1", Kind: "ServiceAccount"}
var ingress = gvk.Gvk{Kind: "Ingress"}
var rf = resource.NewFactory(
k8sdeps.NewKustKunstructuredFactory(k8sdeps.NewKustDecoder()))
func TestLabelsRun(t *testing.T) {
m := resmap.ResMap{
resid.NewResId(cmap, "cm1"): resource.NewFromMap(
resid.NewResId(cmap, "cm1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -52,7 +55,7 @@ func TestLabelsRun(t *testing.T) {
"name": "cm1",
},
}),
resid.NewResId(deploy, "deploy1"): resource.NewFromMap(
resid.NewResId(deploy, "deploy1"): rf.FromMap(
map[string]interface{}{
"group": "apps",
"apiVersion": "v1",
@@ -78,7 +81,7 @@ func TestLabelsRun(t *testing.T) {
},
},
}),
resid.NewResId(service, "svc1"): resource.NewFromMap(
resid.NewResId(service, "svc1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "Service",
@@ -94,7 +97,7 @@ func TestLabelsRun(t *testing.T) {
},
},
}),
resid.NewResId(job, "job1"): resource.NewFromMap(
resid.NewResId(job, "job1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "batch/v1",
"kind": "Job",
@@ -114,7 +117,7 @@ func TestLabelsRun(t *testing.T) {
},
},
}),
resid.NewResId(job, "job2"): resource.NewFromMap(
resid.NewResId(job, "job2"): rf.FromMap(
map[string]interface{}{
"apiVersion": "batch/v1",
"kind": "Job",
@@ -139,7 +142,7 @@ func TestLabelsRun(t *testing.T) {
},
},
}),
resid.NewResId(cronjob, "cronjob1"): resource.NewFromMap(
resid.NewResId(cronjob, "cronjob1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "batch/v1beta1",
"kind": "CronJob",
@@ -164,7 +167,7 @@ func TestLabelsRun(t *testing.T) {
},
},
}),
resid.NewResId(cronjob, "cronjob2"): resource.NewFromMap(
resid.NewResId(cronjob, "cronjob2"): rf.FromMap(
map[string]interface{}{
"apiVersion": "batch/v1beta1",
"kind": "CronJob",
@@ -196,7 +199,7 @@ func TestLabelsRun(t *testing.T) {
}),
}
expected := resmap.ResMap{
resid.NewResId(cmap, "cm1"): resource.NewFromMap(
resid.NewResId(cmap, "cm1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -208,7 +211,7 @@ func TestLabelsRun(t *testing.T) {
},
},
}),
resid.NewResId(deploy, "deploy1"): resource.NewFromMap(
resid.NewResId(deploy, "deploy1"): rf.FromMap(
map[string]interface{}{
"group": "apps",
"apiVersion": "v1",
@@ -246,7 +249,7 @@ func TestLabelsRun(t *testing.T) {
},
},
}),
resid.NewResId(service, "svc1"): resource.NewFromMap(
resid.NewResId(service, "svc1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "Service",
@@ -270,7 +273,7 @@ func TestLabelsRun(t *testing.T) {
},
},
}),
resid.NewResId(job, "job1"): resource.NewFromMap(
resid.NewResId(job, "job1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "batch/v1",
"kind": "Job",
@@ -300,7 +303,7 @@ func TestLabelsRun(t *testing.T) {
},
},
}),
resid.NewResId(job, "job2"): resource.NewFromMap(
resid.NewResId(job, "job2"): rf.FromMap(
map[string]interface{}{
"apiVersion": "batch/v1",
"kind": "Job",
@@ -337,7 +340,7 @@ func TestLabelsRun(t *testing.T) {
},
},
}),
resid.NewResId(cronjob, "cronjob1"): resource.NewFromMap(
resid.NewResId(cronjob, "cronjob1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "batch/v1beta1",
"kind": "CronJob",
@@ -372,7 +375,7 @@ func TestLabelsRun(t *testing.T) {
},
},
}),
resid.NewResId(cronjob, "cronjob2"): resource.NewFromMap(
resid.NewResId(cronjob, "cronjob2"): rf.FromMap(
map[string]interface{}{
"apiVersion": "batch/v1beta1",
"kind": "CronJob",
@@ -433,7 +436,7 @@ func TestLabelsRun(t *testing.T) {
func TestAnnotationsRun(t *testing.T) {
m := resmap.ResMap{
resid.NewResId(cmap, "cm1"): resource.NewFromMap(
resid.NewResId(cmap, "cm1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -441,7 +444,7 @@ func TestAnnotationsRun(t *testing.T) {
"name": "cm1",
},
}),
resid.NewResId(deploy, "deploy1"): resource.NewFromMap(
resid.NewResId(deploy, "deploy1"): rf.FromMap(
map[string]interface{}{
"group": "apps",
"apiVersion": "v1",
@@ -467,7 +470,7 @@ func TestAnnotationsRun(t *testing.T) {
},
},
}),
resid.NewResId(service, "svc1"): resource.NewFromMap(
resid.NewResId(service, "svc1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "Service",
@@ -485,7 +488,7 @@ func TestAnnotationsRun(t *testing.T) {
}),
}
expected := resmap.ResMap{
resid.NewResId(cmap, "cm1"): resource.NewFromMap(
resid.NewResId(cmap, "cm1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -497,7 +500,7 @@ func TestAnnotationsRun(t *testing.T) {
},
},
}),
resid.NewResId(deploy, "deploy1"): resource.NewFromMap(
resid.NewResId(deploy, "deploy1"): rf.FromMap(
map[string]interface{}{
"group": "apps",
"apiVersion": "v1",
@@ -531,7 +534,7 @@ func TestAnnotationsRun(t *testing.T) {
},
},
}),
resid.NewResId(service, "svc1"): resource.NewFromMap(
resid.NewResId(service, "svc1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "Service",

View File

@@ -18,6 +18,7 @@ package transformers
import (
"fmt"
"sigs.k8s.io/kustomize/pkg/resource"
"sigs.k8s.io/kustomize/pkg/resmap"
)
@@ -26,6 +27,7 @@ import (
type multiTransformer struct {
transformers []Transformer
checkConflictEnabled bool
rf *resource.Factory
}
var _ Transformer = &multiTransformer{}
@@ -69,7 +71,7 @@ func (o *multiTransformer) transform(m resmap.ResMap) error {
// A spot check to perform when the transformations are supposed to be commutative.
// Fail if there's a difference in the result.
func (o *multiTransformer) transformWithCheckConflict(m resmap.ResMap) error {
mcopy := m.DeepCopy()
mcopy := m.DeepCopy(o.rf)
err := o.transform(m)
if err != nil {
return err

View File

@@ -28,8 +28,10 @@ import (
)
func TestNameHashTransformer(t *testing.T) {
rf := resource.NewFactory(
k8sdeps.NewKustKunstructuredFactory(k8sdeps.NewKustDecoder()))
objs := resmap.ResMap{
resid.NewResId(cmap, "cm1"): resource.NewFromMap(
resid.NewResId(cmap, "cm1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -37,7 +39,7 @@ func TestNameHashTransformer(t *testing.T) {
"name": "cm1",
},
}),
resid.NewResId(deploy, "deploy1"): resource.NewFromMap(
resid.NewResId(deploy, "deploy1"): rf.FromMap(
map[string]interface{}{
"group": "apps",
"apiVersion": "v1",
@@ -63,7 +65,7 @@ func TestNameHashTransformer(t *testing.T) {
},
},
}),
resid.NewResId(service, "svc1"): resource.NewFromMap(
resid.NewResId(service, "svc1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "Service",
@@ -79,7 +81,7 @@ func TestNameHashTransformer(t *testing.T) {
},
},
}),
resid.NewResId(secret, "secret1"): resource.NewFromMap(
resid.NewResId(secret, "secret1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "Secret",
@@ -90,7 +92,7 @@ func TestNameHashTransformer(t *testing.T) {
}
expected := resmap.ResMap{
resid.NewResId(cmap, "cm1"): resource.NewFromMap(
resid.NewResId(cmap, "cm1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -98,7 +100,7 @@ func TestNameHashTransformer(t *testing.T) {
"name": "cm1",
},
}),
resid.NewResId(deploy, "deploy1"): resource.NewFromMap(
resid.NewResId(deploy, "deploy1"): rf.FromMap(
map[string]interface{}{
"group": "apps",
"apiVersion": "v1",
@@ -124,7 +126,7 @@ func TestNameHashTransformer(t *testing.T) {
},
},
}),
resid.NewResId(service, "svc1"): resource.NewFromMap(
resid.NewResId(service, "svc1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "Service",
@@ -140,7 +142,7 @@ func TestNameHashTransformer(t *testing.T) {
},
},
}),
resid.NewResId(secret, "secret1"): resource.NewFromMap(
resid.NewResId(secret, "secret1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "Secret",

View File

@@ -20,6 +20,7 @@ import (
"reflect"
"testing"
"sigs.k8s.io/kustomize/internal/k8sdeps"
"sigs.k8s.io/kustomize/pkg/resid"
"sigs.k8s.io/kustomize/pkg/resmap"
"sigs.k8s.io/kustomize/pkg/resource"
@@ -27,8 +28,10 @@ import (
)
func TestNameReferenceRun(t *testing.T) {
rf := resource.NewFactory(
k8sdeps.NewKustKunstructuredFactory(k8sdeps.NewKustDecoder()))
m := resmap.ResMap{
resid.NewResId(cmap, "cm1"): resource.NewFromMap(
resid.NewResId(cmap, "cm1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -36,7 +39,7 @@ func TestNameReferenceRun(t *testing.T) {
"name": "someprefix-cm1-somehash",
},
}),
resid.NewResId(cmap, "cm2"): resource.NewFromMap(
resid.NewResId(cmap, "cm2"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -44,7 +47,7 @@ func TestNameReferenceRun(t *testing.T) {
"name": "someprefix-cm2-somehash",
},
}),
resid.NewResId(secret, "secret1"): resource.NewFromMap(
resid.NewResId(secret, "secret1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "Secret",
@@ -52,7 +55,7 @@ func TestNameReferenceRun(t *testing.T) {
"name": "someprefix-secret1-somehash",
},
}),
resid.NewResId(pvc, "claim1"): resource.NewFromMap(
resid.NewResId(pvc, "claim1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "PersistentVolumeClaim",
@@ -60,7 +63,7 @@ func TestNameReferenceRun(t *testing.T) {
"name": "someprefix-claim1",
},
}),
resid.NewResId(ingress, "ingress1"): resource.NewFromMap(
resid.NewResId(ingress, "ingress1"): rf.FromMap(
map[string]interface{}{
"group": "extensions",
"apiVersion": "v1beta1",
@@ -80,7 +83,7 @@ func TestNameReferenceRun(t *testing.T) {
},
},
),
resid.NewResId(deploy, "deploy1"): resource.NewFromMap(
resid.NewResId(deploy, "deploy1"): rf.FromMap(
map[string]interface{}{
"group": "apps",
"apiVersion": "v1",
@@ -158,7 +161,7 @@ func TestNameReferenceRun(t *testing.T) {
},
},
}),
resid.NewResId(statefulset, "statefulset1"): resource.NewFromMap(
resid.NewResId(statefulset, "statefulset1"): rf.FromMap(
map[string]interface{}{
"group": "apps",
"apiVersion": "v1",
@@ -195,7 +198,7 @@ func TestNameReferenceRun(t *testing.T) {
expected[k] = v
}
expected[resid.NewResId(deploy, "deploy1")] = resource.NewFromMap(
expected[resid.NewResId(deploy, "deploy1")] = rf.FromMap(
map[string]interface{}{
"group": "apps",
"apiVersion": "v1",
@@ -273,7 +276,7 @@ func TestNameReferenceRun(t *testing.T) {
},
},
})
expected[resid.NewResId(statefulset, "statefulset1")] = resource.NewFromMap(
expected[resid.NewResId(statefulset, "statefulset1")] = rf.FromMap(
map[string]interface{}{
"group": "apps",
"apiVersion": "v1",
@@ -303,7 +306,7 @@ func TestNameReferenceRun(t *testing.T) {
},
},
})
expected[resid.NewResId(ingress, "ingress1")] = resource.NewFromMap(
expected[resid.NewResId(ingress, "ingress1")] = rf.FromMap(
map[string]interface{}{
"group": "extensions",
"apiVersion": "v1beta1",

View File

@@ -20,6 +20,7 @@ import (
"reflect"
"testing"
"sigs.k8s.io/kustomize/internal/k8sdeps"
"sigs.k8s.io/kustomize/pkg/resid"
"sigs.k8s.io/kustomize/pkg/resmap"
"sigs.k8s.io/kustomize/pkg/resource"
@@ -27,8 +28,10 @@ import (
)
func TestNamespaceRun(t *testing.T) {
rf := resource.NewFactory(
k8sdeps.NewKustKunstructuredFactory(k8sdeps.NewKustDecoder()))
m := resmap.ResMap{
resid.NewResId(cmap, "cm1"): resource.NewFromMap(
resid.NewResId(cmap, "cm1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -36,7 +39,7 @@ func TestNamespaceRun(t *testing.T) {
"name": "cm1",
},
}),
resid.NewResId(cmap, "cm2"): resource.NewFromMap(
resid.NewResId(cmap, "cm2"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -45,7 +48,7 @@ func TestNamespaceRun(t *testing.T) {
"namespace": "foo",
},
}),
resid.NewResId(ns, "ns1"): resource.NewFromMap(
resid.NewResId(ns, "ns1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "Namespace",
@@ -53,7 +56,7 @@ func TestNamespaceRun(t *testing.T) {
"name": "ns1",
},
}),
resid.NewResId(sa, "default"): resource.NewFromMap(
resid.NewResId(sa, "default"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ServiceAccount",
@@ -62,7 +65,7 @@ func TestNamespaceRun(t *testing.T) {
"namespace": "system",
},
}),
resid.NewResId(sa, "service-account"): resource.NewFromMap(
resid.NewResId(sa, "service-account"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ServiceAccount",
@@ -71,7 +74,7 @@ func TestNamespaceRun(t *testing.T) {
"namespace": "system",
},
}),
resid.NewResId(crb, "crb"): resource.NewFromMap(
resid.NewResId(crb, "crb"): rf.FromMap(
map[string]interface{}{
"apiVersion": "rbac.authorization.k8s.io/v1",
"kind": "ClusterRoleBinding",
@@ -96,7 +99,7 @@ func TestNamespaceRun(t *testing.T) {
},
},
}),
resid.NewResId(crd, "crd"): resource.NewFromMap(
resid.NewResId(crd, "crd"): rf.FromMap(
map[string]interface{}{
"apiVersion": "apiextensions.k8s.io/v1beta1",
"kind": "CustomResourceDefinition",
@@ -106,7 +109,7 @@ func TestNamespaceRun(t *testing.T) {
}),
}
expected := resmap.ResMap{
resid.NewResIdWithPrefixNamespace(ns, "ns1", "", ""): resource.NewFromMap(
resid.NewResIdWithPrefixNamespace(ns, "ns1", "", ""): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "Namespace",
@@ -114,7 +117,7 @@ func TestNamespaceRun(t *testing.T) {
"name": "ns1",
},
}),
resid.NewResIdWithPrefixNamespace(cmap, "cm1", "", "test"): resource.NewFromMap(
resid.NewResIdWithPrefixNamespace(cmap, "cm1", "", "test"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -123,7 +126,7 @@ func TestNamespaceRun(t *testing.T) {
"namespace": "test",
},
}),
resid.NewResIdWithPrefixNamespace(cmap, "cm2", "", "test"): resource.NewFromMap(
resid.NewResIdWithPrefixNamespace(cmap, "cm2", "", "test"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -132,7 +135,7 @@ func TestNamespaceRun(t *testing.T) {
"namespace": "test",
},
}),
resid.NewResIdWithPrefixNamespace(sa, "default", "", "test"): resource.NewFromMap(
resid.NewResIdWithPrefixNamespace(sa, "default", "", "test"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ServiceAccount",
@@ -141,7 +144,7 @@ func TestNamespaceRun(t *testing.T) {
"namespace": "test",
},
}),
resid.NewResIdWithPrefixNamespace(sa, "service-account", "", "test"): resource.NewFromMap(
resid.NewResIdWithPrefixNamespace(sa, "service-account", "", "test"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ServiceAccount",
@@ -150,7 +153,7 @@ func TestNamespaceRun(t *testing.T) {
"namespace": "test",
},
}),
resid.NewResId(crb, "crb"): resource.NewFromMap(
resid.NewResId(crb, "crb"): rf.FromMap(
map[string]interface{}{
"apiVersion": "rbac.authorization.k8s.io/v1",
"kind": "ClusterRoleBinding",
@@ -175,7 +178,7 @@ func TestNamespaceRun(t *testing.T) {
},
},
}),
resid.NewResId(crd, "crd"): resource.NewFromMap(
resid.NewResId(crd, "crd"): rf.FromMap(
map[string]interface{}{
"apiVersion": "apiextensions.k8s.io/v1beta1",
"kind": "CustomResourceDefinition",

View File

@@ -31,16 +31,18 @@ import (
// patchTransformer applies patches.
type patchTransformer struct {
patches []*resource.Resource
rf *resource.Factory
}
var _ Transformer = &patchTransformer{}
// NewPatchTransformer constructs a patchTransformer.
func NewPatchTransformer(slice []*resource.Resource) (Transformer, error) {
func NewPatchTransformer(
slice []*resource.Resource, rf *resource.Factory) (Transformer, error) {
if len(slice) == 0 {
return NewNoOpTransformer(), nil
}
return &patchTransformer{slice}, nil
return &patchTransformer{patches: slice, rf: rf}, nil
}
// Transform apply the patches on top of the base resources.
@@ -129,9 +131,9 @@ func (pt *patchTransformer) mergePatches() (resmap.ResMap, error) {
}
var cd conflictDetector
if err != nil {
cd = newJMPConflictDetector()
cd = newJMPConflictDetector(pt.rf)
} else {
cd, err = newSMPConflictDetector(versionedObj)
cd, err = newSMPConflictDetector(versionedObj, pt.rf)
if err != nil {
return nil, err
}

View File

@@ -21,14 +21,17 @@ import (
"strings"
"testing"
"sigs.k8s.io/kustomize/internal/k8sdeps"
"sigs.k8s.io/kustomize/pkg/resid"
"sigs.k8s.io/kustomize/pkg/resmap"
"sigs.k8s.io/kustomize/pkg/resource"
)
func TestOverlayRun(t *testing.T) {
rf := resource.NewFactory(
k8sdeps.NewKustKunstructuredFactory(k8sdeps.NewKustDecoder()))
base := resmap.ResMap{
resid.NewResId(deploy, "deploy1"): resource.NewFromMap(
resid.NewResId(deploy, "deploy1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
@@ -55,7 +58,7 @@ func TestOverlayRun(t *testing.T) {
}),
}
patch := []*resource.Resource{
resource.NewFromMap(map[string]interface{}{
rf.FromMap(map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": map[string]interface{}{
@@ -88,7 +91,7 @@ func TestOverlayRun(t *testing.T) {
),
}
expected := resmap.ResMap{
resid.NewResId(deploy, "deploy1"): resource.NewFromMap(
resid.NewResId(deploy, "deploy1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
@@ -121,7 +124,7 @@ func TestOverlayRun(t *testing.T) {
},
}),
}
lt, err := NewPatchTransformer(patch)
lt, err := NewPatchTransformer(patch, rf)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
@@ -137,7 +140,7 @@ func TestOverlayRun(t *testing.T) {
func TestMultiplePatches(t *testing.T) {
base := resmap.ResMap{
resid.NewResId(deploy, "deploy1"): resource.NewFromMap(
resid.NewResId(deploy, "deploy1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
@@ -159,7 +162,7 @@ func TestMultiplePatches(t *testing.T) {
}),
}
patch := []*resource.Resource{
resource.NewFromMap(map[string]interface{}{
rf.FromMap(map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": map[string]interface{}{
@@ -185,7 +188,7 @@ func TestMultiplePatches(t *testing.T) {
},
},
),
resource.NewFromMap(map[string]interface{}{
rf.FromMap(map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": map[string]interface{}{
@@ -216,7 +219,7 @@ func TestMultiplePatches(t *testing.T) {
),
}
expected := resmap.ResMap{
resid.NewResId(deploy, "deploy1"): resource.NewFromMap(
resid.NewResId(deploy, "deploy1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
@@ -251,7 +254,7 @@ func TestMultiplePatches(t *testing.T) {
},
}),
}
lt, err := NewPatchTransformer(patch)
lt, err := NewPatchTransformer(patch, rf)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
@@ -267,7 +270,7 @@ func TestMultiplePatches(t *testing.T) {
func TestMultiplePatchesWithConflict(t *testing.T) {
base := resmap.ResMap{
resid.NewResId(deploy, "deploy1"): resource.NewFromMap(
resid.NewResId(deploy, "deploy1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
@@ -289,7 +292,7 @@ func TestMultiplePatchesWithConflict(t *testing.T) {
}),
}
patch := []*resource.Resource{
resource.NewFromMap(map[string]interface{}{
rf.FromMap(map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": map[string]interface{}{
@@ -315,7 +318,7 @@ func TestMultiplePatchesWithConflict(t *testing.T) {
},
},
),
resource.NewFromMap(map[string]interface{}{
rf.FromMap(map[string]interface{}{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": map[string]interface{}{
@@ -337,7 +340,7 @@ func TestMultiplePatchesWithConflict(t *testing.T) {
),
}
lt, err := NewPatchTransformer(patch)
lt, err := NewPatchTransformer(patch, rf)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
@@ -352,7 +355,7 @@ func TestMultiplePatchesWithConflict(t *testing.T) {
func TestNoSchemaOverlayRun(t *testing.T) {
base := resmap.ResMap{
resid.NewResId(foo, "my-foo"): resource.NewFromMap(
resid.NewResId(foo, "my-foo"): rf.FromMap(
map[string]interface{}{
"apiVersion": "example.com/v1",
"kind": "Foo",
@@ -368,7 +371,7 @@ func TestNoSchemaOverlayRun(t *testing.T) {
}),
}
patch := []*resource.Resource{
resource.NewFromMap(map[string]interface{}{
rf.FromMap(map[string]interface{}{
"apiVersion": "example.com/v1",
"kind": "Foo",
"metadata": map[string]interface{}{
@@ -384,7 +387,7 @@ func TestNoSchemaOverlayRun(t *testing.T) {
),
}
expected := resmap.ResMap{
resid.NewResId(foo, "my-foo"): resource.NewFromMap(
resid.NewResId(foo, "my-foo"): rf.FromMap(
map[string]interface{}{
"apiVersion": "example.com/v1",
"kind": "Foo",
@@ -400,7 +403,7 @@ func TestNoSchemaOverlayRun(t *testing.T) {
}),
}
lt, err := NewPatchTransformer(patch)
lt, err := NewPatchTransformer(patch, rf)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
@@ -415,7 +418,7 @@ func TestNoSchemaOverlayRun(t *testing.T) {
func TestNoSchemaMultiplePatches(t *testing.T) {
base := resmap.ResMap{
resid.NewResId(foo, "my-foo"): resource.NewFromMap(
resid.NewResId(foo, "my-foo"): rf.FromMap(
map[string]interface{}{
"apiVersion": "example.com/v1",
"kind": "Foo",
@@ -431,7 +434,7 @@ func TestNoSchemaMultiplePatches(t *testing.T) {
}),
}
patch := []*resource.Resource{
resource.NewFromMap(map[string]interface{}{
rf.FromMap(map[string]interface{}{
"apiVersion": "example.com/v1",
"kind": "Foo",
"metadata": map[string]interface{}{
@@ -445,7 +448,7 @@ func TestNoSchemaMultiplePatches(t *testing.T) {
},
},
),
resource.NewFromMap(map[string]interface{}{
rf.FromMap(map[string]interface{}{
"apiVersion": "example.com/v1",
"kind": "Foo",
"metadata": map[string]interface{}{
@@ -464,7 +467,7 @@ func TestNoSchemaMultiplePatches(t *testing.T) {
),
}
expected := resmap.ResMap{
resid.NewResId(foo, "my-foo"): resource.NewFromMap(
resid.NewResId(foo, "my-foo"): rf.FromMap(
map[string]interface{}{
"apiVersion": "example.com/v1",
"kind": "Foo",
@@ -484,7 +487,7 @@ func TestNoSchemaMultiplePatches(t *testing.T) {
}),
}
lt, err := NewPatchTransformer(patch)
lt, err := NewPatchTransformer(patch, rf)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
@@ -499,7 +502,7 @@ func TestNoSchemaMultiplePatches(t *testing.T) {
func TestNoSchemaMultiplePatchesWithConflict(t *testing.T) {
base := resmap.ResMap{
resid.NewResId(foo, "my-foo"): resource.NewFromMap(
resid.NewResId(foo, "my-foo"): rf.FromMap(
map[string]interface{}{
"apiVersion": "example.com/v1",
"kind": "Foo",
@@ -515,7 +518,7 @@ func TestNoSchemaMultiplePatchesWithConflict(t *testing.T) {
}),
}
patch := []*resource.Resource{
resource.NewFromMap(map[string]interface{}{
rf.FromMap(map[string]interface{}{
"apiVersion": "example.com/v1",
"kind": "Foo",
"metadata": map[string]interface{}{
@@ -528,7 +531,7 @@ func TestNoSchemaMultiplePatchesWithConflict(t *testing.T) {
},
},
}),
resource.NewFromMap(map[string]interface{}{
rf.FromMap(map[string]interface{}{
"apiVersion": "example.com/v1",
"kind": "Foo",
"metadata": map[string]interface{}{
@@ -542,7 +545,7 @@ func TestNoSchemaMultiplePatchesWithConflict(t *testing.T) {
}),
}
lt, err := NewPatchTransformer(patch)
lt, err := NewPatchTransformer(patch, rf)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}

View File

@@ -18,6 +18,7 @@ package transformers
import (
"encoding/json"
"github.com/evanphx/json-patch"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/mergepatch"
@@ -31,12 +32,14 @@ type conflictDetector interface {
mergePatches(patch1, patch2 *resource.Resource) (*resource.Resource, error)
}
type jsonMergePatch struct{}
type jsonMergePatch struct {
rf *resource.Factory
}
var _ conflictDetector = &jsonMergePatch{}
func newJMPConflictDetector() conflictDetector {
return &jsonMergePatch{}
func newJMPConflictDetector(rf *resource.Factory) conflictDetector {
return &jsonMergePatch{rf: rf}
}
func (jmp *jsonMergePatch) hasConflict(
@@ -82,18 +85,21 @@ func (jmp *jsonMergePatch) mergePatches(
}
mergedMap := make(map[string]interface{})
err = json.Unmarshal(mergedBytes, &mergedMap)
return resource.NewFromMap(mergedMap), err
return jmp.rf.FromMap(mergedMap), err
}
type strategicMergePatch struct {
lookupPatchMeta strategicpatch.LookupPatchMeta
rf *resource.Factory
}
var _ conflictDetector = &strategicMergePatch{}
func newSMPConflictDetector(versionedObj runtime.Object) (conflictDetector, error) {
func newSMPConflictDetector(
versionedObj runtime.Object,
rf *resource.Factory) (conflictDetector, error) {
lookupPatchMeta, err := strategicpatch.NewPatchMetaFromStruct(versionedObj)
return &strategicMergePatch{lookupPatchMeta: lookupPatchMeta}, err
return &strategicMergePatch{lookupPatchMeta: lookupPatchMeta, rf: rf}, err
}
func (smp *strategicMergePatch) hasConflict(p1, p2 *resource.Resource) (bool, error) {
@@ -127,5 +133,5 @@ func (smp *strategicMergePatch) findConflict(
func (smp *strategicMergePatch) mergePatches(patch1, patch2 *resource.Resource) (*resource.Resource, error) {
mergeJsonMap, err := strategicpatch.MergeStrategicMergeMapPatchUsingLookupPatchMeta(
smp.lookupPatchMeta, patch1.Map(), patch2.Map())
return resource.NewFromMap(mergeJsonMap), err
return smp.rf.FromMap(mergeJsonMap), err
}

View File

@@ -20,6 +20,7 @@ import (
"reflect"
"testing"
"sigs.k8s.io/kustomize/internal/k8sdeps"
"sigs.k8s.io/kustomize/pkg/resid"
"sigs.k8s.io/kustomize/pkg/resmap"
"sigs.k8s.io/kustomize/pkg/resource"
@@ -27,8 +28,10 @@ import (
)
func TestPrefixNameRun(t *testing.T) {
rf := resource.NewFactory(
k8sdeps.NewKustKunstructuredFactory(k8sdeps.NewKustDecoder()))
m := resmap.ResMap{
resid.NewResId(cmap, "cm1"): resource.NewFromMap(
resid.NewResId(cmap, "cm1"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -36,7 +39,7 @@ func TestPrefixNameRun(t *testing.T) {
"name": "cm1",
},
}),
resid.NewResId(cmap, "cm2"): resource.NewFromMap(
resid.NewResId(cmap, "cm2"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -44,7 +47,7 @@ func TestPrefixNameRun(t *testing.T) {
"name": "cm2",
},
}),
resid.NewResId(crd, "crd"): resource.NewFromMap(
resid.NewResId(crd, "crd"): rf.FromMap(
map[string]interface{}{
"apiVersion": "apiextensions.k8s.io/v1beta1",
"kind": "CustomResourceDefinition",
@@ -54,7 +57,7 @@ func TestPrefixNameRun(t *testing.T) {
}),
}
expected := resmap.ResMap{
resid.NewResIdWithPrefix(cmap, "cm1", "someprefix-"): resource.NewFromMap(
resid.NewResIdWithPrefix(cmap, "cm1", "someprefix-"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -62,7 +65,7 @@ func TestPrefixNameRun(t *testing.T) {
"name": "someprefix-cm1",
},
}),
resid.NewResIdWithPrefix(cmap, "cm2", "someprefix-"): resource.NewFromMap(
resid.NewResIdWithPrefix(cmap, "cm2", "someprefix-"): rf.FromMap(
map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
@@ -70,7 +73,7 @@ func TestPrefixNameRun(t *testing.T) {
"name": "someprefix-cm2",
},
}),
resid.NewResId(crd, "crd"): resource.NewFromMap(
resid.NewResId(crd, "crd"): rf.FromMap(
map[string]interface{}{
"apiVersion": "apiextensions.k8s.io/v1beta1",
"kind": "CustomResourceDefinition",