github.com/joelanford/operator-sdk@v0.8.2/internal/util/k8sutil/object.go (about)

     1  package k8sutil
     2  
     3  import (
     4  	yaml "github.com/ghodss/yaml"
     5  	"k8s.io/apimachinery/pkg/runtime"
     6  )
     7  
     8  // GetObjectBytes marshalls an object and removes runtime-managed fields:
     9  // 'status', 'creationTimestamp'
    10  func GetObjectBytes(obj interface{}) ([]byte, error) {
    11  	u, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj)
    12  	if err != nil {
    13  		return nil, err
    14  	}
    15  	deleteKeys := []string{"status", "creationTimestamp"}
    16  	for _, dk := range deleteKeys {
    17  		deleteKeyFromUnstructured(u, dk)
    18  	}
    19  	return yaml.Marshal(u)
    20  }
    21  
    22  func deleteKeyFromUnstructured(u map[string]interface{}, key string) {
    23  	if _, ok := u[key]; ok {
    24  		delete(u, key)
    25  		return
    26  	}
    27  
    28  	for _, v := range u {
    29  		switch t := v.(type) {
    30  		case map[string]interface{}:
    31  			deleteKeyFromUnstructured(t, key)
    32  		case []interface{}:
    33  			for _, ti := range t {
    34  				if m, ok := ti.(map[string]interface{}); ok {
    35  					deleteKeyFromUnstructured(m, key)
    36  				}
    37  			}
    38  		}
    39  	}
    40  }