Merge pull request #128416 from jpbetz/reset-filter

Add optional ResetFieldsFilterStrategy interface for storage

Kubernetes-commit: b831df733e5cf244331f61fffb0ba86787b27236
This commit is contained in:
Kubernetes Publisher 2024-11-01 02:23:26 +00:00
commit 0b45fb4d77
4 changed files with 45 additions and 21 deletions

10
go.mod
View File

@ -50,17 +50,17 @@ require (
gopkg.in/evanphx/json-patch.v4 v4.12.0
gopkg.in/natefinch/lumberjack.v2 v2.2.1
gopkg.in/square/go-jose.v2 v2.6.0
k8s.io/api v0.0.0-20241030034125-271c79cac830
k8s.io/apimachinery v0.0.0-20241030224344-a25029a669a1
k8s.io/client-go v0.0.0-20241030185032-6ba2fc71bc40
k8s.io/component-base v0.0.0-20241031225408-ecd78b707a2d
k8s.io/api v0.0.0-20241101030658-23d2de5610f2
k8s.io/apimachinery v0.0.0-20241101025844-cbe039cffd7e
k8s.io/client-go v0.0.0-20241101031653-c5d71b267c2a
k8s.io/component-base v0.0.0-20241101033950-7aab75e7eb7d
k8s.io/klog/v2 v2.130.1
k8s.io/kms v0.0.0-20241018044332-f1456fc96237
k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3
sigs.k8s.io/structured-merge-diff/v4 v4.4.1
sigs.k8s.io/structured-merge-diff/v4 v4.4.2
sigs.k8s.io/yaml v1.4.0
)

21
go.sum
View File

@ -360,7 +360,6 @@ gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI
gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
@ -368,14 +367,14 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
k8s.io/api v0.0.0-20241030034125-271c79cac830 h1:zu5fMzQV/xp3VSln7QIaHNb2ghUQ3YJngYo1y52wpsc=
k8s.io/api v0.0.0-20241030034125-271c79cac830/go.mod h1:aywKYMtpaiAtWkkKBmWO/iXvZmEmVXmBwQwOuQqkP0c=
k8s.io/apimachinery v0.0.0-20241030224344-a25029a669a1 h1:g9b84AV41Gw+L6Hh2Fwuqqn91NerIp9s7xQWnql6CWs=
k8s.io/apimachinery v0.0.0-20241030224344-a25029a669a1/go.mod h1:y/FzDt/GaPgPceo5rJcCtD4qW5l8SwtbzESSMGEY6P8=
k8s.io/client-go v0.0.0-20241030185032-6ba2fc71bc40 h1:eHBHdbsmesREwHCcf4WC6W3n33Gx33qd6Ui8SKKEy8I=
k8s.io/client-go v0.0.0-20241030185032-6ba2fc71bc40/go.mod h1:2yz8Bjwdfx1R8vPByI1NQckShJfDEPVnOT+6mumccr0=
k8s.io/component-base v0.0.0-20241031225408-ecd78b707a2d h1:48kCV8dYKjJiHOeF746BfL1ONS2cO3dzugJEa8TGW9g=
k8s.io/component-base v0.0.0-20241031225408-ecd78b707a2d/go.mod h1:rvwTzqjhUKsK+pr8yaEMHAj4tbcNRArH52wT2hefL/I=
k8s.io/api v0.0.0-20241101030658-23d2de5610f2 h1:iDi7dxAgLLw/rV2rxmZcI1xDjHPkNa6Xxiq5mUHU134=
k8s.io/api v0.0.0-20241101030658-23d2de5610f2/go.mod h1:TzFPxppSfonJM6VXn8BGw8k8IZyCvAIg+m3gce9fWcQ=
k8s.io/apimachinery v0.0.0-20241101025844-cbe039cffd7e h1:1I6mSLPZ8scSOna5iDpwfhNIoNv2Bl95vX25jPJ3DvU=
k8s.io/apimachinery v0.0.0-20241101025844-cbe039cffd7e/go.mod h1:JL4jbXpZvznF/cgaQmTb/duvBfZSMcFnoepN5YwqKrs=
k8s.io/client-go v0.0.0-20241101031653-c5d71b267c2a h1:6W5u98jUFbcCTRiPpe26S2UK+d6ngNR3RGtrX2bpxWM=
k8s.io/client-go v0.0.0-20241101031653-c5d71b267c2a/go.mod h1:Opld/qO4skIrfCzuRJ91JQrDzxs77fKkJGHKWG2zkwI=
k8s.io/component-base v0.0.0-20241101033950-7aab75e7eb7d h1:4bOLZvCyv965JICf1KaYAfqEoW4CLUYMHizkSOlTc+w=
k8s.io/component-base v0.0.0-20241101033950-7aab75e7eb7d/go.mod h1:IQWp+SjVEEQXXqTPGSHtmqt/Q+NTtLSO/m9JdgzwArc=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/kms v0.0.0-20241018044332-f1456fc96237 h1:wB+v0IxpfNqEJhSrVLag6Z25llgoPgKq1dLkJvJvxbI=
@ -388,7 +387,7 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 h1:CPT0ExVicCzcp
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA=
sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4=
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=

