Skip to content

Commit 8405743

Browse files
committed
Combine generatorArgs and generatorOptions into options of Resource
1 parent b6d4101 commit 8405743

File tree

14 files changed

+201
-76
lines changed

14 files changed

+201
-76
lines changed

k8sdeps/transformer/hash/namehash.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func NewNameHashTransformer() transformers.Transformer {
3535
// Transform appends hash to generated resources.
3636
func (o *nameHashTransformer) Transform(m resmap.ResMap) error {
3737
for _, res := range m {
38-
if res.IsGenerated() {
38+
if res.NeedHashSuffix() {
3939
h, err := NewKustHash().Hash(res.Map())
4040
if err != nil {
4141
return err

k8sdeps/transformer/hash/namehash_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ import (
2121
"testing"
2222

2323
"sigs.k8s.io/kustomize/k8sdeps/kunstruct"
24-
"sigs.k8s.io/kustomize/pkg/ifc"
2524
"sigs.k8s.io/kustomize/pkg/resid"
2625
"sigs.k8s.io/kustomize/pkg/resmap"
2726
"sigs.k8s.io/kustomize/pkg/resource"
27+
"sigs.k8s.io/kustomize/pkg/types"
2828
)
2929

3030
func TestNameHashTransformer(t *testing.T) {
@@ -81,14 +81,14 @@ func TestNameHashTransformer(t *testing.T) {
8181
},
8282
},
8383
}),
84-
resid.NewResId(secret, "secret1"): rf.FromMap(
84+
resid.NewResId(secret, "secret1"): rf.FromMapAndOption(
8585
map[string]interface{}{
8686
"apiVersion": "v1",
8787
"kind": "Secret",
8888
"metadata": map[string]interface{}{
8989
"name": "secret1",
9090
},
91-
}).SetBehavior(ifc.BehaviorCreate),
91+
}, &types.GeneratorArgs{Behavior: "create"}, &types.GeneratorOptions{DisableNameSuffixHash: false}),
9292
}
9393

9494
expected := resmap.ResMap{
@@ -142,14 +142,14 @@ func TestNameHashTransformer(t *testing.T) {
142142
},
143143
},
144144
}),
145-
resid.NewResId(secret, "secret1"): rf.FromMap(
145+
resid.NewResId(secret, "secret1"): rf.FromMapAndOption(
146146
map[string]interface{}{
147147
"apiVersion": "v1",
148148
"kind": "Secret",
149149
"metadata": map[string]interface{}{
150150
"name": "secret1-7kc45hd5f7",
151151
},
152-
}).SetBehavior(ifc.BehaviorCreate),
152+
}, &types.GeneratorArgs{Behavior: "create"}, &types.GeneratorOptions{DisableNameSuffixHash: false}),
153153
}
154154

155155
tran := NewNameHashTransformer()

