mirror of https://github.com/k3s-io/k3s
Merge pull request #26240 from liggitt/wrap-updated-object
Automatic merge from submit-queue Add WrapUpdatedObjectInfo helper This makes it easier to attach checks/transformations to the updated object in storage Update functions, while still keeping the data flow intact (so admission, patch, and other injected checks continue to work as intended), without needing to do anything tricky to get the updated object out of the UpdatedObjectInfo introduced in https://github.com/kubernetes/kubernetes/pull/25787 This is especially useful when one storage is delegating to another, but wants its checks to be run in the heart of the eventual GuaranteedUpdate call.pull/6/head
commit
db62715c65
|
@ -173,3 +173,44 @@ func (i *defaultUpdatedObjectInfo) UpdatedObject(ctx api.Context, oldObj runtime
|
||||||
|
|
||||||
return newObj, nil
|
return newObj, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// wrappedUpdatedObjectInfo allows wrapping an existing objInfo and
|
||||||
|
// chaining additional transformations/checks on the result of UpdatedObject()
|
||||||
|
type wrappedUpdatedObjectInfo struct {
|
||||||
|
// obj is the updated object
|
||||||
|
objInfo UpdatedObjectInfo
|
||||||
|
|
||||||
|
// transformers is an optional list of transforming functions that modify or
|
||||||
|
// replace obj using information from the context, old object, or other sources.
|
||||||
|
transformers []TransformFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
// WrapUpdatedObjectInfo returns an UpdatedObjectInfo impl that delegates to
|
||||||
|
// the specified objInfo, then calls the passed transformers
|
||||||
|
func WrapUpdatedObjectInfo(objInfo UpdatedObjectInfo, transformers ...TransformFunc) UpdatedObjectInfo {
|
||||||
|
return &wrappedUpdatedObjectInfo{objInfo, transformers}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Preconditions satisfies the UpdatedObjectInfo interface.
|
||||||
|
func (i *wrappedUpdatedObjectInfo) Preconditions() *api.Preconditions {
|
||||||
|
return i.objInfo.Preconditions()
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdatedObject satisfies the UpdatedObjectInfo interface.
|
||||||
|
// It delegates to the wrapped objInfo and passes the result through any configured transformers.
|
||||||
|
func (i *wrappedUpdatedObjectInfo) UpdatedObject(ctx api.Context, oldObj runtime.Object) (runtime.Object, error) {
|
||||||
|
newObj, err := i.objInfo.UpdatedObject(ctx, oldObj)
|
||||||
|
if err != nil {
|
||||||
|
return newObj, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allow any configured transformers to update the new object or error
|
||||||
|
for _, transformer := range i.transformers {
|
||||||
|
newObj, err = transformer(ctx, newObj, oldObj)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return newObj, nil
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue