mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-11-01 22:34:14 +00:00
Update sigs.k8s.io/structured-merge-diff to v4.0.3
This commit is contained in:
1
vendor/sigs.k8s.io/structured-merge-diff/v4/fieldpath/BUILD
generated
vendored
1
vendor/sigs.k8s.io/structured-merge-diff/v4/fieldpath/BUILD
generated
vendored
@@ -18,6 +18,7 @@ go_library(
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//vendor/github.com/json-iterator/go:go_default_library",
|
||||
"//vendor/sigs.k8s.io/structured-merge-diff/v4/schema:go_default_library",
|
||||
"//vendor/sigs.k8s.io/structured-merge-diff/v4/value:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
51
vendor/sigs.k8s.io/structured-merge-diff/v4/fieldpath/set.go
generated
vendored
51
vendor/sigs.k8s.io/structured-merge-diff/v4/fieldpath/set.go
generated
vendored
@@ -19,6 +19,8 @@ package fieldpath
|
||||
import (
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"sigs.k8s.io/structured-merge-diff/v4/schema"
|
||||
)
|
||||
|
||||
// Set identifies a set of fields.
|
||||
@@ -110,6 +112,30 @@ func (s *Set) RecursiveDifference(s2 *Set) *Set {
|
||||
}
|
||||
}
|
||||
|
||||
// EnsureNamedFieldsAreMembers returns a Set that contains all the
|
||||
// fields in s, as well as all the named fields that are typically not
|
||||
// included. For example, a set made of "a.b.c" will end-up also owning
|
||||
// "a" if it's a named fields but not "a.b" if it's a map.
|
||||
func (s *Set) EnsureNamedFieldsAreMembers(sc *schema.Schema, tr schema.TypeRef) *Set {
|
||||
members := PathElementSet{
|
||||
members: make(sortedPathElements, 0, s.Members.Size()+len(s.Children.members)),
|
||||
}
|
||||
atom, _ := sc.Resolve(tr)
|
||||
members.members = append(members.members, s.Members.members...)
|
||||
for _, node := range s.Children.members {
|
||||
// Only insert named fields.
|
||||
if node.pathElement.FieldName != nil && atom.Map != nil {
|
||||
if _, has := atom.Map.FindField(*node.pathElement.FieldName); has {
|
||||
members.Insert(node.pathElement)
|
||||
}
|
||||
}
|
||||
}
|
||||
return &Set{
|
||||
Members: members,
|
||||
Children: *s.Children.EnsureNamedFieldsAreMembers(sc, tr),
|
||||
}
|
||||
}
|
||||
|
||||
// Size returns the number of members of the set.
|
||||
func (s *Set) Size() int {
|
||||
return s.Members.Size() + s.Children.Size()
|
||||
@@ -391,6 +417,31 @@ func (s *SetNodeMap) RecursiveDifference(s2 *Set) *SetNodeMap {
|
||||
return out
|
||||
}
|
||||
|
||||
// EnsureNamedFieldsAreMembers returns a set that contains all the named fields along with the leaves.
|
||||
func (s *SetNodeMap) EnsureNamedFieldsAreMembers(sc *schema.Schema, tr schema.TypeRef) *SetNodeMap {
|
||||
out := make(sortedSetNode, 0, s.Size())
|
||||
atom, _ := sc.Resolve(tr)
|
||||
for _, member := range s.members {
|
||||
tr := schema.TypeRef{}
|
||||
if member.pathElement.FieldName != nil && atom.Map != nil {
|
||||
tr = atom.Map.ElementType
|
||||
if sf, ok := atom.Map.FindField(*member.pathElement.FieldName); ok {
|
||||
tr = sf.Type
|
||||
}
|
||||
} else if member.pathElement.Key != nil && atom.List != nil {
|
||||
tr = atom.List.ElementType
|
||||
}
|
||||
out = append(out, setNode{
|
||||
pathElement: member.pathElement,
|
||||
set: member.set.EnsureNamedFieldsAreMembers(sc, tr),
|
||||
})
|
||||
}
|
||||
|
||||
return &SetNodeMap{
|
||||
members: out,
|
||||
}
|
||||
}
|
||||
|
||||
// Iterate calls f for each PathElement in the set.
|
||||
func (s *SetNodeMap) Iterate(f func(PathElement)) {
|
||||
for _, n := range s.members {
|
||||
|
||||
12
vendor/sigs.k8s.io/structured-merge-diff/v4/merge/update.go
generated
vendored
12
vendor/sigs.k8s.io/structured-merge-diff/v4/merge/update.go
generated
vendored
@@ -226,7 +226,8 @@ func (s *Updater) prune(merged *typed.TypedValue, managers fieldpath.ManagedFiel
|
||||
return nil, fmt.Errorf("failed to convert merged object to last applied version: %v", err)
|
||||
}
|
||||
|
||||
pruned := convertedMerged.RemoveItems(lastSet.Set())
|
||||
sc, tr := convertedMerged.Schema(), convertedMerged.TypeRef()
|
||||
pruned := convertedMerged.RemoveItems(lastSet.Set().EnsureNamedFieldsAreMembers(sc, tr))
|
||||
pruned, err = s.addBackOwnedItems(convertedMerged, pruned, managers, applyingManager)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed add back owned items: %v", err)
|
||||
@@ -272,7 +273,8 @@ func (s *Updater) addBackOwnedItems(merged, pruned *typed.TypedValue, managedFie
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create field set from pruned object at version %v: %v", version, err)
|
||||
}
|
||||
pruned = merged.RemoveItems(mergedSet.Difference(prunedSet.Union(managed)))
|
||||
sc, tr := merged.Schema(), merged.TypeRef()
|
||||
pruned = merged.RemoveItems(mergedSet.EnsureNamedFieldsAreMembers(sc, tr).Difference(prunedSet.EnsureNamedFieldsAreMembers(sc, tr).Union(managed.EnsureNamedFieldsAreMembers(sc, tr))))
|
||||
}
|
||||
return pruned, nil
|
||||
}
|
||||
@@ -296,7 +298,11 @@ func (s *Updater) addBackDanglingItems(merged, pruned *typed.TypedValue, lastSet
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create field set from merged object in last applied version: %v", err)
|
||||
}
|
||||
return merged.RemoveItems(mergedSet.Difference(prunedSet).Intersection(lastSet.Set())), nil
|
||||
sc, tr := merged.Schema(), merged.TypeRef()
|
||||
prunedSet = prunedSet.EnsureNamedFieldsAreMembers(sc, tr)
|
||||
mergedSet = mergedSet.EnsureNamedFieldsAreMembers(sc, tr)
|
||||
last := lastSet.Set().EnsureNamedFieldsAreMembers(sc, tr)
|
||||
return merged.RemoveItems(mergedSet.Difference(prunedSet).Intersection(last)), nil
|
||||
}
|
||||
|
||||
// reconcileManagedFieldsWithSchemaChanges reconciles the managed fields with any changes to the
|
||||
|
||||
4
vendor/sigs.k8s.io/structured-merge-diff/v4/typed/tofieldset.go
generated
vendored
4
vendor/sigs.k8s.io/structured-merge-diff/v4/typed/tofieldset.go
generated
vendored
@@ -137,7 +137,9 @@ func (v *toFieldSetWalker) visitMapItems(t *schema.Map, m value.Map) (errs Valid
|
||||
v2 := v.prepareDescent(pe, tr)
|
||||
v2.value = val
|
||||
errs = append(errs, v2.toFieldSet()...)
|
||||
if _, ok := t.FindField(key); !ok {
|
||||
if val.IsNull() || (val.IsMap() && val.AsMap().Length() == 0) {
|
||||
v2.set.Insert(v2.path)
|
||||
} else if _, ok := t.FindField(key); !ok {
|
||||
v2.set.Insert(v2.path)
|
||||
}
|
||||
v.finishDescent(v2)
|
||||
|
||||
2
vendor/sigs.k8s.io/structured-merge-diff/v4/typed/validate.go
generated
vendored
2
vendor/sigs.k8s.io/structured-merge-diff/v4/typed/validate.go
generated
vendored
@@ -92,7 +92,7 @@ func validateScalar(t *schema.Scalar, v value.Value, prefix string) (errs Valida
|
||||
case schema.Numeric:
|
||||
if !v.IsFloat() && !v.IsInt() {
|
||||
// TODO: should the schema separate int and float?
|
||||
return errorf("%vexpected numeric (int or float), got %T", prefix, v)
|
||||
return errorf("%vexpected numeric (int or float), got %T", prefix, v.Unstructured())
|
||||
}
|
||||
case schema.String:
|
||||
if !v.IsString() {
|
||||
|
||||
10
vendor/sigs.k8s.io/structured-merge-diff/v4/value/reflectcache.go
generated
vendored
10
vendor/sigs.k8s.io/structured-merge-diff/v4/value/reflectcache.go
generated
vendored
@@ -70,11 +70,11 @@ func (f *FieldCacheEntry) CanOmit(fieldVal reflect.Value) bool {
|
||||
return f.isOmitEmpty && (safeIsNil(fieldVal) || isZero(fieldVal))
|
||||
}
|
||||
|
||||
// GetUsing returns the field identified by this FieldCacheEntry from the provided struct.
|
||||
// GetFrom returns the field identified by this FieldCacheEntry from the provided struct.
|
||||
func (f *FieldCacheEntry) GetFrom(structVal reflect.Value) reflect.Value {
|
||||
// field might be nested within 'inline' structs
|
||||
for _, elem := range f.fieldPath {
|
||||
structVal = structVal.FieldByIndex(elem)
|
||||
structVal = dereference(structVal).FieldByIndex(elem)
|
||||
}
|
||||
return structVal
|
||||
}
|
||||
@@ -150,7 +150,11 @@ func buildStructCacheEntry(t reflect.Type, infos map[string]*FieldCacheEntry, fi
|
||||
continue
|
||||
}
|
||||
if isInline {
|
||||
buildStructCacheEntry(field.Type, infos, append(fieldPath, field.Index))
|
||||
e := field.Type
|
||||
if field.Type.Kind() == reflect.Ptr {
|
||||
e = field.Type.Elem()
|
||||
}
|
||||
buildStructCacheEntry(e, infos, append(fieldPath, field.Index))
|
||||
continue
|
||||
}
|
||||
info := &FieldCacheEntry{JsonName: jsonName, isOmitEmpty: isOmitempty, fieldPath: append(fieldPath, field.Index), fieldType: field.Type}
|
||||
|
||||
Reference in New Issue
Block a user