...

Source file src/sigs.k8s.io/kustomize/kyaml/filtersutil/filtersutil.go

Documentation: sigs.k8s.io/kustomize/kyaml/filtersutil

     1  // Copyright 2019 The Kubernetes Authors.
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package filtersutil
     5  
     6  import (
     7  	"encoding/json"
     8  
     9  	"sigs.k8s.io/kustomize/kyaml/errors"
    10  	"sigs.k8s.io/kustomize/kyaml/kio"
    11  	"sigs.k8s.io/kustomize/kyaml/yaml"
    12  )
    13  
    14  // ApplyToJSON applies the filter to the json objects.
    15  //
    16  // ApplyToJSON marshals the objects into a slice of yaml.RNodes, runs
    17  // the filter on the slice, and then unmarshals the values back.
    18  //
    19  // The filter must not create or delete objects because the objects
    20  // are updated in place.
    21  func ApplyToJSON(filter kio.Filter, objs ...marshalerUnmarshaler) error {
    22  	var nodes []*yaml.RNode
    23  
    24  	// convert the json objects to rnodes
    25  	for i := range objs {
    26  		node, err := GetRNode(objs[i])
    27  		if err != nil {
    28  			return err
    29  		}
    30  		nodes = append(nodes, node)
    31  	}
    32  
    33  	// apply the filter
    34  	nodes, err := filter.Filter(nodes)
    35  	if err != nil {
    36  		return err
    37  	}
    38  	if len(nodes) != len(objs) {
    39  		return errors.Errorf("filter cannot create or delete objects")
    40  	}
    41  
    42  	// convert the rnodes to json objects
    43  	for i := range nodes {
    44  		err = setRNode(objs[i], nodes[i])
    45  		if err != nil {
    46  			return err
    47  		}
    48  	}
    49  
    50  	return nil
    51  }
    52  
    53  type marshalerUnmarshaler interface {
    54  	json.Unmarshaler
    55  	json.Marshaler
    56  }
    57  
    58  // GetRNode converts k into an RNode
    59  func GetRNode(k json.Marshaler) (*yaml.RNode, error) {
    60  	j, err := k.MarshalJSON()
    61  	if err != nil {
    62  		return nil, err
    63  	}
    64  	return yaml.Parse(string(j))
    65  }
    66  
    67  // setRNode marshals node into k
    68  func setRNode(k json.Unmarshaler, node *yaml.RNode) error {
    69  	s, err := node.String()
    70  	if err != nil {
    71  		return err
    72  	}
    73  	m := map[string]interface{}{}
    74  	if err := yaml.Unmarshal([]byte(s), &m); err != nil {
    75  		return err
    76  	}
    77  
    78  	b, err := json.Marshal(m)
    79  	if err != nil {
    80  		return err
    81  	}
    82  	return k.UnmarshalJSON(b)
    83  }
    84  

View as plain text