From bc6a228f7db4abb1b1104735c85b9bd5faf3d199 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charles-Edouard=20Br=C3=A9t=C3=A9ch=C3=A9?= Date: Fri, 1 Apr 2022 11:56:16 +0200 Subject: [PATCH] refactor: separate yaml utils package (#3520) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Charles-Edouard Brétéché Co-authored-by: Vyankatesh Kudtarkar --- pkg/kyverno/common/fetch.go | 4 ++-- pkg/utils/loadpolicy.go | 46 ++++++++----------------------------- pkg/utils/yaml/utils.go | 28 ++++++++++++++++++++++ 3 files changed, 39 insertions(+), 39 deletions(-) create mode 100644 pkg/utils/yaml/utils.go diff --git a/pkg/kyverno/common/fetch.go b/pkg/kyverno/common/fetch.go index e04d12c24e..541e0039ae 100644 --- a/pkg/kyverno/common/fetch.go +++ b/pkg/kyverno/common/fetch.go @@ -13,7 +13,7 @@ import ( "github.com/kyverno/kyverno/pkg/autogen" client "github.com/kyverno/kyverno/pkg/dclient" engineutils "github.com/kyverno/kyverno/pkg/engine/utils" - "github.com/kyverno/kyverno/pkg/utils" + yamlutils "github.com/kyverno/kyverno/pkg/utils/yaml" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/kubernetes/scheme" @@ -167,7 +167,7 @@ func GetResource(resourceBytes []byte) ([]*unstructured.Unstructured, error) { resources := make([]*unstructured.Unstructured, 0) var getErrString string - files, splitDocError := utils.SplitYAMLDocuments(resourceBytes) + files, splitDocError := yamlutils.SplitDocuments(resourceBytes) if splitDocError != nil { return nil, splitDocError } diff --git a/pkg/utils/loadpolicy.go b/pkg/utils/loadpolicy.go index 72ef78a9c3..54b1a33fbb 100644 --- a/pkg/utils/loadpolicy.go +++ b/pkg/utils/loadpolicy.go @@ -1,72 +1,44 @@ package utils import ( - "bufio" - "bytes" "encoding/json" "fmt" - "io" - v1 "github.com/kyverno/kyverno/api/kyverno/v1" + kyverno "github.com/kyverno/kyverno/api/kyverno/v1" + yamlutils "github.com/kyverno/kyverno/pkg/utils/yaml" "k8s.io/apimachinery/pkg/util/yaml" "sigs.k8s.io/controller-runtime/pkg/log" ) // GetPolicy - extracts policies from YAML bytes -func GetPolicy(bytes []byte) (clusterPolicies []v1.PolicyInterface, err error) { - policies, err := SplitYAMLDocuments(bytes) +func GetPolicy(bytes []byte) (policies []kyverno.PolicyInterface, err error) { + documents, err := yamlutils.SplitDocuments(bytes) if err != nil { return nil, err } - - for _, thisPolicyBytes := range policies { + for _, thisPolicyBytes := range documents { policyBytes, err := yaml.ToJSON(thisPolicyBytes) if err != nil { return nil, fmt.Errorf("failed to convert to JSON: %v", err) } - - policy := &v1.ClusterPolicy{} + policy := &kyverno.ClusterPolicy{} if err := json.Unmarshal(policyBytes, policy); err != nil { return nil, fmt.Errorf("failed to decode policy: %v", err) } - if policy.TypeMeta.Kind == "" { log.Log.V(3).Info("skipping file as policy.TypeMeta.Kind not found") continue } - - if !(policy.TypeMeta.Kind == "ClusterPolicy" || policy.TypeMeta.Kind == "Policy") { - msg := fmt.Sprintf("resource %s/%s is not a Policy or a ClusterPolicy", policy.Kind, policy.Name) - return nil, fmt.Errorf(msg) + if policy.TypeMeta.Kind != "ClusterPolicy" && policy.TypeMeta.Kind != "Policy" { + return nil, fmt.Errorf("resource %s/%s is not a Policy or a ClusterPolicy", policy.Kind, policy.Name) } - if policy.Namespace != "" || (policy.Namespace == "" && policy.Kind == "Policy") { if policy.Namespace == "" { policy.Namespace = "default" } policy.Kind = "ClusterPolicy" } - clusterPolicies = append(clusterPolicies, policy) - } - - return clusterPolicies, nil -} - -// SplitYAMLDocuments reads the YAML bytes per-document, unmarshals the TypeMeta information from each document -// and returns a map between the GroupVersionKind of the document and the document bytes -func SplitYAMLDocuments(yamlBytes []byte) (policies [][]byte, error error) { - buf := bytes.NewBuffer(yamlBytes) - reader := yaml.NewYAMLReader(bufio.NewReader(buf)) - for { - // Read one YAML document at a time, until io.EOF is returned - b, err := reader.Read() - if err == io.EOF || len(b) == 0 { - break - } else if err != nil { - return policies, fmt.Errorf("unable to read yaml") - } - - policies = append(policies, b) + policies = append(policies, policy) } return policies, nil } diff --git a/pkg/utils/yaml/utils.go b/pkg/utils/yaml/utils.go new file mode 100644 index 0000000000..1e202a1e00 --- /dev/null +++ b/pkg/utils/yaml/utils.go @@ -0,0 +1,28 @@ +package yaml + +import ( + "bufio" + "bytes" + "fmt" + "io" + + "k8s.io/apimachinery/pkg/util/yaml" +) + +// SplitDocuments reads the YAML bytes per-document, unmarshals the TypeMeta information from each document +// and returns a map between the GroupVersionKind of the document and the document bytes +func SplitDocuments(yamlBytes []byte) (documents [][]byte, error error) { + buf := bytes.NewBuffer(yamlBytes) + reader := yaml.NewYAMLReader(bufio.NewReader(buf)) + for { + // Read one YAML document at a time, until io.EOF is returned + b, err := reader.Read() + if err == io.EOF || len(b) == 0 { + break + } else if err != nil { + return documents, fmt.Errorf("unable to read yaml") + } + documents = append(documents, b) + } + return documents, nil +}