mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-06-14 10:30:59 +00:00
replace Resource.options with annotations (#4061)
This commit is contained in:
@@ -1514,9 +1514,9 @@ kind: Deployment
|
|||||||
metadata:
|
metadata:
|
||||||
name: pre-deploy
|
name: pre-deploy
|
||||||
annotations:
|
annotations:
|
||||||
config.kubernetes.io/previousNames: deploy,deploy
|
internal.config.kubernetes.io/previousNames: deploy,deploy
|
||||||
config.kubernetes.io/previousKinds: CronJob,Deployment
|
internal.config.kubernetes.io/previousKinds: CronJob,Deployment
|
||||||
config.kubernetes.io/previousNamespaces: default,default
|
internal.config.kubernetes.io/previousNamespaces: default,default
|
||||||
spec:
|
spec:
|
||||||
template:
|
template:
|
||||||
spec:
|
spec:
|
||||||
@@ -1543,9 +1543,9 @@ kind: Deployment
|
|||||||
metadata:
|
metadata:
|
||||||
name: pre-deploy
|
name: pre-deploy
|
||||||
annotations:
|
annotations:
|
||||||
config.kubernetes.io/previousNames: deploy,deploy
|
internal.config.kubernetes.io/previousNames: deploy,deploy
|
||||||
config.kubernetes.io/previousKinds: CronJob,Deployment
|
internal.config.kubernetes.io/previousKinds: CronJob,Deployment
|
||||||
config.kubernetes.io/previousNamespaces: default,default
|
internal.config.kubernetes.io/previousNamespaces: default,default
|
||||||
spec:
|
spec:
|
||||||
template:
|
template:
|
||||||
spec:
|
spec:
|
||||||
|
|||||||
@@ -362,10 +362,10 @@ func TestResolveVarsWithNoambiguation(t *testing.T) {
|
|||||||
"metadata": map[string]interface{}{
|
"metadata": map[string]interface{}{
|
||||||
"name": "sub-backendOne",
|
"name": "sub-backendOne",
|
||||||
"annotations": map[string]interface{}{
|
"annotations": map[string]interface{}{
|
||||||
"config.kubernetes.io/previousKinds": "Service",
|
"internal.config.kubernetes.io/previousKinds": "Service",
|
||||||
"config.kubernetes.io/previousNames": "backendOne",
|
"internal.config.kubernetes.io/previousNames": "backendOne",
|
||||||
"config.kubernetes.io/previousNamespaces": "default",
|
"internal.config.kubernetes.io/previousNamespaces": "default",
|
||||||
"config.kubernetes.io/prefixes": "sub-",
|
"internal.config.kubernetes.io/prefixes": "sub-",
|
||||||
},
|
},
|
||||||
}}).ResMap()
|
}}).ResMap()
|
||||||
|
|
||||||
|
|||||||
@@ -255,5 +255,5 @@ metadata:
|
|||||||
actual.RemoveBuildAnnotations()
|
actual.RemoveBuildAnnotations()
|
||||||
actYaml, err := actual.AsYaml()
|
actYaml, err := actual.AsYaml()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, expYaml, actYaml)
|
assert.Equal(t, string(expYaml), string(actYaml))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,10 +12,11 @@ import (
|
|||||||
const (
|
const (
|
||||||
BuildAnnotationPreviousKinds = konfig.ConfigAnnoDomain + "/previousKinds"
|
BuildAnnotationPreviousKinds = konfig.ConfigAnnoDomain + "/previousKinds"
|
||||||
BuildAnnotationPreviousNames = konfig.ConfigAnnoDomain + "/previousNames"
|
BuildAnnotationPreviousNames = konfig.ConfigAnnoDomain + "/previousNames"
|
||||||
|
BuildAnnotationPreviousNamespaces = konfig.ConfigAnnoDomain + "/previousNamespaces"
|
||||||
BuildAnnotationPrefixes = konfig.ConfigAnnoDomain + "/prefixes"
|
BuildAnnotationPrefixes = konfig.ConfigAnnoDomain + "/prefixes"
|
||||||
BuildAnnotationSuffixes = konfig.ConfigAnnoDomain + "/suffixes"
|
BuildAnnotationSuffixes = konfig.ConfigAnnoDomain + "/suffixes"
|
||||||
BuildAnnotationPreviousNamespaces = konfig.ConfigAnnoDomain + "/previousNamespaces"
|
|
||||||
BuildAnnotationsRefBy = konfig.ConfigAnnoDomain + "/refBy"
|
BuildAnnotationsRefBy = konfig.ConfigAnnoDomain + "/refBy"
|
||||||
|
BuildAnnotationsGenOptions = konfig.ConfigAnnoDomain + "/generatorOptions"
|
||||||
|
|
||||||
// the following are only for patches, to specify whether they can change names
|
// the following are only for patches, to specify whether they can change names
|
||||||
// and kinds of their targets
|
// and kinds of their targets
|
||||||
|
|||||||
@@ -31,11 +31,12 @@ const (
|
|||||||
// A program name, for use in help, finding the XDG_CONFIG_DIR, etc.
|
// A program name, for use in help, finding the XDG_CONFIG_DIR, etc.
|
||||||
ProgramName = "kustomize"
|
ProgramName = "kustomize"
|
||||||
|
|
||||||
// ConfigAnnoDomain is configuration-related annotation namespace.
|
// ConfigAnnoDomain is internal configuration-related annotation namespace.
|
||||||
ConfigAnnoDomain = "config.kubernetes.io"
|
// See https://github.com/kubernetes-sigs/kustomize/blob/master/cmd/config/docs/api-conventions/functions-spec.md.
|
||||||
|
ConfigAnnoDomain = "internal.config.kubernetes.io"
|
||||||
|
|
||||||
// If a resource has this annotation, kustomize will drop it.
|
// If a resource has this annotation, kustomize will drop it.
|
||||||
IgnoredByKustomizeAnnotation = ConfigAnnoDomain + "/local-config"
|
IgnoredByKustomizeAnnotation = "config.kubernetes.io/local-config"
|
||||||
|
|
||||||
// Label key that indicates the resources are built from Kustomize
|
// Label key that indicates the resources are built from Kustomize
|
||||||
ManagedbyLabelKey = "app.kubernetes.io/managed-by"
|
ManagedbyLabelKey = "app.kubernetes.io/managed-by"
|
||||||
|
|||||||
@@ -219,8 +219,10 @@ BAR=baz
|
|||||||
}
|
}
|
||||||
r, err := rmF.NewResMapFromConfigMapArgs(kvLdr, tc.input)
|
r, err := rmF.NewResMapFromConfigMapArgs(kvLdr, tc.input)
|
||||||
assert.NoError(t, err, tc.description)
|
assert.NoError(t, err, tc.description)
|
||||||
|
r.RemoveBuildAnnotations()
|
||||||
rYaml, err := r.AsYaml()
|
rYaml, err := r.AsYaml()
|
||||||
assert.NoError(t, err, tc.description)
|
assert.NoError(t, err, tc.description)
|
||||||
|
tc.expected.RemoveBuildAnnotations()
|
||||||
expYaml, err := tc.expected.AsYaml()
|
expYaml, err := tc.expected.AsYaml()
|
||||||
assert.NoError(t, err, tc.description)
|
assert.NoError(t, err, tc.description)
|
||||||
assert.Equal(t, expYaml, rYaml)
|
assert.Equal(t, expYaml, rYaml)
|
||||||
@@ -252,6 +254,7 @@ func TestNewResMapFromSecretArgs(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error: %v", err)
|
t.Fatalf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
|
actual.RemoveBuildAnnotations()
|
||||||
actYaml, err := actual.AsYaml()
|
actYaml, err := actual.AsYaml()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
|||||||
@@ -343,9 +343,9 @@ func TestGetMatchingResourcesByAnyId(t *testing.T) {
|
|||||||
"metadata": map[string]interface{}{
|
"metadata": map[string]interface{}{
|
||||||
"name": "new-alice",
|
"name": "new-alice",
|
||||||
"annotations": map[string]interface{}{
|
"annotations": map[string]interface{}{
|
||||||
"config.kubernetes.io/previousKinds": "ConfigMap",
|
"internal.config.kubernetes.io/previousKinds": "ConfigMap",
|
||||||
"config.kubernetes.io/previousNames": "alice",
|
"internal.config.kubernetes.io/previousNames": "alice",
|
||||||
"config.kubernetes.io/previousNamespaces": "default",
|
"internal.config.kubernetes.io/previousNamespaces": "default",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@@ -356,9 +356,9 @@ func TestGetMatchingResourcesByAnyId(t *testing.T) {
|
|||||||
"metadata": map[string]interface{}{
|
"metadata": map[string]interface{}{
|
||||||
"name": "new-bob",
|
"name": "new-bob",
|
||||||
"annotations": map[string]interface{}{
|
"annotations": map[string]interface{}{
|
||||||
"config.kubernetes.io/previousKinds": "ConfigMap,ConfigMap",
|
"internal.config.kubernetes.io/previousKinds": "ConfigMap,ConfigMap",
|
||||||
"config.kubernetes.io/previousNames": "bob,bob2",
|
"internal.config.kubernetes.io/previousNames": "bob,bob2",
|
||||||
"config.kubernetes.io/previousNamespaces": "default,default",
|
"internal.config.kubernetes.io/previousNamespaces": "default,default",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@@ -370,9 +370,9 @@ func TestGetMatchingResourcesByAnyId(t *testing.T) {
|
|||||||
"name": "new-bob",
|
"name": "new-bob",
|
||||||
"namespace": "new-happy",
|
"namespace": "new-happy",
|
||||||
"annotations": map[string]interface{}{
|
"annotations": map[string]interface{}{
|
||||||
"config.kubernetes.io/previousKinds": "ConfigMap",
|
"internal.config.kubernetes.io/previousKinds": "ConfigMap",
|
||||||
"config.kubernetes.io/previousNames": "bob",
|
"internal.config.kubernetes.io/previousNames": "bob",
|
||||||
"config.kubernetes.io/previousNamespaces": "happy",
|
"internal.config.kubernetes.io/previousNamespaces": "happy",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@@ -384,9 +384,9 @@ func TestGetMatchingResourcesByAnyId(t *testing.T) {
|
|||||||
"name": "charlie",
|
"name": "charlie",
|
||||||
"namespace": "happy",
|
"namespace": "happy",
|
||||||
"annotations": map[string]interface{}{
|
"annotations": map[string]interface{}{
|
||||||
"config.kubernetes.io/previousKinds": "ConfigMap",
|
"internal.config.kubernetes.io/previousKinds": "ConfigMap",
|
||||||
"config.kubernetes.io/previousNames": "charlie",
|
"internal.config.kubernetes.io/previousNames": "charlie",
|
||||||
"config.kubernetes.io/previousNamespaces": "default",
|
"internal.config.kubernetes.io/previousNamespaces": "default",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@@ -845,6 +845,8 @@ func TestAbsorbAll(t *testing.T) {
|
|||||||
}))
|
}))
|
||||||
w := makeMap1()
|
w := makeMap1()
|
||||||
assert.NoError(t, w.AbsorbAll(makeMap2(types.BehaviorMerge)))
|
assert.NoError(t, w.AbsorbAll(makeMap2(types.BehaviorMerge)))
|
||||||
|
expected.RemoveBuildAnnotations()
|
||||||
|
w.RemoveBuildAnnotations()
|
||||||
assert.NoError(t, expected.ErrorIfNotEqualLists(w))
|
assert.NoError(t, expected.ErrorIfNotEqualLists(w))
|
||||||
w = makeMap1()
|
w = makeMap1()
|
||||||
assert.NoError(t, w.AbsorbAll(nil))
|
assert.NoError(t, w.AbsorbAll(nil))
|
||||||
@@ -853,6 +855,7 @@ func TestAbsorbAll(t *testing.T) {
|
|||||||
w = makeMap1()
|
w = makeMap1()
|
||||||
w2 := makeMap2(types.BehaviorReplace)
|
w2 := makeMap2(types.BehaviorReplace)
|
||||||
assert.NoError(t, w.AbsorbAll(w2))
|
assert.NoError(t, w.AbsorbAll(w2))
|
||||||
|
w2.RemoveBuildAnnotations()
|
||||||
assert.NoError(t, w2.ErrorIfNotEqualLists(w))
|
assert.NoError(t, w2.ErrorIfNotEqualLists(w))
|
||||||
w = makeMap1()
|
w = makeMap1()
|
||||||
w2 = makeMap2(types.BehaviorUnspecified)
|
w2 = makeMap2(types.BehaviorUnspecified)
|
||||||
|
|||||||
@@ -75,7 +75,9 @@ func (rf *Factory) makeOne(rn *yaml.RNode, o *types.GenArgs) *Resource {
|
|||||||
if o == nil {
|
if o == nil {
|
||||||
o = types.NewGenArgs(nil)
|
o = types.NewGenArgs(nil)
|
||||||
}
|
}
|
||||||
return &Resource{RNode: *rn, options: o}
|
resource := &Resource{RNode: *rn}
|
||||||
|
resource.SetOptions(o)
|
||||||
|
return resource
|
||||||
}
|
}
|
||||||
|
|
||||||
// SliceFromPatches returns a slice of resources given a patch path
|
// SliceFromPatches returns a slice of resources given a patch path
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ import (
|
|||||||
// paired with metadata used by kustomize.
|
// paired with metadata used by kustomize.
|
||||||
type Resource struct {
|
type Resource struct {
|
||||||
kyaml.RNode
|
kyaml.RNode
|
||||||
options *types.GenArgs
|
|
||||||
refVarNames []string
|
refVarNames []string
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,6 +34,7 @@ var BuildAnnotations = []string{
|
|||||||
utils.BuildAnnotationAllowNameChange,
|
utils.BuildAnnotationAllowNameChange,
|
||||||
utils.BuildAnnotationAllowKindChange,
|
utils.BuildAnnotationAllowKindChange,
|
||||||
utils.BuildAnnotationsRefBy,
|
utils.BuildAnnotationsRefBy,
|
||||||
|
utils.BuildAnnotationsGenOptions,
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Resource) ResetRNode(incoming *Resource) {
|
func (r *Resource) ResetRNode(incoming *Resource) {
|
||||||
@@ -80,6 +80,8 @@ func (r *Resource) DeepCopy() *Resource {
|
|||||||
// CopyMergeMetaDataFieldsFrom copies everything but the non-metadata in
|
// CopyMergeMetaDataFieldsFrom copies everything but the non-metadata in
|
||||||
// the resource.
|
// the resource.
|
||||||
// TODO: move to RNode, use GetMeta to improve performance.
|
// TODO: move to RNode, use GetMeta to improve performance.
|
||||||
|
// TODO: make a version of mergeStringMaps that is build-annotation aware
|
||||||
|
// to avoid repeatedly setting refby and genargs annotations
|
||||||
// Must remove the kustomize bit at the end.
|
// Must remove the kustomize bit at the end.
|
||||||
func (r *Resource) CopyMergeMetaDataFieldsFrom(other *Resource) error {
|
func (r *Resource) CopyMergeMetaDataFieldsFrom(other *Resource) error {
|
||||||
if err := r.SetLabels(
|
if err := r.SetLabels(
|
||||||
@@ -87,7 +89,7 @@ func (r *Resource) CopyMergeMetaDataFieldsFrom(other *Resource) error {
|
|||||||
return fmt.Errorf("copyMerge cannot set labels - %w", err)
|
return fmt.Errorf("copyMerge cannot set labels - %w", err)
|
||||||
}
|
}
|
||||||
if err := r.SetAnnotations(
|
if err := r.SetAnnotations(
|
||||||
mergeStringMaps(other.GetAnnotations(), r.GetAnnotations())); err != nil {
|
mergeStringMapsWithBuildAnnotations(other.GetAnnotations(), r.GetAnnotations())); err != nil {
|
||||||
return fmt.Errorf("copyMerge cannot set annotations - %w", err)
|
return fmt.Errorf("copyMerge cannot set annotations - %w", err)
|
||||||
}
|
}
|
||||||
if err := r.SetName(other.GetName()); err != nil {
|
if err := r.SetName(other.GetName()); err != nil {
|
||||||
@@ -101,7 +103,6 @@ func (r *Resource) CopyMergeMetaDataFieldsFrom(other *Resource) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *Resource) copyKustomizeSpecificFields(other *Resource) {
|
func (r *Resource) copyKustomizeSpecificFields(other *Resource) {
|
||||||
r.options = other.options
|
|
||||||
r.refVarNames = copyStringSlice(other.refVarNames)
|
r.refVarNames = copyStringSlice(other.refVarNames)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -274,7 +275,7 @@ func (r *Resource) String() string {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "<" + err.Error() + ">"
|
return "<" + err.Error() + ">"
|
||||||
}
|
}
|
||||||
return strings.TrimSpace(string(bs)) + r.options.String()
|
return strings.TrimSpace(string(bs))
|
||||||
}
|
}
|
||||||
|
|
||||||
// AsYAML returns the resource in Yaml form.
|
// AsYAML returns the resource in Yaml form.
|
||||||
@@ -296,20 +297,43 @@ func (r *Resource) MustYaml() string {
|
|||||||
return string(yml)
|
return string(yml)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *Resource) getGenArgs() *types.GenArgs {
|
||||||
|
annotations := r.GetAnnotations()
|
||||||
|
if genOptsAnno, ok := annotations[utils.BuildAnnotationsGenOptions]; ok {
|
||||||
|
var genOpts types.GeneratorArgs
|
||||||
|
yaml.Unmarshal([]byte(genOptsAnno), &genOpts)
|
||||||
|
return types.NewGenArgs(&genOpts)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// SetOptions updates the generator options for the resource.
|
// SetOptions updates the generator options for the resource.
|
||||||
func (r *Resource) SetOptions(o *types.GenArgs) {
|
func (r *Resource) SetOptions(o *types.GenArgs) {
|
||||||
r.options = o
|
annotations := r.GetAnnotations()
|
||||||
|
if o.IsNilOrEmpty() {
|
||||||
|
if len(annotations) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if o == nil {
|
||||||
|
delete(annotations, utils.BuildAnnotationsGenOptions)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
b, _ := o.AsYaml()
|
||||||
|
annotations[utils.BuildAnnotationsGenOptions] = string(b)
|
||||||
|
}
|
||||||
|
r.SetAnnotations(annotations)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Behavior returns the behavior for the resource.
|
// Behavior returns the behavior for the resource.
|
||||||
func (r *Resource) Behavior() types.GenerationBehavior {
|
func (r *Resource) Behavior() types.GenerationBehavior {
|
||||||
return r.options.Behavior()
|
return r.getGenArgs().Behavior()
|
||||||
}
|
}
|
||||||
|
|
||||||
// NeedHashSuffix returns true if a resource content
|
// NeedHashSuffix returns true if a resource content
|
||||||
// hash should be appended to the name of the resource.
|
// hash should be appended to the name of the resource.
|
||||||
func (r *Resource) NeedHashSuffix() bool {
|
func (r *Resource) NeedHashSuffix() bool {
|
||||||
return r.options != nil && r.options.ShouldAddHashSuffixToName()
|
options := r.getGenArgs()
|
||||||
|
return options != nil && options.ShouldAddHashSuffixToName()
|
||||||
}
|
}
|
||||||
|
|
||||||
// OrgId returns the original, immutable ResId for the resource.
|
// OrgId returns the original, immutable ResId for the resource.
|
||||||
@@ -420,3 +444,17 @@ func mergeStringMaps(maps ...map[string]string) map[string]string {
|
|||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func mergeStringMapsWithBuildAnnotations(maps ...map[string]string) map[string]string {
|
||||||
|
result := mergeStringMaps(maps...)
|
||||||
|
for i := range BuildAnnotations {
|
||||||
|
if len(maps) > 0 {
|
||||||
|
if v, ok := maps[0][BuildAnnotations[i]]; ok {
|
||||||
|
result[BuildAnnotations[i]] = v
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete(result, BuildAnnotations[i])
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|||||||
@@ -28,10 +28,10 @@ var testConfigMap = factory.FromMap(
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const genArgOptions = "{nsfx:false,beh:unspecified}"
|
|
||||||
|
|
||||||
//nolint:gosec
|
//nolint:gosec
|
||||||
const configMapAsString = `{"apiVersion":"v1","kind":"ConfigMap","metadata":{"name":"winnie","namespace":"hundred-acre-wood"}}`
|
const configMapAsString = `{"apiVersion":"v1","kind":"ConfigMap","metadata":{"name":"winnie","namespace":"hundred-acre-wood"}}`
|
||||||
|
const configMapAsStringWithOptions = `{"apiVersion":"v1","kind":"ConfigMap","metadata":{"annotations":` +
|
||||||
|
`{"internal.config.kubernetes.io/generatorOptions":"{}\n"},"name":"winnie","namespace":"hundred-acre-wood"}}`
|
||||||
|
|
||||||
var testDeployment = factory.FromMap(
|
var testDeployment = factory.FromMap(
|
||||||
map[string]interface{}{
|
map[string]interface{}{
|
||||||
@@ -43,6 +43,8 @@ var testDeployment = factory.FromMap(
|
|||||||
})
|
})
|
||||||
|
|
||||||
const deploymentAsString = `{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"name":"pooh"}}`
|
const deploymentAsString = `{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"name":"pooh"}}`
|
||||||
|
const deploymentAsStringWithOptions = `{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":` +
|
||||||
|
`{"internal.config.kubernetes.io/generatorOptions":"{}\n"},"name":"pooh"}}`
|
||||||
|
|
||||||
func TestAsYAML(t *testing.T) {
|
func TestAsYAML(t *testing.T) {
|
||||||
expected := `apiVersion: apps/v1
|
expected := `apiVersion: apps/v1
|
||||||
@@ -66,17 +68,37 @@ func TestResourceString(t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
in: testConfigMap,
|
in: testConfigMap,
|
||||||
s: configMapAsString + genArgOptions,
|
s: configMapAsString,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
in: testDeployment,
|
in: testDeployment,
|
||||||
s: deploymentAsString + genArgOptions,
|
s: deploymentAsString,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
if test.in.String() != test.s {
|
assert.Equal(t, test.in.String(), test.s)
|
||||||
t.Fatalf("Expected %s == %s", test.in.String(), test.s)
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestResourceStringWithOptionsAnnotations(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
in *Resource
|
||||||
|
s string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
in: testConfigMap,
|
||||||
|
s: configMapAsStringWithOptions,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
in: testDeployment,
|
||||||
|
s: deploymentAsStringWithOptions,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, test := range tests {
|
||||||
|
args := &types.GeneratorArgs{}
|
||||||
|
options := types.NewGenArgs(args)
|
||||||
|
test.in.SetOptions(options)
|
||||||
|
assert.Equal(t, test.in.String(), test.s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -717,9 +739,9 @@ metadata:
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
config.kubernetes.io/previousKinds: Secret
|
internal.config.kubernetes.io/previousKinds: Secret
|
||||||
config.kubernetes.io/previousNames: oldName
|
internal.config.kubernetes.io/previousNames: oldName
|
||||||
config.kubernetes.io/previousNamespaces: default
|
internal.config.kubernetes.io/previousNamespaces: default
|
||||||
name: newName
|
name: newName
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
@@ -729,9 +751,9 @@ metadata:
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
config.kubernetes.io/previousKinds: Secret
|
internal.config.kubernetes.io/previousKinds: Secret
|
||||||
config.kubernetes.io/previousNames: oldName
|
internal.config.kubernetes.io/previousNames: oldName
|
||||||
config.kubernetes.io/previousNamespaces: default
|
internal.config.kubernetes.io/previousNamespaces: default
|
||||||
name: oldName2
|
name: oldName2
|
||||||
`,
|
`,
|
||||||
newName: "newName",
|
newName: "newName",
|
||||||
@@ -740,9 +762,9 @@ metadata:
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
config.kubernetes.io/previousKinds: Secret,Secret
|
internal.config.kubernetes.io/previousKinds: Secret,Secret
|
||||||
config.kubernetes.io/previousNames: oldName,oldName2
|
internal.config.kubernetes.io/previousNames: oldName,oldName2
|
||||||
config.kubernetes.io/previousNamespaces: default,default
|
internal.config.kubernetes.io/previousNamespaces: default,default
|
||||||
name: newName
|
name: newName
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
@@ -752,9 +774,9 @@ metadata:
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
config.kubernetes.io/previousKinds: Secret
|
internal.config.kubernetes.io/previousKinds: Secret
|
||||||
config.kubernetes.io/previousNames: oldName
|
internal.config.kubernetes.io/previousNames: oldName
|
||||||
config.kubernetes.io/previousNamespaces: default
|
internal.config.kubernetes.io/previousNamespaces: default
|
||||||
name: oldName2
|
name: oldName2
|
||||||
namespace: oldNamespace
|
namespace: oldNamespace
|
||||||
`,
|
`,
|
||||||
@@ -764,9 +786,9 @@ metadata:
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
config.kubernetes.io/previousKinds: Secret,Secret
|
internal.config.kubernetes.io/previousKinds: Secret,Secret
|
||||||
config.kubernetes.io/previousNames: oldName,oldName2
|
internal.config.kubernetes.io/previousNames: oldName,oldName2
|
||||||
config.kubernetes.io/previousNamespaces: default,oldNamespace
|
internal.config.kubernetes.io/previousNamespaces: default,oldNamespace
|
||||||
name: newName
|
name: newName
|
||||||
namespace: newNamespace
|
namespace: newNamespace
|
||||||
`,
|
`,
|
||||||
@@ -814,9 +836,9 @@ metadata:
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
config.kubernetes.io/previousKinds: Secret
|
internal.config.kubernetes.io/previousKinds: Secret
|
||||||
config.kubernetes.io/previousNames: oldName
|
internal.config.kubernetes.io/previousNames: oldName
|
||||||
config.kubernetes.io/previousNamespaces: default
|
internal.config.kubernetes.io/previousNamespaces: default
|
||||||
name: newName
|
name: newName
|
||||||
`,
|
`,
|
||||||
expected: []resid.ResId{
|
expected: []resid.ResId{
|
||||||
@@ -833,9 +855,9 @@ metadata:
|
|||||||
kind: Secret
|
kind: Secret
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
config.kubernetes.io/previousKinds: Secret,Secret
|
internal.config.kubernetes.io/previousKinds: Secret,Secret
|
||||||
config.kubernetes.io/previousNames: oldName,oldName2
|
internal.config.kubernetes.io/previousNames: oldName,oldName2
|
||||||
config.kubernetes.io/previousNamespaces: default,oldNamespace
|
internal.config.kubernetes.io/previousNamespaces: default,oldNamespace
|
||||||
name: newName
|
name: newName
|
||||||
namespace: newNamespace
|
namespace: newNamespace
|
||||||
`,
|
`,
|
||||||
@@ -1150,7 +1172,7 @@ kind: Deployment
|
|||||||
metadata:
|
metadata:
|
||||||
name: clown
|
name: clown
|
||||||
annotations:
|
annotations:
|
||||||
config.kubernetes.io/refBy: gr1_ver1_knd1|ns1|name1
|
internal.config.kubernetes.io/refBy: gr1_ver1_knd1|ns1|name1
|
||||||
spec:
|
spec:
|
||||||
numReplicas: 1
|
numReplicas: 1
|
||||||
`)
|
`)
|
||||||
@@ -1162,7 +1184,7 @@ kind: Deployment
|
|||||||
metadata:
|
metadata:
|
||||||
name: clown
|
name: clown
|
||||||
annotations:
|
annotations:
|
||||||
config.kubernetes.io/refBy: gr1_ver1_knd1|ns1|name1,gr2_ver2_knd2|ns2|name2
|
internal.config.kubernetes.io/refBy: gr1_ver1_knd1|ns1|name1,gr2_ver2_knd2|ns2|name2
|
||||||
spec:
|
spec:
|
||||||
numReplicas: 1
|
numReplicas: 1
|
||||||
`)
|
`)
|
||||||
@@ -1171,3 +1193,35 @@ spec:
|
|||||||
resid.FromString("gr2_ver2_knd2|ns2|name2"),
|
resid.FromString("gr2_ver2_knd2|ns2|name2"),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestOptions(t *testing.T) {
|
||||||
|
r, err := factory.FromBytes([]byte(`
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: example-configmap-test
|
||||||
|
`))
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
args := &types.GeneratorArgs{
|
||||||
|
Behavior: "merge",
|
||||||
|
Options: &types.GeneratorOptions{
|
||||||
|
DisableNameSuffixHash: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
options := types.NewGenArgs(args)
|
||||||
|
r.SetOptions(options)
|
||||||
|
assert.Equal(t, r.RNode.MustString(), `apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: example-configmap-test
|
||||||
|
annotations:
|
||||||
|
internal.config.kubernetes.io/generatorOptions: |
|
||||||
|
behavior: merge
|
||||||
|
options:
|
||||||
|
disableNameSuffixHash: true
|
||||||
|
`)
|
||||||
|
assert.Equal(t, r.Behavior(), types.BehaviorMerge)
|
||||||
|
assert.Equal(t, r.NeedHashSuffix(), !args.Options.DisableNameSuffixHash)
|
||||||
|
}
|
||||||
|
|||||||
@@ -148,6 +148,13 @@ func (th *HarnessEnhanced) ResetLoaderRoot(root string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (th *HarnessEnhanced) LoadAndRunGenerator(
|
func (th *HarnessEnhanced) LoadAndRunGenerator(
|
||||||
|
config string) resmap.ResMap {
|
||||||
|
rm := th.LoadAndRunGeneratorWithBuildAnnotations(config)
|
||||||
|
rm.RemoveBuildAnnotations()
|
||||||
|
return rm
|
||||||
|
}
|
||||||
|
|
||||||
|
func (th *HarnessEnhanced) LoadAndRunGeneratorWithBuildAnnotations(
|
||||||
config string) resmap.ResMap {
|
config string) resmap.ResMap {
|
||||||
res, err := th.rf.RF().FromBytes([]byte(config))
|
res, err := th.rf.RF().FromBytes([]byte(config))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -162,7 +169,6 @@ func (th *HarnessEnhanced) LoadAndRunGenerator(
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
th.t.Fatalf("generate err: %v", err)
|
th.t.Fatalf("generate err: %v", err)
|
||||||
}
|
}
|
||||||
rm.RemoveBuildAnnotations()
|
|
||||||
return rm
|
return rm
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ package types
|
|||||||
import (
|
import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"sigs.k8s.io/kustomize/kyaml/yaml"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GenArgs is a facade over GeneratorArgs, exposing a few readonly properties.
|
// GenArgs is a facade over GeneratorArgs, exposing a few readonly properties.
|
||||||
@@ -44,3 +46,16 @@ func (g *GenArgs) Behavior() GenerationBehavior {
|
|||||||
}
|
}
|
||||||
return NewGenerationBehavior(g.args.Behavior)
|
return NewGenerationBehavior(g.args.Behavior)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsNilOrEmpty returns true if g is nil or if the args are empty
|
||||||
|
func (g *GenArgs) IsNilOrEmpty() bool {
|
||||||
|
return g == nil || g.args == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AsYaml returns a yaml marshalling of the underlying Genargs
|
||||||
|
func (g *GenArgs) AsYaml() ([]byte, error) {
|
||||||
|
if g == nil {
|
||||||
|
return yaml.Marshal(nil)
|
||||||
|
}
|
||||||
|
return yaml.Marshal(g.args)
|
||||||
|
}
|
||||||
|
|||||||
@@ -63,11 +63,11 @@ apiVersion: v1
|
|||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
config.kubernetes.io/prefixes: baked-
|
internal.config.kubernetes.io/prefixes: baked-
|
||||||
config.kubernetes.io/previousKinds: Service
|
internal.config.kubernetes.io/previousKinds: Service
|
||||||
config.kubernetes.io/previousNames: apple
|
internal.config.kubernetes.io/previousNames: apple
|
||||||
config.kubernetes.io/previousNamespaces: default
|
internal.config.kubernetes.io/previousNamespaces: default
|
||||||
config.kubernetes.io/suffixes: -pie
|
internal.config.kubernetes.io/suffixes: -pie
|
||||||
name: baked-apple-pie
|
name: baked-apple-pie
|
||||||
spec:
|
spec:
|
||||||
ports:
|
ports:
|
||||||
@@ -87,11 +87,11 @@ apiVersion: v1
|
|||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
config.kubernetes.io/prefixes: baked-
|
internal.config.kubernetes.io/prefixes: baked-
|
||||||
config.kubernetes.io/previousKinds: ConfigMap
|
internal.config.kubernetes.io/previousKinds: ConfigMap
|
||||||
config.kubernetes.io/previousNames: cm
|
internal.config.kubernetes.io/previousNames: cm
|
||||||
config.kubernetes.io/previousNamespaces: default
|
internal.config.kubernetes.io/previousNamespaces: default
|
||||||
config.kubernetes.io/suffixes: -pie
|
internal.config.kubernetes.io/suffixes: -pie
|
||||||
name: baked-cm-pie
|
name: baked-cm-pie
|
||||||
`)
|
`)
|
||||||
|
|
||||||
@@ -139,10 +139,10 @@ apiVersion: apps/v1
|
|||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
annotations:
|
annotations:
|
||||||
config.kubernetes.io/prefixes: test-
|
internal.config.kubernetes.io/prefixes: test-
|
||||||
config.kubernetes.io/previousKinds: Deployment
|
internal.config.kubernetes.io/previousKinds: Deployment
|
||||||
config.kubernetes.io/previousNames: deployment
|
internal.config.kubernetes.io/previousNames: deployment
|
||||||
config.kubernetes.io/previousNamespaces: default
|
internal.config.kubernetes.io/previousNamespaces: default
|
||||||
name: test-deployment
|
name: test-deployment
|
||||||
spec:
|
spec:
|
||||||
template:
|
template:
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ func TestBashedConfigMapPlugin(t *testing.T) {
|
|||||||
PrepExecPlugin("someteam.example.com", "v1", "BashedConfigMap")
|
PrepExecPlugin("someteam.example.com", "v1", "BashedConfigMap")
|
||||||
defer th.Reset()
|
defer th.Reset()
|
||||||
|
|
||||||
m := th.LoadAndRunGenerator(`
|
m := th.LoadAndRunGeneratorWithBuildAnnotations(`
|
||||||
apiVersion: someteam.example.com/v1
|
apiVersion: someteam.example.com/v1
|
||||||
kind: BashedConfigMap
|
kind: BashedConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
@@ -28,6 +28,9 @@ data:
|
|||||||
username: alice
|
username: alice
|
||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
|
annotations:
|
||||||
|
internal.config.kubernetes.io/generatorOptions: |
|
||||||
|
options: {}
|
||||||
name: example-configmap-test
|
name: example-configmap-test
|
||||||
`)
|
`)
|
||||||
if m.Resources()[0].NeedHashSuffix() != true {
|
if m.Resources()[0].NeedHashSuffix() != true {
|
||||||
|
|||||||
Reference in New Issue
Block a user