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

@@ -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 {