2022-01-04 17:36:33 -08:00
|
|
|
package patch
|
2020-09-03 08:54:37 -07:00
|
|
|
|
|
|
|
import (
|
|
|
|
"strings"
|
|
|
|
|
2022-12-09 22:15:23 +05:30
|
|
|
"github.com/kyverno/kyverno/pkg/utils/wildcard"
|
2021-01-19 11:08:06 -08:00
|
|
|
"github.com/mattbaird/jsonpatch"
|
2020-09-03 08:54:37 -07:00
|
|
|
)
|
|
|
|
|
2023-04-28 09:31:12 +02:00
|
|
|
func ConvertPatches(in ...jsonpatch.JsonPatchOperation) [][]byte {
|
|
|
|
var out [][]byte
|
|
|
|
for _, patch := range in {
|
|
|
|
if patch, err := patch.MarshalJSON(); err == nil {
|
|
|
|
out = append(out, patch)
|
2020-09-03 08:54:37 -07:00
|
|
|
}
|
|
|
|
}
|
2023-04-28 09:31:12 +02:00
|
|
|
return out
|
|
|
|
}
|
2020-09-03 08:54:37 -07:00
|
|
|
|
2023-04-28 09:31:12 +02:00
|
|
|
func generatePatches(src, dst []byte) ([]jsonpatch.JsonPatchOperation, error) {
|
|
|
|
if pp, err := jsonpatch.CreatePatch(src, dst); err != nil {
|
|
|
|
return nil, err
|
|
|
|
} else {
|
2023-06-03 14:08:58 +02:00
|
|
|
return filterInvalidPatches(pp), err
|
2023-04-28 09:31:12 +02:00
|
|
|
}
|
2020-09-03 08:54:37 -07:00
|
|
|
}
|
|
|
|
|
2021-01-19 11:08:06 -08:00
|
|
|
// filterInvalidPatches filters out patch with the following path:
|
|
|
|
// - not */metadata/name, */metadata/namespace, */metadata/labels, */metadata/annotations
|
|
|
|
// - /status
|
|
|
|
func filterInvalidPatches(patches []jsonpatch.JsonPatchOperation) []jsonpatch.JsonPatchOperation {
|
|
|
|
res := []jsonpatch.JsonPatchOperation{}
|
|
|
|
for _, patch := range patches {
|
|
|
|
if ignorePatch(patch.Path) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
res = append(res, patch)
|
|
|
|
}
|
|
|
|
return res
|
|
|
|
}
|
|
|
|
|
|
|
|
func ignorePatch(path string) bool {
|
2022-11-28 10:55:42 +01:00
|
|
|
if wildcard.Match("/spec/triggers/*/metadata/*", path) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2021-01-19 11:08:06 -08:00
|
|
|
if wildcard.Match("*/metadata", path) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
if strings.Contains(path, "/metadata") {
|
|
|
|
if !strings.Contains(path, "/metadata/name") &&
|
|
|
|
!strings.Contains(path, "/metadata/namespace") &&
|
|
|
|
!strings.Contains(path, "/metadata/annotations") &&
|
2022-01-24 13:20:27 +08:00
|
|
|
!strings.Contains(path, "/metadata/labels") &&
|
2022-10-25 02:34:07 -04:00
|
|
|
!strings.Contains(path, "/metadata/ownerReferences") &&
|
2022-11-07 19:50:50 +05:30
|
|
|
!strings.Contains(path, "/metadata/generateName") &&
|
2022-10-25 02:34:07 -04:00
|
|
|
!strings.Contains(path, "/metadata/finalizers") {
|
2021-01-19 11:08:06 -08:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
}
|