From 4984c5c878f3d619df10431ca5e2ad5386b937a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charles-Edouard=20Br=C3=A9t=C3=A9ch=C3=A9?= Date: Fri, 25 Nov 2022 13:46:02 +0100 Subject: [PATCH] feat: create a policy utils package (#5473) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: create a policy utils package Signed-off-by: Charles-Edouard Brétéché * added comment Signed-off-by: Charles-Edouard Brétéché Signed-off-by: Charles-Edouard Brétéché --- cmd/cli/kubectl-kyverno/oci/oci_pull.go | 11 +++-------- cmd/cli/kubectl-kyverno/oci/oci_push.go | 11 +++-------- pkg/utils/policy/mashal.go | 24 ++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 16 deletions(-) create mode 100644 pkg/utils/policy/mashal.go diff --git a/cmd/cli/kubectl-kyverno/oci/oci_pull.go b/cmd/cli/kubectl-kyverno/oci/oci_pull.go index 09158f3f56..afa4775b0e 100644 --- a/cmd/cli/kubectl-kyverno/oci/oci_pull.go +++ b/cmd/cli/kubectl-kyverno/oci/oci_pull.go @@ -1,7 +1,6 @@ package oci import ( - "encoding/json" "errors" "fmt" "io" @@ -11,9 +10,9 @@ import ( securejoin "github.com/cyphar/filepath-securejoin" "github.com/google/go-containerregistry/pkg/name" "github.com/google/go-containerregistry/pkg/v1/remote" + policyutils "github.com/kyverno/kyverno/pkg/utils/policy" yamlutils "github.com/kyverno/kyverno/pkg/utils/yaml" "github.com/spf13/cobra" - "sigs.k8s.io/yaml" ) var dir string @@ -97,13 +96,9 @@ kyverno oci pull -i -d policies`, return fmt.Errorf("unmarshaling layer blob: %v", err) } for _, policy := range policies { - policyJsonBytes, err := json.Marshal(policy) + policyBytes, err := policyutils.ToYaml(policy) if err != nil { - return fmt.Errorf("converting policy to json: %v", err) - } - policyBytes, err := yaml.JSONToYAML(policyJsonBytes) - if err != nil { - return fmt.Errorf("converting json to yaml: %v", err) + return fmt.Errorf("converting policy to yaml: %v", err) } if err := os.WriteFile(filepath.Join(dir, policy.GetName()+".yaml"), policyBytes, 0o600); err != nil { return fmt.Errorf("creating file: %v", err) diff --git a/cmd/cli/kubectl-kyverno/oci/oci_push.go b/cmd/cli/kubectl-kyverno/oci/oci_push.go index 8388c7eb5f..3782afb78d 100644 --- a/cmd/cli/kubectl-kyverno/oci/oci_push.go +++ b/cmd/cli/kubectl-kyverno/oci/oci_push.go @@ -1,7 +1,6 @@ package oci import ( - "encoding/json" "errors" "fmt" "os" @@ -15,9 +14,9 @@ import ( "github.com/kyverno/kyverno/cmd/cli/kubectl-kyverno/utils/common" "github.com/kyverno/kyverno/pkg/openapi" policyvalidation "github.com/kyverno/kyverno/pkg/policy" + policyutils "github.com/kyverno/kyverno/pkg/utils/policy" "github.com/spf13/cobra" "go.uber.org/multierr" - "sigs.k8s.io/yaml" ) var policyRef string @@ -65,13 +64,9 @@ kyverno oci push -p policies. -i `, } else { fmt.Println("Adding cluster policy", policy.GetName(), "...") } - policyJsonBytes, err := json.Marshal(policy) + policyBytes, err := policyutils.ToYaml(policy) if err != nil { - return fmt.Errorf("converting policy to json: %v", err) - } - policyBytes, err := yaml.JSONToYAML(policyJsonBytes) - if err != nil { - return fmt.Errorf("converting json to yaml: %v", err) + return fmt.Errorf("converting policy to yaml: %v", err) } policyLayer := static.NewLayer(policyBytes, policyLayerMediaType) img, err = mutate.Append(img, mutate.Addendum{ diff --git a/pkg/utils/policy/mashal.go b/pkg/utils/policy/mashal.go new file mode 100644 index 0000000000..525fc3ee1a --- /dev/null +++ b/pkg/utils/policy/mashal.go @@ -0,0 +1,24 @@ +package policy + +import ( + "encoding/json" + + kyvernov1 "github.com/kyverno/kyverno/api/kyverno/v1" + "sigs.k8s.io/yaml" +) + +// ToJson marshals a policy into corresponding json bytes. +func ToJson(policy kyvernov1.PolicyInterface) ([]byte, error) { + return json.Marshal(policy) +} + +// ToYaml marshals a policy into corresponding yaml bytes. +// If firsts converts the policy to json because some internal structures have +// custom json marshalling functions, then it converts json to yaml. +func ToYaml(policy kyvernov1.PolicyInterface) ([]byte, error) { + jsonBytes, err := ToJson(policy) + if err != nil { + return nil, err + } + return yaml.JSONToYAML(jsonBytes) +}