mirror of
https://github.com/ceph/ceph-csi.git
synced 2025-06-14 18:53:35 +00:00
rebase: bump k8s.io/kubernetes from 1.26.2 to 1.27.2
Bumps [k8s.io/kubernetes](https://github.com/kubernetes/kubernetes) from 1.26.2 to 1.27.2. - [Release notes](https://github.com/kubernetes/kubernetes/releases) - [Commits](https://github.com/kubernetes/kubernetes/compare/v1.26.2...v1.27.2) --- updated-dependencies: - dependency-name: k8s.io/kubernetes dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
This commit is contained in:
committed by
mergify[bot]
parent
0e79135419
commit
07b05616a0
go.modgo.summodules.txt
vendor
github.com
NYTimes
gziphandler
antlr
antlr4
runtime
Go
antlr
LICENSEatn.goatn_config.goatn_config_set.goatn_deserialization_options.goatn_deserializer.goatn_simulator.goatn_state.goatn_type.gochar_stream.gocommon_token_factory.gocommon_token_stream.godfa.godfa_serializer.godfa_state.godiagnostic_error_listener.goerror_listener.goerror_strategy.goerrors.gofile_stream.goinput_stream.goint_stream.gointerval_set.golexer.golexer_action.golexer_action_executor.golexer_atn_simulator.goll1_analyzer.goparser.goparser_atn_simulator.goparser_rule_context.goprediction_context.goprediction_mode.gorecognizer.gorule_context.gosemantic_context.gotoken.gotoken_source.gotoken_stream.gotokenstream_rewriter.gotrace_listener.gotransition.gotree.gotrees.goutils.goutils_set.go
aws
aws-sdk-go
private
protocol
ec2query
service
coreos
go-semver
go-systemd
go-openapi
gogo
protobuf
gogoproto
protoc-gen-gogo
google
cel-go
LICENSE
cel
checker
common
BUILD.bazel
containers
cost.godebug
doc.goerror.goerrors.golocation.gooperators
overloads
runes
source.gotypes
BUILD.bazelany_value.gobool.gobytes.gocompare.godoc.godouble.goduration.goerr.goint.goiterator.gojson_value.golist.gomap.gonull.goobject.gooverflow.go
pb
provider.goref
string.gotimestamp.gotraits
BUILD.bazelcomparer.gocontainer.gofield_tester.goindexer.goiterator.golister.gomapper.gomatcher.gomath.goreceiver.gosizer.gotraits.go
type.gouint.gounknown.goutil.goext
interpreter
BUILD.bazelactivation.goattribute_patterns.goattributes.gocoster.godecorators.godispatcher.goevalstate.go
functions
interpretable.gointerpreter.gooptimizations.goplanner.goprune.goruntimecost.goparser
onsi
gomega
gcustom
stoewer
go.etcd.io
etcd
api
v3
client
pkg
v3
LICENSE
fileutil
dir_unix.godir_windows.godoc.gofilereader.gofileutil.golock.golock_flock.golock_linux.golock_plan9.golock_solaris.golock_unix.golock_windows.gopreallocate.gopreallocate_darwin.gopreallocate_unix.gopreallocate_unsupported.gopurge.goread_dir.gosync.gosync_darwin.gosync_linux.go
logutil
systemd
tlsutil
transport
doc.gokeepalive_listener.golimit_listen.golistener.golistener_opts.golistener_tls.gosockopt.gosockopt_solaris.gosockopt_unix.gosockopt_windows.gotimeout_conn.gotimeout_dialer.gotimeout_listener.gotimeout_transport.gotls.gotransport.gounix_listener.go
types
v3
go.opentelemetry.io
contrib
instrumentation
google.golang.org
grpc
net
http
otelhttp
go.uber.org
zap
zapgrpc
golang.org
x
crypto
cryptobyte
nacl
secretbox
salsa20
net
sync
text
google.golang.org
genproto
googleapis
grpc
resolver
manual
protobuf
types
gopkg.in
natefinch
k8s.io
apimachinery
pkg
apis
meta
util
waitgroup
apiserver
pkg
admission
cel
plugin
namespace
lifecycle
validatingadmissionpolicy
OWNERSadmission.gocompiler.gocontroller.gocontroller_reconcile.goinitializer.gointerface.go
internal
matching
policy_decision.govalidator.gowebhook
validating
apis
audit
config
doc.goregister.gotypes.go
v1
defaults.godoc.goregister.gotypes.gozz_generated.conversion.gozz_generated.deepcopy.gozz_generated.defaults.go
validation
zz_generated.deepcopy.goflowcontrol
bootstrap
audit
authentication
authenticator
authenticatorfactory
group
request
anonymous
bearertoken
headerrequest
union
websocket
x509
serviceaccount
token
authorization
cel
endpoints
deprecation
discovery
doc.gofilterlatency
filters
OWNERSaudit.goaudit_init.goauthentication.goauthn_audit.goauthorization.gocachecontrol.godoc.goimpersonation.gometrics.gomux_discovery_complete.gorequest_deadline.gorequest_received_time.gorequestinfo.gostorageversion.gotraces.gowarning.gowebhook_duration.go
groupversion.gohandlers
create.godelete.godoc.go
installer.gofieldmanager
OWNERSadmission.gobuildmanagerinfo.gocapmanagers.goendpoints.yamlequality.gofieldmanager.go
internal
lastappliedmanager.golastappliedupdater.gomanagedfieldsupdater.gonode.yamlpod.yamlscalehandler.goskipnonapplied.gostripmeta.gostructuredmerge.gotypeconverter.goversionconverter.gofinisher
get.gohelpers.gometrics
namer.gonegotiation
patch.goresponse.goresponsewriters
rest.gotrace_util.goupdate.gowatch.gometrics
openapi
responsewriter
warning
registry
server
config.goconfig_selfclient.godeleted_kinds.godeprecated_insecure_serving.godoc.go
dynamiccertificates
cert_key.goclient_ca.goconfigmap_cafile_content.godynamic_cafile_content.godynamic_serving_content.godynamic_sni_content.gointerfaces.gonamed_certificates.gostatic_content.gotlsconfig.gounion_content.goutil.go
filters
OWNERScontent_type.gocors.godoc.gogoaway.gohsts.golongrunning.gomaxinflight.gopriority-and-fairness.gotimeout.gowaitgroup.gowith_retry_after.gowrap.go
genericapiserver.gohandler.gohealthz.gohealthz
hooks.gohttplog
lifecycle_signals.gomux
options
OWNERSadmission.goapi_enablement.goaudit.goauthentication.goauthentication_dynamic_request_header.goauthorization.gocoreapi.godeprecated_insecure_serving.godoc.goegress_selector.go
plugins.goencryptionconfig
etcd.gofeature.gorecommended.goserver_run_options.goserving.goserving_unix.goserving_windows.goserving_with_loopback.gotracing.goresourceconfig
routes
secure_serving.gosignal.gosignal_posix.gosignal_windows.gostorage
storage
OWNERSapi_object_versioner.go
cacher
continue.godoc.goerrors.goerrors
etcd3
OWNERScompact.goerrors.goevent.gohealthcheck.golatency_tracker.golease_manager.gologger.go
interfaces.goselection_predicate.gometrics
store.gowatcher.gostoragebackend
util.govalue
OWNERS
encrypt
metrics.gotransformer.gostorageversion
util
apihelpers
dryrun
flowcontrol
OWNERSapf_context.goapf_controller.goapf_controller_debug.goapf_filter.goconc_alloc.go
debug
fairqueuing
format
formatting.gometrics
request
config.golist_work_estimator.gomutating_work_estimator.goobject_count_tracker.goseat_seconds.gowidth.go
rule.gowatch_tracker.goflushwriter
openapi
shufflesharding
wsstream
plugin
pkg
audit
authenticator
token
webhook
authorizer
client-go
dynamic
cloud-provider
app
config
config
doc.go
install
register.gotypes.gov1alpha1
conversion.godefaults.godoc.goregister.gotypes.gozz_generated.conversion.gozz_generated.deepcopy.gozz_generated.defaults.go
zz_generated.deepcopy.gocontrollers
service
options
component-base
config
options
logs
metrics
controller-manager
LICENSE
config
options
pkg
clientbuilder
features
leadermigration
kms
kube-openapi
pkg
builder
builder3
cached
common
common.go
restfuladapter
handler
handler3
internal
schemaconv
spec3
encoding.goexample.goexternal_documentation.gofuzz.goheader.gomedia_type.gooperation.goparameter.gopath.gorequest_body.goresponse.gosecurity_requirement.gosecurity_scheme.goserver.gospec.go
util
validation
kubelet
pkg
kubernetes
pkg
api
apis
apps
autoscaling
batch
core
extensions
networking
policy
client
conditions
cluster
ports
controller
features
fieldpath
kubelet
proxy
securitycontext
volume
test
e2e
framework
.import-restrictionsOWNERSREADME.md
config
debug
expect.goframework.goget.goginkgowrapper.gointernal
junit
kubectl
log.gometrics
namespacedname.gonode
pod
.import-restrictionscreate.godelete.godial.goexec_util.goget.go
provider.gooutput
pod_client.goresource.goutils.gowait.gopv
skipper
ssh
test_context.gotestfiles
timeouts.goutil.govolume
storage
testing-manifests
utils
utils
lru
sigs.k8s.io
apiserver-network-proxy
konnectivity-client
json
structured-merge-diff
v4
merge
356
vendor/sigs.k8s.io/structured-merge-diff/v4/merge/update.go
generated
vendored
Normal file
356
vendor/sigs.k8s.io/structured-merge-diff/v4/merge/update.go
generated
vendored
Normal file
@ -0,0 +1,356 @@
|
||||
/*
|
||||
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 merge
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"sigs.k8s.io/structured-merge-diff/v4/fieldpath"
|
||||
"sigs.k8s.io/structured-merge-diff/v4/typed"
|
||||
)
|
||||
|
||||
// Converter is an interface to the conversion logic. The converter
|
||||
// needs to be able to convert objects from one version to another.
|
||||
type Converter interface {
|
||||
Convert(object *typed.TypedValue, version fieldpath.APIVersion) (*typed.TypedValue, error)
|
||||
IsMissingVersionError(error) bool
|
||||
}
|
||||
|
||||
// Updater is the object used to compute updated FieldSets and also
|
||||
// merge the object on Apply.
|
||||
type Updater struct {
|
||||
Converter Converter
|
||||
IgnoredFields map[fieldpath.APIVersion]*fieldpath.Set
|
||||
|
||||
enableUnions bool
|
||||
}
|
||||
|
||||
// EnableUnionFeature turns on union handling. It is disabled by default until the
|
||||
// feature is complete.
|
||||
func (s *Updater) EnableUnionFeature() {
|
||||
s.enableUnions = true
|
||||
}
|
||||
|
||||
func (s *Updater) update(oldObject, newObject *typed.TypedValue, version fieldpath.APIVersion, managers fieldpath.ManagedFields, workflow string, force bool) (fieldpath.ManagedFields, *typed.Comparison, error) {
|
||||
conflicts := fieldpath.ManagedFields{}
|
||||
removed := fieldpath.ManagedFields{}
|
||||
compare, err := oldObject.Compare(newObject)
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("failed to compare objects: %v", err)
|
||||
}
|
||||
|
||||
versions := map[fieldpath.APIVersion]*typed.Comparison{
|
||||
version: compare.ExcludeFields(s.IgnoredFields[version]),
|
||||
}
|
||||
|
||||
for manager, managerSet := range managers {
|
||||
if manager == workflow {
|
||||
continue
|
||||
}
|
||||
compare, ok := versions[managerSet.APIVersion()]
|
||||
if !ok {
|
||||
var err error
|
||||
versionedOldObject, err := s.Converter.Convert(oldObject, managerSet.APIVersion())
|
||||
if err != nil {
|
||||
if s.Converter.IsMissingVersionError(err) {
|
||||
delete(managers, manager)
|
||||
continue
|
||||
}
|
||||
return nil, nil, fmt.Errorf("failed to convert old object: %v", err)
|
||||
}
|
||||
versionedNewObject, err := s.Converter.Convert(newObject, managerSet.APIVersion())
|
||||
if err != nil {
|
||||
if s.Converter.IsMissingVersionError(err) {
|
||||
delete(managers, manager)
|
||||
continue
|
||||
}
|
||||
return nil, nil, fmt.Errorf("failed to convert new object: %v", err)
|
||||
}
|
||||
compare, err = versionedOldObject.Compare(versionedNewObject)
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("failed to compare objects: %v", err)
|
||||
}
|
||||
versions[managerSet.APIVersion()] = compare.ExcludeFields(s.IgnoredFields[managerSet.APIVersion()])
|
||||
}
|
||||
|
||||
conflictSet := managerSet.Set().Intersection(compare.Modified.Union(compare.Added))
|
||||
if !conflictSet.Empty() {
|
||||
conflicts[manager] = fieldpath.NewVersionedSet(conflictSet, managerSet.APIVersion(), false)
|
||||
}
|
||||
|
||||
if !compare.Removed.Empty() {
|
||||
removed[manager] = fieldpath.NewVersionedSet(compare.Removed, managerSet.APIVersion(), false)
|
||||
}
|
||||
}
|
||||
|
||||
if !force && len(conflicts) != 0 {
|
||||
return nil, nil, ConflictsFromManagers(conflicts)
|
||||
}
|
||||
|
||||
for manager, conflictSet := range conflicts {
|
||||
managers[manager] = fieldpath.NewVersionedSet(managers[manager].Set().Difference(conflictSet.Set()), managers[manager].APIVersion(), managers[manager].Applied())
|
||||
}
|
||||
|
||||
for manager, removedSet := range removed {
|
||||
managers[manager] = fieldpath.NewVersionedSet(managers[manager].Set().Difference(removedSet.Set()), managers[manager].APIVersion(), managers[manager].Applied())
|
||||
}
|
||||
|
||||
for manager := range managers {
|
||||
if managers[manager].Set().Empty() {
|
||||
delete(managers, manager)
|
||||
}
|
||||
}
|
||||
|
||||
return managers, compare, nil
|
||||
}
|
||||
|
||||
// Update is the method you should call once you've merged your final
|
||||
// object on CREATE/UPDATE/PATCH verbs. newObject must be the object
|
||||
// that you intend to persist (after applying the patch if this is for a
|
||||
// PATCH call), and liveObject must be the original object (empty if
|
||||
// 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, compare, err := s.update(liveObject, newObject, version, managers, manager, true)
|
||||
if err != nil {
|
||||
return nil, fieldpath.ManagedFields{}, err
|
||||
}
|
||||
if _, ok := managers[manager]; !ok {
|
||||
managers[manager] = fieldpath.NewVersionedSet(fieldpath.NewSet(), version, false)
|
||||
}
|
||||
|
||||
ignored := s.IgnoredFields[version]
|
||||
if ignored == nil {
|
||||
ignored = fieldpath.NewSet()
|
||||
}
|
||||
managers[manager] = fieldpath.NewVersionedSet(
|
||||
managers[manager].Set().Union(compare.Modified).Union(compare.Added).Difference(compare.Removed).RecursiveDifference(ignored),
|
||||
version,
|
||||
false,
|
||||
)
|
||||
if managers[manager].Set().Empty() {
|
||||
delete(managers, manager)
|
||||
}
|
||||
return newObject, managers, nil
|
||||
}
|
||||
|
||||
// Apply should be called when Apply is run, given the current object as
|
||||
// well as the configuration that is applied. This will merge the object
|
||||
// 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) {
|
||||
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 {
|
||||
return nil, fieldpath.ManagedFields{}, err
|
||||
}
|
||||
}
|
||||
newObject, err := liveObject.Merge(configObject)
|
||||
if err != nil {
|
||||
return nil, fieldpath.ManagedFields{}, fmt.Errorf("failed to merge config: %v", err)
|
||||
}
|
||||
if s.enableUnions {
|
||||
newObject, err = configObject.NormalizeUnionsApply(newObject)
|
||||
if err != nil {
|
||||
return nil, fieldpath.ManagedFields{}, err
|
||||
}
|
||||
}
|
||||
lastSet := managers[manager]
|
||||
set, err := configObject.ToFieldSet()
|
||||
if err != nil {
|
||||
return nil, fieldpath.ManagedFields{}, fmt.Errorf("failed to get field set: %v", err)
|
||||
}
|
||||
|
||||
ignored := s.IgnoredFields[version]
|
||||
if ignored != nil {
|
||||
set = set.RecursiveDifference(ignored)
|
||||
// TODO: is this correct. If we don't remove from lastSet pruning might remove the fields?
|
||||
if lastSet != nil {
|
||||
lastSet.Set().RecursiveDifference(ignored)
|
||||
}
|
||||
}
|
||||
managers[manager] = fieldpath.NewVersionedSet(set, version, true)
|
||||
newObject, err = s.prune(newObject, managers, manager, lastSet)
|
||||
if err != nil {
|
||||
return nil, fieldpath.ManagedFields{}, fmt.Errorf("failed to prune fields: %v", err)
|
||||
}
|
||||
managers, compare, err := s.update(liveObject, newObject, version, managers, manager, force)
|
||||
if err != nil {
|
||||
return nil, fieldpath.ManagedFields{}, err
|
||||
}
|
||||
if compare.IsSame() {
|
||||
newObject = nil
|
||||
}
|
||||
return newObject, managers, nil
|
||||
}
|
||||
|
||||
// prune will remove a field, list or map item, iff:
|
||||
// * applyingManager applied it last time
|
||||
// * applyingManager didn't apply it this time
|
||||
// * no other applier claims to manage it
|
||||
func (s *Updater) prune(merged *typed.TypedValue, managers fieldpath.ManagedFields, applyingManager string, lastSet fieldpath.VersionedSet) (*typed.TypedValue, error) {
|
||||
if lastSet == nil || lastSet.Set().Empty() {
|
||||
return merged, nil
|
||||
}
|
||||
convertedMerged, err := s.Converter.Convert(merged, lastSet.APIVersion())
|
||||
if err != nil {
|
||||
if s.Converter.IsMissingVersionError(err) {
|
||||
return merged, nil
|
||||
}
|
||||
return nil, fmt.Errorf("failed to convert merged object to last applied version: %v", err)
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
pruned, err = s.addBackDanglingItems(convertedMerged, pruned, lastSet)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed add back dangling items: %v", err)
|
||||
}
|
||||
return s.Converter.Convert(pruned, managers[applyingManager].APIVersion())
|
||||
}
|
||||
|
||||
// addBackOwnedItems adds back any fields, list and map items that were removed by prune,
|
||||
// but other appliers or updaters (or the current applier's new config) claim to own.
|
||||
func (s *Updater) addBackOwnedItems(merged, pruned *typed.TypedValue, managedFields fieldpath.ManagedFields, applyingManager string) (*typed.TypedValue, error) {
|
||||
var err error
|
||||
managedAtVersion := map[fieldpath.APIVersion]*fieldpath.Set{}
|
||||
for _, managerSet := range managedFields {
|
||||
if _, ok := managedAtVersion[managerSet.APIVersion()]; !ok {
|
||||
managedAtVersion[managerSet.APIVersion()] = fieldpath.NewSet()
|
||||
}
|
||||
managedAtVersion[managerSet.APIVersion()] = managedAtVersion[managerSet.APIVersion()].Union(managerSet.Set())
|
||||
}
|
||||
// Add back owned items at pruned version first to avoid conversion failure
|
||||
// caused by pruned fields which are required for conversion.
|
||||
prunedVersion := fieldpath.APIVersion(*pruned.TypeRef().NamedType)
|
||||
if managed, ok := managedAtVersion[prunedVersion]; ok {
|
||||
merged, pruned, err = s.addBackOwnedItemsForVersion(merged, pruned, prunedVersion, managed)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
delete(managedAtVersion, prunedVersion)
|
||||
}
|
||||
for version, managed := range managedAtVersion {
|
||||
merged, pruned, err = s.addBackOwnedItemsForVersion(merged, pruned, version, managed)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return pruned, nil
|
||||
}
|
||||
|
||||
// addBackOwnedItemsForVersion adds back any fields, list and map items that were removed by prune with specific managed field path at a version.
|
||||
// It is an extracted sub-function from addBackOwnedItems for code reuse.
|
||||
func (s *Updater) addBackOwnedItemsForVersion(merged, pruned *typed.TypedValue, version fieldpath.APIVersion, managed *fieldpath.Set) (*typed.TypedValue, *typed.TypedValue, error) {
|
||||
var err error
|
||||
merged, err = s.Converter.Convert(merged, version)
|
||||
if err != nil {
|
||||
if s.Converter.IsMissingVersionError(err) {
|
||||
return merged, pruned, nil
|
||||
}
|
||||
return nil, nil, fmt.Errorf("failed to convert merged object at version %v: %v", version, err)
|
||||
}
|
||||
pruned, err = s.Converter.Convert(pruned, version)
|
||||
if err != nil {
|
||||
if s.Converter.IsMissingVersionError(err) {
|
||||
return merged, pruned, nil
|
||||
}
|
||||
return nil, nil, fmt.Errorf("failed to convert pruned object at version %v: %v", version, err)
|
||||
}
|
||||
mergedSet, err := merged.ToFieldSet()
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("failed to create field set from merged object at version %v: %v", version, err)
|
||||
}
|
||||
prunedSet, err := pruned.ToFieldSet()
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("failed to create field set from pruned object at version %v: %v", version, err)
|
||||
}
|
||||
sc, tr := merged.Schema(), merged.TypeRef()
|
||||
pruned = merged.RemoveItems(mergedSet.EnsureNamedFieldsAreMembers(sc, tr).Difference(prunedSet.EnsureNamedFieldsAreMembers(sc, tr).Union(managed.EnsureNamedFieldsAreMembers(sc, tr))))
|
||||
return merged, pruned, nil
|
||||
}
|
||||
|
||||
// addBackDanglingItems makes sure that the fields list and map items removed by prune were
|
||||
// previously owned by the currently applying manager. This will add back fields list and map items
|
||||
// that are unowned or that are owned by Updaters and shouldn't be removed.
|
||||
func (s *Updater) addBackDanglingItems(merged, pruned *typed.TypedValue, lastSet fieldpath.VersionedSet) (*typed.TypedValue, error) {
|
||||
convertedPruned, err := s.Converter.Convert(pruned, lastSet.APIVersion())
|
||||
if err != nil {
|
||||
if s.Converter.IsMissingVersionError(err) {
|
||||
return merged, nil
|
||||
}
|
||||
return nil, fmt.Errorf("failed to convert pruned object to last applied version: %v", err)
|
||||
}
|
||||
prunedSet, err := convertedPruned.ToFieldSet()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create field set from pruned object in last applied version: %v", err)
|
||||
}
|
||||
mergedSet, err := merged.ToFieldSet()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create field set from merged object in last applied version: %v", err)
|
||||
}
|
||||
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
|
||||
// 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
|
||||
}
|
Reference in New Issue
Block a user