Skip to content

Commit 8dbf841

Browse files
apelissek8s-publishing-bot
authored andcommitted
managedfields: Allow duplicates for built-in updates associative lists
Kubernetes-commit: 9d1847c1963bd9e3b5cf6fe7fb44f2e700a95774
1 parent 96a678f commit 8dbf841

File tree

2 files changed

+13
-10
lines changed

2 files changed

+13
-10
lines changed

pkg/util/managedfields/internal/structuredmerge.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"k8s.io/apimachinery/pkg/runtime/schema"
2626
"sigs.k8s.io/structured-merge-diff/v4/fieldpath"
2727
"sigs.k8s.io/structured-merge-diff/v4/merge"
28+
"sigs.k8s.io/structured-merge-diff/v4/typed"
2829
)
2930

3031
type structuredMergeManager struct {
@@ -95,11 +96,11 @@ func (f *structuredMergeManager) Update(liveObj, newObj runtime.Object, managed
9596
if err != nil {
9697
return nil, nil, fmt.Errorf("failed to convert live object (%v) to proper version: %v", objectGVKNN(liveObj), err)
9798
}
98-
newObjTyped, err := f.typeConverter.ObjectToTyped(newObjVersioned)
99+
newObjTyped, err := f.typeConverter.ObjectToTyped(newObjVersioned, typed.AllowDuplicates)
99100
if err != nil {
100101
return nil, nil, fmt.Errorf("failed to convert new object (%v) to smd typed: %v", objectGVKNN(newObjVersioned), err)
101102
}
102-
liveObjTyped, err := f.typeConverter.ObjectToTyped(liveObjVersioned)
103+
liveObjTyped, err := f.typeConverter.ObjectToTyped(liveObjVersioned, typed.AllowDuplicates)
103104
if err != nil {
104105
return nil, nil, fmt.Errorf("failed to convert live object (%v) to smd typed: %v", objectGVKNN(liveObjVersioned), err)
105106
}
@@ -139,11 +140,13 @@ func (f *structuredMergeManager) Apply(liveObj, patchObj runtime.Object, managed
139140
return nil, nil, fmt.Errorf("failed to convert live object (%v) to proper version: %v", objectGVKNN(liveObj), err)
140141
}
141142

143+
// Don't allow duplicates in the applied object.
142144
patchObjTyped, err := f.typeConverter.ObjectToTyped(patchObj)
143145
if err != nil {
144146
return nil, nil, fmt.Errorf("failed to create typed patch object (%v): %v", objectGVKNN(patchObj), err)
145147
}
146-
liveObjTyped, err := f.typeConverter.ObjectToTyped(liveObjVersioned)
148+
149+
liveObjTyped, err := f.typeConverter.ObjectToTyped(liveObjVersioned, typed.AllowDuplicates)
147150
if err != nil {
148151
return nil, nil, fmt.Errorf("failed to create typed live object (%v): %v", objectGVKNN(liveObjVersioned), err)
149152
}

pkg/util/managedfields/internal/typeconverter.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import (
3232
// TypeConverter allows you to convert from runtime.Object to
3333
// typed.TypedValue and the other way around.
3434
type TypeConverter interface {
35-
ObjectToTyped(runtime.Object) (*typed.TypedValue, error)
35+
ObjectToTyped(runtime.Object, ...typed.ValidationOptions) (*typed.TypedValue, error)
3636
TypedToObject(*typed.TypedValue) (runtime.Object, error)
3737
}
3838

@@ -54,17 +54,17 @@ func NewTypeConverter(openapiSpec map[string]*spec.Schema, preserveUnknownFields
5454
return &typeConverter{parser: tr}, nil
5555
}
5656

57-
func (c *typeConverter) ObjectToTyped(obj runtime.Object) (*typed.TypedValue, error) {
57+
func (c *typeConverter) ObjectToTyped(obj runtime.Object, opts ...typed.ValidationOptions) (*typed.TypedValue, error) {
5858
gvk := obj.GetObjectKind().GroupVersionKind()
5959
t := c.parser[gvk]
6060
if t == nil {
6161
return nil, NewNoCorrespondingTypeError(gvk)
6262
}
6363
switch o := obj.(type) {
6464
case *unstructured.Unstructured:
65-
return t.FromUnstructured(o.UnstructuredContent())
65+
return t.FromUnstructured(o.UnstructuredContent(), opts...)
6666
default:
67-
return t.FromStructured(obj)
67+
return t.FromStructured(obj, opts...)
6868
}
6969
}
7070

@@ -84,12 +84,12 @@ func NewDeducedTypeConverter() TypeConverter {
8484
}
8585

8686
// ObjectToTyped converts an object into a TypedValue with a "deduced type".
87-
func (deducedTypeConverter) ObjectToTyped(obj runtime.Object) (*typed.TypedValue, error) {
87+
func (deducedTypeConverter) ObjectToTyped(obj runtime.Object, opts ...typed.ValidationOptions) (*typed.TypedValue, error) {
8888
switch o := obj.(type) {
8989
case *unstructured.Unstructured:
90-
return typed.DeducedParseableType.FromUnstructured(o.UnstructuredContent())
90+
return typed.DeducedParseableType.FromUnstructured(o.UnstructuredContent(), opts...)
9191
default:
92-
return typed.DeducedParseableType.FromStructured(obj)
92+
return typed.DeducedParseableType.FromStructured(obj, opts...)
9393
}
9494
}
9595

0 commit comments

Comments
 (0)