mirror of
https://github.com/kubernetes-sigs/prometheus-adapter.git
synced 2026-04-07 02:07:58 +00:00
vendor: revendor
This commit is contained in:
parent
269295a414
commit
9f0440be0f
669 changed files with 58447 additions and 20021 deletions
47
vendor/sigs.k8s.io/structured-merge-diff/v4/merge/update.go
generated
vendored
47
vendor/sigs.k8s.io/structured-merge-diff/v4/merge/update.go
generated
vendored
|
|
@ -122,13 +122,16 @@ func (s *Updater) update(oldObject, newObject *typed.TypedValue, version fieldpa
|
|||
// this is a CREATE call).
|
||||
func (s *Updater) Update(liveObject, newObject *typed.TypedValue, version fieldpath.APIVersion, managers fieldpath.ManagedFields, manager string) (*typed.TypedValue, fieldpath.ManagedFields, error) {
|
||||
var err error
|
||||
managers, err = s.reconcileManagedFieldsWithSchemaChanges(liveObject, managers)
|
||||
if err != nil {
|
||||
return nil, fieldpath.ManagedFields{}, err
|
||||
}
|
||||
if s.enableUnions {
|
||||
newObject, err = liveObject.NormalizeUnions(newObject)
|
||||
if err != nil {
|
||||
return nil, fieldpath.ManagedFields{}, err
|
||||
}
|
||||
}
|
||||
managers = shallowCopyManagers(managers)
|
||||
managers, compare, err := s.update(liveObject, newObject, version, managers, manager, true)
|
||||
if err != nil {
|
||||
return nil, fieldpath.ManagedFields{}, err
|
||||
|
|
@ -157,8 +160,11 @@ func (s *Updater) Update(liveObject, newObject *typed.TypedValue, version fieldp
|
|||
// and return it. If the object hasn't changed, nil is returned (the
|
||||
// managers can still have changed though).
|
||||
func (s *Updater) Apply(liveObject, configObject *typed.TypedValue, version fieldpath.APIVersion, managers fieldpath.ManagedFields, manager string, force bool) (*typed.TypedValue, fieldpath.ManagedFields, error) {
|
||||
managers = shallowCopyManagers(managers)
|
||||
var err error
|
||||
managers, err = s.reconcileManagedFieldsWithSchemaChanges(liveObject, managers)
|
||||
if err != nil {
|
||||
return nil, fieldpath.ManagedFields{}, err
|
||||
}
|
||||
if s.enableUnions {
|
||||
configObject, err = configObject.NormalizeUnionsApply(configObject)
|
||||
if err != nil {
|
||||
|
|
@ -204,14 +210,6 @@ func (s *Updater) Apply(liveObject, configObject *typed.TypedValue, version fiel
|
|||
return newObject, managers, nil
|
||||
}
|
||||
|
||||
func shallowCopyManagers(managers fieldpath.ManagedFields) fieldpath.ManagedFields {
|
||||
newManagers := fieldpath.ManagedFields{}
|
||||
for manager, set := range managers {
|
||||
newManagers[manager] = set
|
||||
}
|
||||
return newManagers
|
||||
}
|
||||
|
||||
// prune will remove a field, list or map item, iff:
|
||||
// * applyingManager applied it last time
|
||||
// * applyingManager didn't apply it this time
|
||||
|
|
@ -300,3 +298,32 @@ func (s *Updater) addBackDanglingItems(merged, pruned *typed.TypedValue, lastSet
|
|||
}
|
||||
return merged.RemoveItems(mergedSet.Difference(prunedSet).Intersection(lastSet.Set())), nil
|
||||
}
|
||||
|
||||
// reconcileManagedFieldsWithSchemaChanges reconciles the managed fields with any changes to the
|
||||
// object's schema since the managed fields were written.
|
||||
//
|
||||
// Supports:
|
||||
// - changing types from atomic to granular
|
||||
// - changing types from granular to atomic
|
||||
func (s *Updater) reconcileManagedFieldsWithSchemaChanges(liveObject *typed.TypedValue, managers fieldpath.ManagedFields) (fieldpath.ManagedFields, error) {
|
||||
result := fieldpath.ManagedFields{}
|
||||
for manager, versionedSet := range managers {
|
||||
tv, err := s.Converter.Convert(liveObject, versionedSet.APIVersion())
|
||||
if s.Converter.IsMissingVersionError(err) { // okay to skip, obsolete versions will be deleted automatically anyway
|
||||
continue
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
reconciled, err := typed.ReconcileFieldSetWithSchema(versionedSet.Set(), tv)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if reconciled != nil {
|
||||
result[manager] = fieldpath.NewVersionedSet(reconciled, versionedSet.APIVersion(), versionedSet.Applied())
|
||||
} else {
|
||||
result[manager] = versionedSet
|
||||
}
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
|
|
|||
2
vendor/sigs.k8s.io/structured-merge-diff/v4/schema/elements.go
generated
vendored
2
vendor/sigs.k8s.io/structured-merge-diff/v4/schema/elements.go
generated
vendored
|
|
@ -196,6 +196,8 @@ type StructField struct {
|
|||
Name string `yaml:"name,omitempty"`
|
||||
// Type is the field type.
|
||||
Type TypeRef `yaml:"type,omitempty"`
|
||||
// Default value for the field, nil if not present.
|
||||
Default interface{} `yaml:"default,omitempty"`
|
||||
}
|
||||
|
||||
// List represents a type which contains a zero or more elements, all of the
|
||||
|
|
|
|||
5
vendor/sigs.k8s.io/structured-merge-diff/v4/schema/equals.go
generated
vendored
5
vendor/sigs.k8s.io/structured-merge-diff/v4/schema/equals.go
generated
vendored
|
|
@ -16,6 +16,8 @@ limitations under the License.
|
|||
|
||||
package schema
|
||||
|
||||
import "reflect"
|
||||
|
||||
// Equals returns true iff the two Schemas are equal.
|
||||
func (a *Schema) Equals(b *Schema) bool {
|
||||
if a == nil || b == nil {
|
||||
|
|
@ -168,6 +170,9 @@ func (a *StructField) Equals(b *StructField) bool {
|
|||
if a.Name != b.Name {
|
||||
return false
|
||||
}
|
||||
if !reflect.DeepEqual(a.Default, b.Default) {
|
||||
return false
|
||||
}
|
||||
return a.Type.Equals(&b.Type)
|
||||
}
|
||||
|
||||
|
|
|
|||
13
vendor/sigs.k8s.io/structured-merge-diff/v4/schema/schemaschema.go
generated
vendored
13
vendor/sigs.k8s.io/structured-merge-diff/v4/schema/schemaschema.go
generated
vendored
|
|
@ -125,6 +125,9 @@ var SchemaSchemaYAML = `types:
|
|||
- name: type
|
||||
type:
|
||||
namedType: typeRef
|
||||
- name: default
|
||||
type:
|
||||
namedType: __untyped_atomic_
|
||||
- name: list
|
||||
map:
|
||||
fields:
|
||||
|
|
@ -145,4 +148,14 @@ var SchemaSchemaYAML = `types:
|
|||
- name: elementRelationship
|
||||
type:
|
||||
scalar: string
|
||||
- name: __untyped_atomic_
|
||||
scalar: untyped
|
||||
list:
|
||||
elementType:
|
||||
namedType: __untyped_atomic_
|
||||
elementRelationship: atomic
|
||||
map:
|
||||
elementType:
|
||||
namedType: __untyped_atomic_
|
||||
elementRelationship: atomic
|
||||
`
|
||||
|
|
|
|||
28
vendor/sigs.k8s.io/structured-merge-diff/v4/typed/helpers.go
generated
vendored
28
vendor/sigs.k8s.io/structured-merge-diff/v4/typed/helpers.go
generated
vendored
|
|
@ -180,11 +180,23 @@ func mapValue(a value.Allocator, val value.Value) (value.Map, error) {
|
|||
return val.AsMapUsing(a), nil
|
||||
}
|
||||
|
||||
func keyedAssociativeListItemToPathElement(a value.Allocator, list *schema.List, index int, child value.Value) (fieldpath.PathElement, error) {
|
||||
func getAssociativeKeyDefault(s *schema.Schema, list *schema.List, fieldName string) (interface{}, error) {
|
||||
atom, ok := s.Resolve(list.ElementType)
|
||||
if !ok {
|
||||
return nil, errors.New("invalid elementType for list")
|
||||
}
|
||||
if atom.Map == nil {
|
||||
return nil, errors.New("associative list may not have non-map types")
|
||||
}
|
||||
// If the field is not found, we can assume there is no default.
|
||||
field, _ := atom.Map.FindField(fieldName)
|
||||
return field.Default, nil
|
||||
}
|
||||
|
||||
func keyedAssociativeListItemToPathElement(a value.Allocator, s *schema.Schema, list *schema.List, index int, child value.Value) (fieldpath.PathElement, error) {
|
||||
pe := fieldpath.PathElement{}
|
||||
if child.IsNull() {
|
||||
// For now, the keys are required which means that null entries
|
||||
// are illegal.
|
||||
// null entries are illegal.
|
||||
return pe, errors.New("associative list with keys may not have a null element")
|
||||
}
|
||||
if !child.IsMap() {
|
||||
|
|
@ -196,8 +208,12 @@ func keyedAssociativeListItemToPathElement(a value.Allocator, list *schema.List,
|
|||
for _, fieldName := range list.Keys {
|
||||
if val, ok := m.Get(fieldName); ok {
|
||||
keyMap = append(keyMap, value.Field{Name: fieldName, Value: val})
|
||||
} else if def, err := getAssociativeKeyDefault(s, list, fieldName); err != nil {
|
||||
return pe, fmt.Errorf("couldn't find default value for %v: %v", fieldName, err)
|
||||
} else if def != nil {
|
||||
keyMap = append(keyMap, value.Field{Name: fieldName, Value: value.NewValueInterface(def)})
|
||||
} else {
|
||||
return pe, fmt.Errorf("associative list with keys has an element that omits key field %q", fieldName)
|
||||
return pe, fmt.Errorf("associative list with keys has an element that omits key field %q (and doesn't have default value)", fieldName)
|
||||
}
|
||||
}
|
||||
keyMap.Sort()
|
||||
|
|
@ -225,10 +241,10 @@ func setItemToPathElement(list *schema.List, index int, child value.Value) (fiel
|
|||
}
|
||||
}
|
||||
|
||||
func listItemToPathElement(a value.Allocator, list *schema.List, index int, child value.Value) (fieldpath.PathElement, error) {
|
||||
func listItemToPathElement(a value.Allocator, s *schema.Schema, list *schema.List, index int, child value.Value) (fieldpath.PathElement, error) {
|
||||
if list.ElementRelationship == schema.Associative {
|
||||
if len(list.Keys) > 0 {
|
||||
return keyedAssociativeListItemToPathElement(a, list, index, child)
|
||||
return keyedAssociativeListItemToPathElement(a, s, list, index, child)
|
||||
}
|
||||
|
||||
// If there's no keys, then we must be a set of primitives.
|
||||
|
|
|
|||
4
vendor/sigs.k8s.io/structured-merge-diff/v4/typed/merge.go
generated
vendored
4
vendor/sigs.k8s.io/structured-merge-diff/v4/typed/merge.go
generated
vendored
|
|
@ -183,7 +183,7 @@ func (w *mergingWalker) visitListItems(t *schema.List, lhs, rhs value.List) (err
|
|||
if rhs != nil {
|
||||
for i := 0; i < rhs.Length(); i++ {
|
||||
child := rhs.At(i)
|
||||
pe, err := listItemToPathElement(w.allocator, t, i, child)
|
||||
pe, err := listItemToPathElement(w.allocator, w.schema, t, i, child)
|
||||
if err != nil {
|
||||
errs = append(errs, errorf("rhs: element %v: %v", i, err.Error())...)
|
||||
// If we can't construct the path element, we can't
|
||||
|
|
@ -204,7 +204,7 @@ func (w *mergingWalker) visitListItems(t *schema.List, lhs, rhs value.List) (err
|
|||
if lhs != nil {
|
||||
for i := 0; i < lhs.Length(); i++ {
|
||||
child := lhs.At(i)
|
||||
pe, err := listItemToPathElement(w.allocator, t, i, child)
|
||||
pe, err := listItemToPathElement(w.allocator, w.schema, t, i, child)
|
||||
if err != nil {
|
||||
errs = append(errs, errorf("lhs: element %v: %v", i, err.Error())...)
|
||||
// If we can't construct the path element, we can't
|
||||
|
|
|
|||
295
vendor/sigs.k8s.io/structured-merge-diff/v4/typed/reconcile_schema.go
generated
vendored
Normal file
295
vendor/sigs.k8s.io/structured-merge-diff/v4/typed/reconcile_schema.go
generated
vendored
Normal file
|
|
@ -0,0 +1,295 @@
|
|||
/*
|
||||
Copyright 2018 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package typed
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"sigs.k8s.io/structured-merge-diff/v4/fieldpath"
|
||||
"sigs.k8s.io/structured-merge-diff/v4/schema"
|
||||
)
|
||||
|
||||
var fmPool = sync.Pool{
|
||||
New: func() interface{} { return &reconcileWithSchemaWalker{} },
|
||||
}
|
||||
|
||||
func (v *reconcileWithSchemaWalker) finished() {
|
||||
v.fieldSet = nil
|
||||
v.schema = nil
|
||||
v.value = nil
|
||||
v.typeRef = schema.TypeRef{}
|
||||
v.path = nil
|
||||
v.toRemove = nil
|
||||
v.toAdd = nil
|
||||
fmPool.Put(v)
|
||||
}
|
||||
|
||||
type reconcileWithSchemaWalker struct {
|
||||
value *TypedValue // root of the live object
|
||||
schema *schema.Schema // root of the live schema
|
||||
|
||||
// state of node being visited by walker
|
||||
fieldSet *fieldpath.Set
|
||||
typeRef schema.TypeRef
|
||||
path fieldpath.Path
|
||||
isAtomic bool
|
||||
|
||||
// the accumulated diff to perform to apply reconciliation
|
||||
toRemove *fieldpath.Set // paths to remove recursively
|
||||
toAdd *fieldpath.Set // paths to add after any removals
|
||||
|
||||
// Allocate only as many walkers as needed for the depth by storing them here.
|
||||
spareWalkers *[]*reconcileWithSchemaWalker
|
||||
}
|
||||
|
||||
func (v *reconcileWithSchemaWalker) prepareDescent(pe fieldpath.PathElement, tr schema.TypeRef) *reconcileWithSchemaWalker {
|
||||
if v.spareWalkers == nil {
|
||||
// first descent.
|
||||
v.spareWalkers = &[]*reconcileWithSchemaWalker{}
|
||||
}
|
||||
var v2 *reconcileWithSchemaWalker
|
||||
if n := len(*v.spareWalkers); n > 0 {
|
||||
v2, *v.spareWalkers = (*v.spareWalkers)[n-1], (*v.spareWalkers)[:n-1]
|
||||
} else {
|
||||
v2 = &reconcileWithSchemaWalker{}
|
||||
}
|
||||
*v2 = *v
|
||||
v2.typeRef = tr
|
||||
v2.path = append(v.path, pe)
|
||||
v2.value = v.value
|
||||
return v2
|
||||
}
|
||||
|
||||
func (v *reconcileWithSchemaWalker) finishDescent(v2 *reconcileWithSchemaWalker) {
|
||||
v2.fieldSet = nil
|
||||
v2.schema = nil
|
||||
v2.value = nil
|
||||
v2.typeRef = schema.TypeRef{}
|
||||
if cap(v2.path) < 20 { // recycle slices that do not have unexpectedly high capacity
|
||||
v2.path = v2.path[:0]
|
||||
} else {
|
||||
v2.path = nil
|
||||
}
|
||||
|
||||
// merge any accumulated changes into parent walker
|
||||
if v2.toRemove != nil {
|
||||
if v.toRemove == nil {
|
||||
v.toRemove = v2.toRemove
|
||||
} else {
|
||||
v.toRemove = v.toRemove.Union(v2.toRemove)
|
||||
}
|
||||
}
|
||||
if v2.toAdd != nil {
|
||||
if v.toAdd == nil {
|
||||
v.toAdd = v2.toAdd
|
||||
} else {
|
||||
v.toAdd = v.toAdd.Union(v2.toAdd)
|
||||
}
|
||||
}
|
||||
v2.toRemove = nil
|
||||
v2.toAdd = nil
|
||||
|
||||
// if the descent caused a realloc, ensure that we reuse the buffer
|
||||
// for the next sibling.
|
||||
*v.spareWalkers = append(*v.spareWalkers, v2)
|
||||
}
|
||||
|
||||
// ReconcileFieldSetWithSchema reconciles the a field set with any changes to the
|
||||
//// object's schema since the field set was written. Returns the reconciled field set, or nil of
|
||||
// no changes were made to the field set.
|
||||
//
|
||||
// Supports:
|
||||
// - changing types from atomic to granular
|
||||
// - changing types from granular to atomic
|
||||
func ReconcileFieldSetWithSchema(fieldset *fieldpath.Set, tv *TypedValue) (*fieldpath.Set, error) {
|
||||
v := fmPool.Get().(*reconcileWithSchemaWalker)
|
||||
v.fieldSet = fieldset
|
||||
v.value = tv
|
||||
|
||||
v.schema = tv.schema
|
||||
v.typeRef = tv.typeRef
|
||||
|
||||
// We don't reconcile deduced types, which are primarily for use by unstructured CRDs. Deduced
|
||||
// types do not support atomic or granular tags. Nor does the dynamic schema deduction
|
||||
// interact well with the reconcile logic.
|
||||
if v.schema == DeducedParseableType.Schema {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
defer v.finished()
|
||||
errs := v.reconcile()
|
||||
|
||||
if len(errs) > 0 {
|
||||
return nil, fmt.Errorf("errors reconciling field set with schema: %s", errs.Error())
|
||||
}
|
||||
|
||||
// If there are any accumulated changes, apply them
|
||||
if v.toAdd != nil || v.toRemove != nil {
|
||||
out := v.fieldSet
|
||||
if v.toRemove != nil {
|
||||
out = out.RecursiveDifference(v.toRemove)
|
||||
}
|
||||
if v.toAdd != nil {
|
||||
out = out.Union(v.toAdd)
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (v *reconcileWithSchemaWalker) reconcile() (errs ValidationErrors) {
|
||||
a, ok := v.schema.Resolve(v.typeRef)
|
||||
if !ok {
|
||||
errs = append(errs, errorf("could not resolve %v", v.typeRef)...)
|
||||
return
|
||||
}
|
||||
return handleAtom(a, v.typeRef, v)
|
||||
}
|
||||
|
||||
func (v *reconcileWithSchemaWalker) doScalar(_ *schema.Scalar) (errs ValidationErrors) {
|
||||
return errs
|
||||
}
|
||||
|
||||
func (v *reconcileWithSchemaWalker) visitListItems(t *schema.List, element *fieldpath.Set) (errs ValidationErrors) {
|
||||
handleElement := func(pe fieldpath.PathElement, isMember bool) {
|
||||
var hasChildren bool
|
||||
v2 := v.prepareDescent(pe, t.ElementType)
|
||||
v2.fieldSet, hasChildren = element.Children.Get(pe)
|
||||
v2.isAtomic = isMember && !hasChildren
|
||||
errs = append(errs, v2.reconcile()...)
|
||||
v.finishDescent(v2)
|
||||
}
|
||||
element.Children.Iterate(func(pe fieldpath.PathElement) {
|
||||
if element.Members.Has(pe) {
|
||||
return
|
||||
}
|
||||
handleElement(pe, false)
|
||||
})
|
||||
element.Members.Iterate(func(pe fieldpath.PathElement) {
|
||||
handleElement(pe, true)
|
||||
})
|
||||
return errs
|
||||
}
|
||||
|
||||
func (v *reconcileWithSchemaWalker) doList(t *schema.List) (errs ValidationErrors) {
|
||||
// reconcile lists changed from granular to atomic
|
||||
if !v.isAtomic && t.ElementRelationship == schema.Atomic {
|
||||
v.toRemove = fieldpath.NewSet(v.path) // remove all root and all children fields
|
||||
v.toAdd = fieldpath.NewSet(v.path) // add the root of the atomic
|
||||
return errs
|
||||
}
|
||||
// reconcile lists changed from atomic to granular
|
||||
if v.isAtomic && t.ElementRelationship == schema.Associative {
|
||||
v.toAdd, errs = buildGranularFieldSet(v.path, v.value)
|
||||
if errs != nil {
|
||||
return errs
|
||||
}
|
||||
}
|
||||
if v.fieldSet != nil {
|
||||
errs = v.visitListItems(t, v.fieldSet)
|
||||
}
|
||||
return errs
|
||||
}
|
||||
|
||||
func (v *reconcileWithSchemaWalker) visitMapItems(t *schema.Map, element *fieldpath.Set) (errs ValidationErrors) {
|
||||
handleElement := func(pe fieldpath.PathElement, isMember bool) {
|
||||
var hasChildren bool
|
||||
if tr, ok := typeRefAtPath(t, pe); ok { // ignore fields not in the schema
|
||||
v2 := v.prepareDescent(pe, tr)
|
||||
v2.fieldSet, hasChildren = element.Children.Get(pe)
|
||||
v2.isAtomic = isMember && !hasChildren
|
||||
errs = append(errs, v2.reconcile()...)
|
||||
v.finishDescent(v2)
|
||||
}
|
||||
}
|
||||
element.Children.Iterate(func(pe fieldpath.PathElement) {
|
||||
if element.Members.Has(pe) {
|
||||
return
|
||||
}
|
||||
handleElement(pe, false)
|
||||
})
|
||||
element.Members.Iterate(func(pe fieldpath.PathElement) {
|
||||
handleElement(pe, true)
|
||||
})
|
||||
|
||||
return errs
|
||||
}
|
||||
|
||||
func (v *reconcileWithSchemaWalker) doMap(t *schema.Map) (errs ValidationErrors) {
|
||||
// reconcile maps and structs changed from granular to atomic
|
||||
if !v.isAtomic && t.ElementRelationship == schema.Atomic {
|
||||
if v.fieldSet != nil && v.fieldSet.Size() > 0 {
|
||||
v.toRemove = fieldpath.NewSet(v.path) // remove all root and all children fields
|
||||
v.toAdd = fieldpath.NewSet(v.path) // add the root of the atomic
|
||||
}
|
||||
return errs
|
||||
}
|
||||
// reconcile maps changed from atomic to granular
|
||||
if v.isAtomic && (t.ElementRelationship == schema.Separable || t.ElementRelationship == "") {
|
||||
v.toAdd, errs = buildGranularFieldSet(v.path, v.value)
|
||||
if errs != nil {
|
||||
return errs
|
||||
}
|
||||
}
|
||||
if v.fieldSet != nil {
|
||||
errs = v.visitMapItems(t, v.fieldSet)
|
||||
}
|
||||
return errs
|
||||
}
|
||||
|
||||
func buildGranularFieldSet(path fieldpath.Path, value *TypedValue) (*fieldpath.Set, ValidationErrors) {
|
||||
|
||||
valueFieldSet, err := value.ToFieldSet()
|
||||
if err != nil {
|
||||
return nil, errorf("toFieldSet: %v", err)
|
||||
}
|
||||
if valueFieldSetAtPath, ok := fieldSetAtPath(valueFieldSet, path); ok {
|
||||
result := fieldpath.NewSet(path)
|
||||
resultAtPath := descendToPath(result, path)
|
||||
*resultAtPath = *valueFieldSetAtPath
|
||||
return result, nil
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func fieldSetAtPath(node *fieldpath.Set, path fieldpath.Path) (*fieldpath.Set, bool) {
|
||||
ok := true
|
||||
for _, pe := range path {
|
||||
if node, ok = node.Children.Get(pe); !ok {
|
||||
break
|
||||
}
|
||||
}
|
||||
return node, ok
|
||||
}
|
||||
|
||||
func descendToPath(node *fieldpath.Set, path fieldpath.Path) *fieldpath.Set {
|
||||
for _, pe := range path {
|
||||
node = node.Children.Descend(pe)
|
||||
}
|
||||
return node
|
||||
}
|
||||
|
||||
func typeRefAtPath(t *schema.Map, pe fieldpath.PathElement) (schema.TypeRef, bool) {
|
||||
tr := t.ElementType
|
||||
if pe.FieldName != nil {
|
||||
if sf, ok := t.FindField(*pe.FieldName); ok {
|
||||
tr = sf.Type
|
||||
}
|
||||
}
|
||||
return tr, tr != schema.TypeRef{}
|
||||
}
|
||||
2
vendor/sigs.k8s.io/structured-merge-diff/v4/typed/remove.go
generated
vendored
2
vendor/sigs.k8s.io/structured-merge-diff/v4/typed/remove.go
generated
vendored
|
|
@ -57,7 +57,7 @@ func (w *removingWalker) doList(t *schema.List) (errs ValidationErrors) {
|
|||
for iter.Next() {
|
||||
i, item := iter.Item()
|
||||
// Ignore error because we have already validated this list
|
||||
pe, _ := listItemToPathElement(w.allocator, t, i, item)
|
||||
pe, _ := listItemToPathElement(w.allocator, w.schema, t, i, item)
|
||||
path, _ := fieldpath.MakePath(pe)
|
||||
if w.toRemove.Has(path) {
|
||||
continue
|
||||
|
|
|
|||
2
vendor/sigs.k8s.io/structured-merge-diff/v4/typed/tofieldset.go
generated
vendored
2
vendor/sigs.k8s.io/structured-merge-diff/v4/typed/tofieldset.go
generated
vendored
|
|
@ -96,7 +96,7 @@ func (v *toFieldSetWalker) doScalar(t *schema.Scalar) ValidationErrors {
|
|||
func (v *toFieldSetWalker) visitListItems(t *schema.List, list value.List) (errs ValidationErrors) {
|
||||
for i := 0; i < list.Length(); i++ {
|
||||
child := list.At(i)
|
||||
pe, _ := listItemToPathElement(v.allocator, t, i, child)
|
||||
pe, _ := listItemToPathElement(v.allocator, v.schema, t, i, child)
|
||||
v2 := v.prepareDescent(pe, t.ElementType)
|
||||
v2.value = child
|
||||
errs = append(errs, v2.toFieldSet()...)
|
||||
|
|
|
|||
5
vendor/sigs.k8s.io/structured-merge-diff/v4/typed/typed.go
generated
vendored
5
vendor/sigs.k8s.io/structured-merge-diff/v4/typed/typed.go
generated
vendored
|
|
@ -71,6 +71,11 @@ func (tv TypedValue) AsValue() value.Value {
|
|||
return tv.value
|
||||
}
|
||||
|
||||
// Schema gets the schema from the TypedValue.
|
||||
func (tv TypedValue) Schema() *schema.Schema {
|
||||
return tv.schema
|
||||
}
|
||||
|
||||
// Validate returns an error with a list of every spec violation.
|
||||
func (tv TypedValue) Validate() error {
|
||||
w := tv.walker()
|
||||
|
|
|
|||
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
|
|
@ -123,7 +123,7 @@ func (v *validatingObjectWalker) visitListItems(t *schema.List, list value.List)
|
|||
pe.Index = &i
|
||||
} else {
|
||||
var err error
|
||||
pe, err = listItemToPathElement(v.allocator, t, i, child)
|
||||
pe, err = listItemToPathElement(v.allocator, v.schema, t, i, child)
|
||||
if err != nil {
|
||||
errs = append(errs, errorf("element %v: %v", i, err.Error())...)
|
||||
// If we can't construct the path element, we can't
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue