1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-10 09:56:55 +00:00
kyverno/cmd/cli/kubectl-kyverno/utils/unstructured/unstructured.go
Charles-Edouard Brétéché acf1192599
fix: kyverno test generated resource inconsistency (#8189)
* fix: kyverno test renerated resource inconsistency

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

* unit test

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

* fix

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

* makefile

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

---------

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>
2023-08-31 05:54:41 +05:30

82 lines
1.6 KiB
Go

package unstructured
import (
"strings"
jsonpatch "github.com/evanphx/json-patch/v5"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
)
func TidyObject(obj interface{}) interface{} {
switch typedPatternElement := obj.(type) {
case map[string]interface{}:
tidy := map[string]interface{}{}
for k, v := range typedPatternElement {
v = TidyObject(v)
if v != nil {
tidy[k] = v
}
}
if len(tidy) == 0 {
return nil
}
return tidy
case []interface{}:
var tidy []interface{}
for _, v := range typedPatternElement {
v = TidyObject(v)
if v != nil {
tidy = append(tidy, v)
}
}
if len(tidy) == 0 {
return nil
}
return tidy
default:
return obj
}
}
func Tidy(obj unstructured.Unstructured) unstructured.Unstructured {
if obj.Object == nil {
return obj
}
return unstructured.Unstructured{
Object: TidyObject(obj.UnstructuredContent()).(map[string]interface{}),
}
}
func FixupGenerateLabels(obj unstructured.Unstructured) {
tidy := map[string]string{
"app.kubernetes.io/managed-by": "kyverno",
}
if labels := obj.GetLabels(); labels != nil {
for k, v := range labels {
if !strings.HasPrefix(k, "generate.kyverno.io/") {
tidy[k] = v
}
}
}
obj.SetLabels(tidy)
}
func Compare(a, e unstructured.Unstructured, tidy bool) (bool, error) {
if tidy {
a = Tidy(a)
e = Tidy(e)
}
actual, err := a.MarshalJSON()
if err != nil {
return false, err
}
expected, err := e.MarshalJSON()
if err != nil {
return false, err
}
patch, err := jsonpatch.CreateMergePatch(actual, expected)
if err != nil {
return false, err
}
return len(patch) == 2, nil
}