github.com/cilium/cilium@v1.16.2/test/controlplane/suite/marshalling.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Cilium 3 4 package suite 5 6 import ( 7 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 8 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" 9 k8sRuntime "k8s.io/apimachinery/pkg/runtime" 10 "k8s.io/apimachinery/pkg/runtime/serializer" 11 "k8s.io/apimachinery/pkg/util/yaml" 12 "k8s.io/client-go/kubernetes/fake" 13 14 cilium_v2 "github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2" 15 slim_corev1 "github.com/cilium/cilium/pkg/k8s/slim/k8s/api/core/v1" 16 slim_fake "github.com/cilium/cilium/pkg/k8s/slim/k8s/client/clientset/versioned/fake" 17 ) 18 19 // 20 // Marshalling utilities for control-plane tests. 21 // 22 // While we could have one decoder for all kinds, we need separate decoders 23 // to know to which ObjectTracker to hand the decoded object to. 24 // 25 // We use CodecFactory's UniversalDeserializer instead of Scheme.Convert as the 26 // Cilium CRDs have unexported fields and need to be decoded using their 27 // custom UnmarshalJSON functions. 28 29 var ( 30 // coreDecoder decodes objects using only the corev1 scheme 31 coreDecoder k8sRuntime.Decoder 32 33 // slimDecoder decodes objects with the slim scheme 34 slimDecoder k8sRuntime.Decoder 35 36 // ciliumDecoder decodes objects with the cilium v2 scheme 37 ciliumDecoder k8sRuntime.Decoder 38 ) 39 40 func init() { 41 coreScheme := k8sRuntime.NewScheme() 42 fake.AddToScheme(coreScheme) 43 coreDecoder = serializer.NewCodecFactory(coreScheme).UniversalDeserializer() 44 45 slimScheme := k8sRuntime.NewScheme() 46 slim_fake.AddToScheme(slimScheme) 47 slimScheme.AddKnownTypes(slim_corev1.SchemeGroupVersion, &metav1.List{}) 48 slimDecoder = serializer.NewCodecFactory(slimScheme).UniversalDeserializer() 49 50 ciliumScheme := k8sRuntime.NewScheme() 51 cilium_v2.AddToScheme(ciliumScheme) 52 ciliumDecoder = serializer.NewCodecFactory(ciliumScheme).UniversalDeserializer() 53 } 54 55 // unmarshalList unmarshals the input yaml data into an unstructured list. 56 func unmarshalList(bs []byte) ([]k8sRuntime.Object, error) { 57 var items unstructured.UnstructuredList 58 err := yaml.Unmarshal(bs, &items) 59 if err != nil { 60 return nil, err 61 } 62 var objs []k8sRuntime.Object 63 items.EachListItem(func(obj k8sRuntime.Object) error { 64 objs = append(objs, obj) 65 return nil 66 }) 67 return objs, nil 68 69 }