View File

@ -685,9 +685,27 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
reqScope.MetaGroupVersion = *a.group.MetaGroupVersion
}
var resetFields map[fieldpath.APIVersion]*fieldpath.Set
if resetFieldsStrategy, isResetFieldsStrategy := storage.(rest.ResetFieldsStrategy); isResetFieldsStrategy {
resetFields = resetFieldsStrategy.GetResetFields()
// Strategies may ignore changes to some fields by resetting the field values.
//
// For instance, spec resource strategies should reset the status, and status subresource
// strategies should reset the spec.
//
// Strategies that reset fields must report to the field manager which fields are
// reset by implementing either the ResetFieldsStrategy or the ResetFieldsFilterStrategy
// interface.
//
// For subresources that provide write access to only specific nested fields
// fieldpath.NewPatternFilter can help create a filter to reset all other fields.
var resetFieldsFilter map[fieldpath.APIVersion]fieldpath.Filter
resetFieldsStrategy, isResetFieldsStrategy := storage.(rest.ResetFieldsStrategy)
if isResetFieldsStrategy {
resetFieldsFilter = fieldpath.NewExcludeFilterSetMap(resetFieldsStrategy.GetResetFields())
}
if resetFieldsStrategy, isResetFieldsFilterStrategy := storage.(rest.ResetFieldsFilterStrategy); isResetFieldsFilterStrategy {
if isResetFieldsStrategy {
return nil, nil, fmt.Errorf("may not implement both ResetFieldsStrategy and ResetFieldsFilterStrategy")
}
resetFieldsFilter = resetFieldsStrategy.GetResetFieldsFilter()
}
reqScope.FieldManager, err = managedfields.NewDefaultFieldManager(
@ -698,7 +716,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
fqKindToRegister,
reqScope.HubGroupVersion,
subresource,
resetFields,
resetFieldsFilter,
)
if err != nil {
return nil, nil, fmt.Errorf("failed to create field manager: %v", err)

View File

@ -22,12 +22,13 @@ import (
"net/http"
"net/url"
"sigs.k8s.io/structured-merge-diff/v4/fieldpath"
metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/watch"
"sigs.k8s.io/structured-merge-diff/v4/fieldpath"
)
//TODO:
@ -387,6 +388,12 @@ type ResetFieldsStrategy interface {
GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set
}
// ResetFieldsFilterStrategy is an optional interface that a storage object can
// implement if it wishes to provide a fields filter reset by its strategies.
type ResetFieldsFilterStrategy interface {
GetResetFieldsFilter() map[fieldpath.APIVersion]fieldpath.Filter
}
// CreateUpdateResetFieldsStrategy is a union of RESTCreateUpdateStrategy
// and ResetFieldsStrategy.
type CreateUpdateResetFieldsStrategy interface {