pkg/resmap/factory_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ func TestNewFromConfigMaps(t *testing.T) {
162162
filepath: "/whatever/project/app.env",
163163
content: "DB_USERNAME=admin\nDB_PASSWORD=somepw",
164164
expected: ResMap{
165-
resid.NewResId(cmap, "envConfigMap"): rf.FromMap(
165+
resid.NewResId(cmap, "envConfigMap"): rf.FromMapAndOption(
166166
map[string]interface{}{
167167
"apiVersion": "v1",
168168
"kind": "ConfigMap",
@@ -173,7 +173,7 @@ func TestNewFromConfigMaps(t *testing.T) {
173173
"DB_USERNAME": "admin",
174174
"DB_PASSWORD": "somepw",
175175
},
176-
}).SetBehavior(ifc.BehaviorCreate),
176+
}, &types.GeneratorArgs{}, nil),
177177
},
178178
},
179179
{
@@ -190,7 +190,7 @@ func TestNewFromConfigMaps(t *testing.T) {
190190
filepath: "/whatever/project/app-init.ini",
191191
content: "FOO=bar\nBAR=baz\n",
192192
expected: ResMap{
193-
resid.NewResId(cmap, "fileConfigMap"): rf.FromMap(
193+
resid.NewResId(cmap, "fileConfigMap"): rf.FromMapAndOption(
194194
map[string]interface{}{
195195
"apiVersion": "v1",
196196
"kind": "ConfigMap",
@@ -202,7 +202,7 @@ func TestNewFromConfigMaps(t *testing.T) {
202202
BAR=baz
203203
`,
204204
},
205-
}).SetBehavior(ifc.BehaviorCreate),
205+
}, &types.GeneratorArgs{}, nil),
206206
},
207207
},
208208
{
@@ -218,7 +218,7 @@ BAR=baz
218218
},
219219
},
220220
expected: ResMap{
221-
resid.NewResId(cmap, "literalConfigMap"): rf.FromMap(
221+
resid.NewResId(cmap, "literalConfigMap"): rf.FromMapAndOption(
222222
map[string]interface{}{
223223
"apiVersion": "v1",
224224
"kind": "ConfigMap",
@@ -231,7 +231,7 @@ BAR=baz
231231
"c": "Good Morning",
232232
"d": "false",
233233
},
234-
}).SetBehavior(ifc.BehaviorCreate),
234+
}, &types.GeneratorArgs{}, nil),
235235
},
236236
},
237237
// TODO: add testcase for data coming from multiple sources like
@@ -279,7 +279,7 @@ func TestNewResMapFromSecretArgs(t *testing.T) {
279279
}
280280

281281
expected := ResMap{
282-
resid.NewResId(secret, "apple"): rf.FromMap(
282+
resid.NewResId(secret, "apple"): rf.FromMapAndOption(
283283
map[string]interface{}{
284284
"apiVersion": "v1",
285285
"kind": "Secret",
@@ -291,7 +291,7 @@ func TestNewResMapFromSecretArgs(t *testing.T) {
291291
"DB_USERNAME": base64.StdEncoding.EncodeToString([]byte("admin")),
292292
"DB_PASSWORD": base64.StdEncoding.EncodeToString([]byte("somepw")),
293293
},
294-
}).SetBehavior(ifc.BehaviorCreate),
294+
}, &types.GeneratorArgs{}, nil),
295295
}
296296
if !reflect.DeepEqual(actual, expected) {
297297
t.Fatalf("%#v\ndoesn't match expected:\n%#v", actual, expected)

pkg/resmap/resmap.go

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ import (
2424
"sort"
2525

2626
"github.com/ghodss/yaml"
27-
"sigs.k8s.io/kustomize/pkg/ifc"
2827
"sigs.k8s.io/kustomize/pkg/resid"
2928
"sigs.k8s.io/kustomize/pkg/resource"
29+
"sigs.k8s.io/kustomize/pkg/types"
3030
)
3131

3232
// ResMap is a map from ResId to Resource.
@@ -114,8 +114,7 @@ func (m ResMap) ErrorIfNotEqual(m2 ResMap) error {
114114
func (m ResMap) DeepCopy(rf *resource.Factory) ResMap {
115115
mcopy := make(ResMap)
116116
for id, obj := range m {
117-
mcopy[id] = rf.FromKunstructured(obj.Copy())
118-
mcopy[id].SetBehavior(obj.Behavior())
117+
mcopy[id] = obj.DeepCopy()
119118
}
120119
return mcopy
121120
}
@@ -182,20 +181,18 @@ func MergeWithOverride(maps ...ResMap) (ResMap, error) {
182181
if len(matchedId) == 1 {
183182
id = matchedId[0]
184183
switch r.Behavior() {
185-
case ifc.BehaviorReplace:
184+
case types.BehaviorReplace:
186185
r.Replace(result[id])
187186
result[id] = r
188-
result[id].SetBehavior(ifc.BehaviorCreate)
189-
case ifc.BehaviorMerge:
187+
case types.BehaviorMerge:
190188
r.Merge(result[id])
191189
result[id] = r
192-
result[id].SetBehavior(ifc.BehaviorCreate)
193190
default:
194191
return nil, fmt.Errorf("id %#v exists; must merge or replace", id)
195192
}
196193
} else if len(matchedId) == 0 {
197194
switch r.Behavior() {
198-
case ifc.BehaviorMerge, ifc.BehaviorReplace:
195+
case types.BehaviorMerge, types.BehaviorReplace:
199196
return nil, fmt.Errorf("id %#v does not exist; cannot merge or replace", id)
200197
default:
201198
result[id] = r

pkg/resmap/resmap_test.go

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import (
2222

2323
"sigs.k8s.io/kustomize/k8sdeps/kunstruct"
2424
"sigs.k8s.io/kustomize/pkg/gvk"
25-
"sigs.k8s.io/kustomize/pkg/ifc"
2625
"sigs.k8s.io/kustomize/pkg/resid"
2726
"sigs.k8s.io/kustomize/pkg/resource"
27+
"sigs.k8s.io/kustomize/pkg/types"
2828
)
2929

3030
var deploy = gvk.Gvk{Group: "apps", Version: "v1", Kind: "Deployment"}
@@ -435,10 +435,10 @@ func TestMergeWithoutOverride(t *testing.T) {
435435
}
436436
}
437437

438-
func generateMergeFixtures(b ifc.GenerationBehavior) []ResMap {
438+
func generateMergeFixtures(b types.GenerationBehavior) []ResMap {
439439

440440
input1 := ResMap{
441-
resid.NewResId(cmap, "cmap"): rf.FromMap(
441+
resid.NewResId(cmap, "cmap"): rf.FromMapAndOption(
442442
map[string]interface{}{
443443
"apiVersion": "apps/v1",
444444
"kind": "ConfigMap",
@@ -449,10 +449,12 @@ func generateMergeFixtures(b ifc.GenerationBehavior) []ResMap {
449449
"a": "x",
450450
"b": "y",
451451
},
452-
}),
452+
}, &types.GeneratorArgs{
453+
Behavior: "create",
454+
}, nil),
453455
}
454456
input2 := ResMap{
455-
resid.NewResId(cmap, "cmap"): rf.FromMap(
457+
resid.NewResId(cmap, "cmap"): rf.FromMapAndOption(
456458
map[string]interface{}{
457459
"apiVersion": "apps/v1",
458460
"kind": "ConfigMap",
@@ -464,16 +466,16 @@ func generateMergeFixtures(b ifc.GenerationBehavior) []ResMap {
464466
"b": "v",
465467
"c": "w",
466468
},
467-
}),
469+
}, &types.GeneratorArgs{
470+
Behavior: b.String(),
471+
}, nil),
468472
}
469-
input1[resid.NewResId(cmap, "cmap")].SetBehavior(ifc.BehaviorCreate)
470-
input2[resid.NewResId(cmap, "cmap")].SetBehavior(b)
471473
return []ResMap{input1, input2}
472474
}
473475

474476
func TestMergeWithOverride(t *testing.T) {
475477
expected := ResMap{
476-
resid.NewResId(cmap, "cmap"): rf.FromMap(
478+
resid.NewResId(cmap, "cmap"): rf.FromMapAndOption(
477479
map[string]interface{}{
478480
"apiVersion": "apps/v1",
479481
"kind": "ConfigMap",
@@ -487,10 +489,11 @@ func TestMergeWithOverride(t *testing.T) {
487489
"b": "v",
488490
"c": "w",
489491
},
490-
}),
492+
}, &types.GeneratorArgs{
493+
Behavior: "create",
494+
}, nil),
491495
}
492-
expected[resid.NewResId(cmap, "cmap")].SetBehavior(ifc.BehaviorCreate)
493-
merged, err := MergeWithOverride(generateMergeFixtures(ifc.BehaviorMerge)...)
496+
merged, err := MergeWithOverride(generateMergeFixtures(types.BehaviorMerge)...)
494497
if err != nil {
495498
t.Fatalf("unexpected error: %v", err)
496499
}
@@ -514,7 +517,7 @@ func TestMergeWithOverride(t *testing.T) {
514517
t.Fatalf("%#v doesn't equal expected %#v", merged2, expected)
515518
}
516519

517-
inputs := generateMergeFixtures(ifc.BehaviorReplace)
520+
inputs := generateMergeFixtures(types.BehaviorReplace)
518521
replaced, err := MergeWithOverride(inputs...)
519522
if err != nil {
520523
t.Fatalf("unexpected error: %v", err)
@@ -524,7 +527,7 @@ func TestMergeWithOverride(t *testing.T) {
524527
t.Fatalf("%#v doesn't equal expected %#v", replaced, expectedReplaced)
525528
}
526529

527-
_, err = MergeWithOverride(generateMergeFixtures(ifc.BehaviorUnspecified)...)
530+
_, err = MergeWithOverride(generateMergeFixtures(types.BehaviorUnspecified)...)
528531
if err == nil {
529532
t.Fatal("Merging with GenerationBehavior BehaviorUnspecified should return an error but does not")
530533
}

pkg/resource/factory.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,16 @@ func NewFactory(kf ifc.KunstructuredFactory) *Factory {
4141
func (rf *Factory) FromMap(m map[string]interface{}) *Resource {
4242
return &Resource{
4343
Kunstructured: rf.kf.FromMap(m),
44-
b: ifc.BehaviorUnspecified}
44+
options: types.NewGenArgs(nil, nil),
45+
}
46+
}
47+
48+
// FromMapAndOption returns a new instance of Resource with given options.
49+
func (rf *Factory) FromMapAndOption(m map[string]interface{}, args *types.GeneratorArgs, option *types.GeneratorOptions) *Resource {
50+
return &Resource{
51+
Kunstructured: rf.kf.FromMap(m),
52+
options: types.NewGenArgs(args, option),
53+
}
4554
}
4655

4756
// FromKunstructured returns a new instance of Resource.
@@ -50,7 +59,10 @@ func (rf *Factory) FromKunstructured(
5059
if u == nil {
5160
log.Fatal("unstruct ifc must not be null")
5261
}
53-
return &Resource{Kunstructured: u, b: ifc.BehaviorUnspecified}
62+
return &Resource{
63+
Kunstructured: u,
64+
options: types.NewGenArgs(nil, nil),
65+
}
5466
}
5567

5668
// SliceFromPatches returns a slice of resources given a patch path
@@ -118,7 +130,7 @@ func (rf *Factory) MakeConfigMap(args *types.ConfigMapArgs, options *types.Gener
118130
if err != nil {
119131
return nil, err
120132
}
121-
return &Resource{Kunstructured: u, b: fixBehavior(args.Behavior)}, nil
133+
return &Resource{Kunstructured: u, options: types.NewGenArgs(&types.GeneratorArgs{Behavior: args.Behavior}, options)}, nil
122134
}
123135

124136
// MakeSecret makes an instance of Resource for Secret
@@ -127,13 +139,5 @@ func (rf *Factory) MakeSecret(args *types.SecretArgs, options *types.GeneratorOp
127139
if err != nil {
128140
return nil, err
129141
}
130-
return &Resource{Kunstructured: u, b: fixBehavior(args.Behavior)}, nil
131-
}
132-
133-
func fixBehavior(s string) ifc.GenerationBehavior {
134-
b := ifc.NewGenerationBehavior(s)
135-
if b == ifc.BehaviorUnspecified {
136-
return ifc.BehaviorCreate
137-
}
138-
return b
142+
return &Resource{Kunstructured: u, options: types.NewGenArgs(&types.GeneratorArgs{Behavior: args.Behavior}, options)}, nil
139143
}

pkg/resource/resource.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@ import (
2222

2323
"sigs.k8s.io/kustomize/pkg/ifc"
2424
"sigs.k8s.io/kustomize/pkg/resid"
25+
"sigs.k8s.io/kustomize/pkg/types"
2526
)
2627

2728
// Resource is map representation of a Kubernetes API resource object
2829
// paired with a GenerationBehavior.
2930
type Resource struct {
3031
ifc.Kunstructured
31-
b ifc.GenerationBehavior
32+
options *types.GenArgs
3233
}
3334

3435
// String returns resource as JSON.
@@ -37,23 +38,25 @@ func (r *Resource) String() string {
3738
if err != nil {
3839
return "<" + err.Error() + ">"
3940
}
40-
return r.b.String() + ":" + strings.TrimSpace(string(bs))
41+
return strings.TrimSpace(string(bs))
4142
}
4243

43-
// Behavior returns the behavior for the resource.
44-
func (r *Resource) Behavior() ifc.GenerationBehavior {
45-
return r.b
44+
// DeepCopy returns a new copy of resource
45+
func (r *Resource) DeepCopy() *Resource {
46+
return &Resource{
47+
Kunstructured: r.Kunstructured.Copy(),
48+
options: r.options,
49+
}
4650
}
4751

48-
// SetBehavior changes the resource to the new behavior
49-
func (r *Resource) SetBehavior(b ifc.GenerationBehavior) *Resource {
50-
r.b = b
51-
return r
52+
// Behavior returns the behavior for the resource.
53+
func (r *Resource) Behavior() types.GenerationBehavior {
54+
return r.options.Behavior()
5255
}
5356

54-
// IsGenerated checks if the resource is generated from a generator
55-
func (r *Resource) IsGenerated() bool {
56-
return r.b != ifc.BehaviorUnspecified
57+
// NeedAppendHash checks if the resource need a hash suffix
58+
func (r *Resource) NeedHashSuffix() bool {
59+
return r.options != nil && r.options.NeedsHashSuffix()
5760
}
5861

5962
// Id returns the ResId for the resource.
@@ -74,6 +77,7 @@ func (r *Resource) Replace(other *Resource) {
7477
r.SetAnnotations(
7578
mergeStringMaps(other.GetAnnotations(), r.GetAnnotations()))
7679
r.SetName(other.GetName())
80+
r.options = other.options
7781
}
7882

7983
// TODO: Add BinaryData once we sync to new k8s.io/api

pkg/resource/resource_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ var testConfigMap = factory.FromMap(
3737
},
3838
})
3939

40-
const testConfigMapString = `unspecified:{"apiVersion":"v1","kind":"ConfigMap","metadata":{"name":"winnie","namespace":"hundred-acre-wood"}}`
40+
const testConfigMapString = `{"apiVersion":"v1","kind":"ConfigMap","metadata":{"name":"winnie","namespace":"hundred-acre-wood"}}`
4141

4242
var testDeployment = factory.FromMap(
4343
map[string]interface{}{
@@ -48,7 +48,7 @@ var testDeployment = factory.FromMap(
4848
},
4949
})
5050

51-
const testDeploymentString = `unspecified:{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"name":"pooh"}}`
51+
const testDeploymentString = `{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"name":"pooh"}}`
5252

5353
func TestResourceString(t *testing.T) {
5454
tests := []struct {

0 commit comments

Comments
 (0)