Restrict Key

How to restrict patch from patching some specific key?

Problem:

We want to patch an object but we don't want to allow to modify some fields of the object.

Solution:

Use mergepatch.PreconditionFunc.

What is PreconditionFunc?

PreconditionFunc asserts that an incompatible change is not present within a patch. It takes generated patch and return if either patch is allowed(true) or forbidden(false) based on key's existent on patch.

type PreconditionFunc func(interface{}) bool

mergepatch library has two helper function that return PreconditionFunc

// RequireKeyUnchanged returns a precondition function that fails if the provided key
// is present in the patch (indicating that its value has changed).
func RequireKeyUnchanged(key string) PreconditionFunc {
	return func(patch interface{}) bool {
		patchMap, ok := patch.(map[string]interface{})
		if !ok {
			return true
		}

		// The presence of key means that its value has been changed, so the test fails.
		_, ok = patchMap[key]
		return !ok
	}
}

and

Using the above PreconditonFunc in strategicpatch

Creating Custom PreconditionFunc for jsonpatch

Last updated

Was this helpful?