package patch import ( "context" "sigs.k8s.io/controller-runtime/pkg/client" ) // SerialPatcher provides serial patching of object using the patch helper. It // remembers the state of the last patched object and uses that to calculate // the patch against a new object. type SerialPatcher struct { client client.Client beforeObject client.Object } // NewSerialPatcher returns a SerialPatcher with the given object as the initial // base object for the patching operations. func NewSerialPatcher(obj client.Object, c client.Client) *SerialPatcher { return &SerialPatcher{ client: c, beforeObject: obj.DeepCopyObject().(client.Object), } } // Patch performs patching operation of the SerialPatcher and updates the // beforeObject after a successful patch for subsequent patching. func (sp *SerialPatcher) Patch(ctx context.Context, obj client.Object, options ...Option) error { // Create a new patch helper with the before object. patcher, err := NewHelper(sp.beforeObject, sp.client) if err != nil { return err } // Patch with the changes from the new object. if err := patcher.Patch(ctx, obj, options...); err != nil { return err } // Update the before object for next patch. sp.beforeObject = obj.DeepCopyObject().(client.Object) return nil }