// roundTrip applies a single round-trip test to the given runtime object // using the given codec. The round-trip test ensures that an object can be // deep-copied and converted from internal -> versioned -> internal without // loss of data. func roundTrip(t *testing.T, codec runtime.Codec, item runtime.Object) { printer := spew.ConfigState{DisableMethods: true} original := item // deep copy the original object copied, err := api.Scheme.DeepCopy(item) if err != nil { panic(fmt.Sprintf("unable to copy: %v", err)) } item = copied.(runtime.Object) name := reflect.TypeOf(item).Elem().Name() // encode (serialize) the deep copy using the provided codec data, err := runtime.Encode(codec, item) if err != nil { if runtime.IsNotRegisteredError(err) { t.Logf("%v: not registered: %v (%s)", name, err, printer.Sprintf("%#v", item)) } else { t.Errorf("%v: %v (%s)", name, err, printer.Sprintf("%#v", item)) } return } // ensure that the deep copy is equal to the original; neither the deep // copy or conversion should alter the object if !api.Semantic.DeepEqual(original, item) { t.Errorf("0: %v: encode altered the object, diff: %v", name, diff.ObjectReflectDiff(original, item)) return } // decode (deserialize) the encoded data back into an object obj2, err := runtime.Decode(codec, data) if err != nil { t.Errorf("0: %v: %v\nCodec: %#v\nData: %s\nSource: %#v", name, err, codec, dataAsString(data), printer.Sprintf("%#v", item)) panic("failed") } // ensure that the object produced from decoding the encoded data is equal // to the original object if !api.Semantic.DeepEqual(original, obj2) { t.Errorf("\n1: %v: diff: %v\nCodec: %#v\nSource:\n\n%#v\n\nEncoded:\n\n%s\n\nFinal:\n\n%#v", name, diff.ObjectReflectDiff(item, obj2), codec, printer.Sprintf("%#v", item), dataAsString(data), printer.Sprintf("%#v", obj2)) return } // decode the encoded data into a new object (instead of letting the codec // create a new object) obj3 := reflect.New(reflect.TypeOf(item).Elem()).Interface().(runtime.Object) if err := runtime.DecodeInto(codec, data, obj3); err != nil { t.Errorf("2: %v: %v", name, err) return } // ensure that the new runtime object is equal to the original after being // decoded into if !api.Semantic.DeepEqual(item, obj3) { t.Errorf("3: %v: diff: %v\nCodec: %#v", name, diff.ObjectReflectDiff(item, obj3), codec) return } }
func BenchmarkNodeConversion(b *testing.B) { data, err := ioutil.ReadFile("node_example.json") if err != nil { b.Fatalf("Unexpected error while reading file: %v", err) } var node api.Node if err := runtime.DecodeInto(testapi.Default.Codec(), data, &node); err != nil { b.Fatalf("Unexpected error decoding node: %v", err) } scheme := api.Scheme var result *api.Node b.ResetTimer() for i := 0; i < b.N; i++ { versionedObj, err := scheme.UnsafeConvertToVersion(&node, api.Registry.GroupOrDie(api.GroupName).GroupVersion) if err != nil { b.Fatalf("Conversion error: %v", err) } obj, err := scheme.UnsafeConvertToVersion(versionedObj, testapi.Default.InternalGroupVersion()) if err != nil { b.Fatalf("Conversion error: %v", err) } result = obj.(*api.Node) } b.StopTimer() if !api.Semantic.DeepDerivative(node, *result) { b.Fatalf("Incorrect conversion: %s", diff.ObjectDiff(node, *result)) } }
func runTest(t *testing.T, source interface{}) { name := reflect.TypeOf(source).Elem().Name() TestObjectFuzzer.Fuzz(source) _, codec := GetTestScheme() data, err := runtime.Encode(codec, source.(runtime.Object)) if err != nil { t.Errorf("%v: %v (%#v)", name, err, source) return } obj2, err := runtime.Decode(codec, data) if err != nil { t.Errorf("%v: %v (%v)", name, err, string(data)) return } if !semantic.DeepEqual(source, obj2) { t.Errorf("1: %v: diff: %v", name, diff.ObjectGoPrintSideBySide(source, obj2)) return } obj3 := reflect.New(reflect.TypeOf(source).Elem()).Interface() if err := runtime.DecodeInto(codec, data, obj3.(runtime.Object)); err != nil { t.Errorf("2: %v: %v", name, err) return } if !semantic.DeepEqual(source, obj3) { t.Errorf("3: %v: diff: %v", name, diff.ObjectDiff(source, obj3)) return } }
func createConfig(s *options.SchedulerServer, kubecli *clientset.Clientset) (*scheduler.Config, error) { configFactory := factory.NewConfigFactory(kubecli, s.SchedulerName, s.HardPodAffinitySymmetricWeight, s.FailureDomains) if _, err := os.Stat(s.PolicyConfigFile); err == nil { var ( policy schedulerapi.Policy configData []byte ) configData, err := ioutil.ReadFile(s.PolicyConfigFile) if err != nil { return nil, fmt.Errorf("unable to read policy config: %v", err) } if err := runtime.DecodeInto(latestschedulerapi.Codec, configData, &policy); err != nil { return nil, fmt.Errorf("invalid configuration: %v", err) } return configFactory.CreateFromConfig(policy) } // if the config file isn't provided, use the specified (or default) provider config, err := configFactory.CreateFromProvider(s.AlgorithmProvider) if err != nil { return nil, err } eventBroadcaster := record.NewBroadcaster() config.Recorder = eventBroadcaster.NewRecorder(v1.EventSource{Component: s.SchedulerName}) eventBroadcaster.StartLogging(glog.Infof) eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: kubecli.Core().Events("")}) return config, nil }
// Try to check for config on the API server, return that config if we get it, and start // a background thread that checks for updates to configs. func initKubeletConfigSync(s *options.KubeletServer) (*componentconfig.KubeletConfiguration, error) { jsonstr, err := getRemoteKubeletConfig(s, nil) if err == nil { // We will compare future API server config against the config we just got (jsonstr): startKubeletConfigSyncLoop(s, jsonstr) // Convert json from API server to external type struct, and convert that to internal type struct extKC := componentconfigv1alpha1.KubeletConfiguration{} err := runtime.DecodeInto(api.Codecs.UniversalDecoder(), []byte(jsonstr), &extKC) if err != nil { return nil, err } api.Scheme.Default(&extKC) kc := componentconfig.KubeletConfiguration{} err = api.Scheme.Convert(&extKC, &kc, nil) if err != nil { return nil, err } return &kc, nil } else { // Couldn't get a configuration from the API server yet. // Restart as soon as anything comes back from the API server. startKubeletConfigSyncLoop(s, "") return nil, err } }
func BenchmarkReplicationControllerConversion(b *testing.B) { data, err := ioutil.ReadFile("replication_controller_example.json") if err != nil { b.Fatalf("Unexpected error while reading file: %v", err) } var replicationController api.ReplicationController if err := runtime.DecodeInto(testapi.Default.Codec(), data, &replicationController); err != nil { b.Fatalf("Unexpected error decoding node: %v", err) } scheme := api.Scheme var result *api.ReplicationController b.ResetTimer() for i := 0; i < b.N; i++ { versionedObj, err := scheme.UnsafeConvertToVersion(&replicationController, api.Registry.GroupOrDie(api.GroupName).GroupVersion) if err != nil { b.Fatalf("Conversion error: %v", err) } obj, err := scheme.UnsafeConvertToVersion(versionedObj, testapi.Default.InternalGroupVersion()) if err != nil { b.Fatalf("Conversion error: %v", err) } result = obj.(*api.ReplicationController) } b.StopTimer() if !api.Semantic.DeepDerivative(replicationController, *result) { b.Fatalf("Incorrect conversion: expected %v, got %v", replicationController, *result) } }
func NewJoin(cfgPath string, args []string, cfg *kubeadmapi.NodeConfiguration, skipPreFlight bool) (*Join, error) { fmt.Println("[kubeadm] WARNING: kubeadm is in alpha, please do not use it for production clusters.") if cfgPath != "" { b, err := ioutil.ReadFile(cfgPath) if err != nil { return nil, fmt.Errorf("unable to read config from %q [%v]", cfgPath, err) } if err := runtime.DecodeInto(api.Codecs.UniversalDecoder(), b, cfg); err != nil { return nil, fmt.Errorf("unable to decode config from %q [%v]", cfgPath, err) } } if !skipPreFlight { fmt.Println("[preflight] Running pre-flight checks") // First, check if we're root separately from the other preflight checks and fail fast if err := preflight.RunRootCheckOnly(); err != nil { return nil, err } // Then continue with the others... if err := preflight.RunJoinNodeChecks(cfg); err != nil { return nil, err } } else { fmt.Println("[preflight] Skipping pre-flight checks") } // Try to start the kubelet service in case it's inactive preflight.TryStartKubelet() return &Join{cfg: cfg}, nil }
func readServiceFromFile(t *testing.T, filename string) *api.Service { data := readBytesFromFile(t, filename) svc := api.Service{} if err := runtime.DecodeInto(testapi.Default.Codec(), data, &svc); err != nil { t.Fatal(err) } return &svc }
func readReplicationControllerFromFile(t *testing.T, filename string) *api.ReplicationController { data := readBytesFromFile(t, filename) rc := api.ReplicationController{} if err := runtime.DecodeInto(testapi.Default.Codec(), data, &rc); err != nil { t.Fatal(err) } return &rc }
func TestSetControllerConversion(t *testing.T) { if err := api.Scheme.AddConversionFuncs(Convert_v1beta1_ReplicaSet_to_api_ReplicationController); err != nil { t.Fatal(err) } rs := &extensions.ReplicaSet{} rc := &api.ReplicationController{} extGroup := testapi.Extensions defaultGroup := testapi.Default fuzzInternalObject(t, extGroup.InternalGroupVersion(), rs, rand.Int63()) t.Logf("rs._internal.extensions -> rs.v1beta1.extensions") data, err := runtime.Encode(extGroup.Codec(), rs) if err != nil { t.Fatalf("unexpected encoding error: %v", err) } decoder := api.Codecs.DecoderToVersion( api.Codecs.UniversalDeserializer(), runtime.NewMultiGroupVersioner( *defaultGroup.GroupVersion(), schema.GroupKind{Group: defaultGroup.GroupVersion().Group}, schema.GroupKind{Group: extGroup.GroupVersion().Group}, ), ) t.Logf("rs.v1beta1.extensions -> rc._internal") if err := runtime.DecodeInto(decoder, data, rc); err != nil { t.Fatalf("unexpected decoding error: %v", err) } t.Logf("rc._internal -> rc.v1") data, err = runtime.Encode(defaultGroup.Codec(), rc) if err != nil { t.Fatalf("unexpected encoding error: %v", err) } t.Logf("rc.v1 -> rs._internal.extensions") if err := runtime.DecodeInto(decoder, data, rs); err != nil { t.Fatalf("unexpected decoding error: %v", err) } }
// rcFromManifest reads a .json/yaml file and returns the rc in it. func rcFromManifest(fileName string) *v1.ReplicationController { var controller v1.ReplicationController framework.Logf("Parsing rc from %v", fileName) data := generated.ReadOrDie(fileName) json, err := utilyaml.ToJSON(data) Expect(err).NotTo(HaveOccurred()) Expect(runtime.DecodeInto(api.Codecs.UniversalDecoder(), json, &controller)).NotTo(HaveOccurred()) return &controller }
func unstructuredToPod(obj *unstructured.Unstructured) (*v1.Pod, error) { json, err := runtime.Encode(unstructured.UnstructuredJSONScheme, obj) if err != nil { return nil, err } pod := new(v1.Pod) err = runtime.DecodeInto(testapi.Default.Codec(), json, pod) pod.Kind = "" pod.APIVersion = "" return pod, err }
// svcFromManifest reads a .json/yaml file and returns the rc in it. func svcFromManifest(fileName string) *v1.Service { var svc v1.Service framework.Logf("Parsing service from %v", fileName) data := generated.ReadOrDie(fileName) json, err := utilyaml.ToJSON(data) Expect(err).NotTo(HaveOccurred()) Expect(runtime.DecodeInto(api.Codecs.UniversalDecoder(), json, &svc)).NotTo(HaveOccurred()) return &svc }
// RCFromManifest reads a .json file and returns the rc in it. func RCFromManifest(fileName string) *v1.ReplicationController { data, err := ioutil.ReadFile(fileName) if err != nil { glog.Fatalf("Unexpected error reading rc manifest %v", err) } var controller v1.ReplicationController if err := runtime.DecodeInto(testapi.Default.Codec(), data, &controller); err != nil { glog.Fatalf("Unexpected error reading rc manifest %v", err) } return &controller }
// ingFromManifest reads a .json/yaml file and returns the rc in it. func ingFromManifest(fileName string) *extensions.Ingress { var ing extensions.Ingress framework.Logf("Parsing ingress from %v", fileName) data, err := ioutil.ReadFile(fileName) framework.ExpectNoError(err) json, err := utilyaml.ToJSON(data) framework.ExpectNoError(err) framework.ExpectNoError(runtime.DecodeInto(api.Codecs.UniversalDecoder(), json, &ing)) return &ing }
func podFromManifest(filename string) (*v1.Pod, error) { var pod v1.Pod framework.Logf("Parsing pod from %v", filename) data := generated.ReadOrDie(filename) json, err := utilyaml.ToJSON(data) if err != nil { return nil, err } if err := runtime.DecodeInto(api.Codecs.UniversalDecoder(), json, &pod); err != nil { return nil, err } return &pod, nil }
func TestBadJSONRejection(t *testing.T) { log.SetOutput(os.Stderr) _, codec := GetTestScheme() badJSONs := [][]byte{ []byte(`{"myVersionKey":"v1"}`), // Missing kind []byte(`{"myVersionKey":"v1","myKindKey":"bar"}`), // Unknown kind []byte(`{"myVersionKey":"bar","myKindKey":"TestType1"}`), // Unknown version []byte(`{"myKindKey":"TestType1"}`), // Missing version } for _, b := range badJSONs { if _, err := runtime.Decode(codec, b); err == nil { t.Errorf("Did not reject bad json: %s", string(b)) } } badJSONKindMismatch := []byte(`{"myVersionKey":"v1","myKindKey":"ExternalInternalSame"}`) if err := runtime.DecodeInto(codec, badJSONKindMismatch, &TestType1{}); err == nil { t.Errorf("Kind is set but doesn't match the object type: %s", badJSONKindMismatch) } if err := runtime.DecodeInto(codec, []byte(``), &TestType1{}); err != nil { t.Errorf("Should allow empty decode: %v", err) } if _, _, err := codec.Decode([]byte(``), &schema.GroupVersionKind{Kind: "ExternalInternalSame"}, nil); err == nil { t.Errorf("Did not give error for empty data with only kind default") } if _, _, err := codec.Decode([]byte(`{"myVersionKey":"v1"}`), &schema.GroupVersionKind{Kind: "ExternalInternalSame"}, nil); err != nil { t.Errorf("Gave error for version and kind default") } if _, _, err := codec.Decode([]byte(`{"myKindKey":"ExternalInternalSame"}`), &schema.GroupVersionKind{Version: "v1"}, nil); err != nil { t.Errorf("Gave error for version and kind default") } if _, _, err := codec.Decode([]byte(``), &schema.GroupVersionKind{Kind: "ExternalInternalSame", Version: "v1"}, nil); err != nil { t.Errorf("Gave error for version and kind defaulted: %v", err) } if _, err := runtime.Decode(codec, []byte(``)); err == nil { t.Errorf("Did not give error for empty data") } }
func statefulSetFromManifest(fileName, ns string) *apps.StatefulSet { var ss apps.StatefulSet framework.Logf("Parsing statefulset from %v", fileName) data, err := ioutil.ReadFile(fileName) Expect(err).NotTo(HaveOccurred()) json, err := utilyaml.ToJSON(data) Expect(err).NotTo(HaveOccurred()) Expect(runtime.DecodeInto(api.Codecs.UniversalDecoder(), json, &ss)).NotTo(HaveOccurred()) ss.Namespace = ns if ss.Spec.Selector == nil { ss.Spec.Selector = &metav1.LabelSelector{ MatchLabels: ss.Spec.Template.Labels, } } return &ss }
func (o *DrainOptions) getPodCreator(pod api.Pod) (*api.SerializedReference, error) { creatorRef, found := pod.ObjectMeta.Annotations[api.CreatedByAnnotation] if !found { return nil, nil } // Now verify that the specified creator actually exists. sr := &api.SerializedReference{} if err := runtime.DecodeInto(o.factory.Decoder(true), []byte(creatorRef), sr); err != nil { return nil, err } // We assume the only reason for an error is because the controller is // gone/missing, not for any other cause. TODO(mml): something more // sophisticated than this _, err := o.getController(sr) if err != nil { return nil, err } return sr, nil }
// LoadPodFromFile will read, decode, and return a Pod from a file. func LoadPodFromFile(filePath string) (*v1.Pod, error) { if filePath == "" { return nil, fmt.Errorf("file path not specified") } podDef, err := ioutil.ReadFile(filePath) if err != nil { return nil, fmt.Errorf("failed to read file path %s: %+v", filePath, err) } if len(podDef) == 0 { return nil, fmt.Errorf("file was empty: %s", filePath) } pod := &v1.Pod{} codec := api.Codecs.LegacyCodec(api.Registry.GroupOrDie(v1.GroupName).GroupVersion) if err := runtime.DecodeInto(codec, podDef, pod); err != nil { return nil, fmt.Errorf("failed decoding file: %v", err) } return pod, nil }
// applyPatchToObject applies a strategic merge patch of <patchMap> to // <originalMap> and stores the result in <objToUpdate>, though it operates // on versioned map[string]interface{} representations. func applyPatchToObject( codec runtime.Codec, originalMap map[string]interface{}, patchMap map[string]interface{}, objToUpdate runtime.Object, versionedObj runtime.Object, ) error { patchedObjMap, err := strategicpatch.StrategicMergeMapPatch(originalMap, patchMap, versionedObj) if err != nil { return err } // TODO: This should be one-step conversion that doesn't require // json marshaling and unmarshaling once #39017 is fixed. data, err := json.Marshal(patchedObjMap) if err != nil { return err } return runtime.DecodeInto(codec, data, objToUpdate) }
func NewInit(cfgPath string, cfg *kubeadmapi.MasterConfiguration, skipPreFlight bool) (*Init, error) { fmt.Println("[kubeadm] WARNING: kubeadm is in alpha, please do not use it for production clusters.") if cfgPath != "" { b, err := ioutil.ReadFile(cfgPath) if err != nil { return nil, fmt.Errorf("unable to read config from %q [%v]", cfgPath, err) } if err := runtime.DecodeInto(api.Codecs.UniversalDecoder(), b, cfg); err != nil { return nil, fmt.Errorf("unable to decode config from %q [%v]", cfgPath, err) } } // Set defaults dynamically that the API group defaulting can't (by fetching information from the internet, looking up network interfaces, etc.) err := setInitDynamicDefaults(cfg) if err != nil { return nil, err } if !skipPreFlight { fmt.Println("[preflight] Running pre-flight checks") // First, check if we're root separately from the other preflight checks and fail fast if err := preflight.RunRootCheckOnly(); err != nil { return nil, err } // Then continue with the others... if err := preflight.RunInitMasterChecks(cfg); err != nil { return nil, err } } else { fmt.Println("[preflight] Skipping pre-flight checks") } // Try to start the kubelet service in case it's inactive preflight.TryStartKubelet() return &Init{cfg: cfg}, nil }
func TestCreateFromEmptyConfig(t *testing.T) { var configData []byte var policy schedulerapi.Policy handler := utiltesting.FakeHandler{ StatusCode: 500, ResponseBody: "", T: t, } server := httptest.NewServer(&handler) defer server.Close() client := clientset.NewForConfigOrDie(&restclient.Config{Host: server.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(v1.GroupName).GroupVersion}}) factory := NewConfigFactory(client, v1.DefaultSchedulerName, v1.DefaultHardPodAffinitySymmetricWeight, v1.DefaultFailureDomains) configData = []byte(`{}`) if err := runtime.DecodeInto(latestschedulerapi.Codec, configData, &policy); err != nil { t.Errorf("Invalid configuration: %v", err) } factory.CreateFromConfig(policy) }
// Test configures a scheduler from a policies defined in a file // It combines some configurable predicate/priorities with some pre-defined ones func TestCreateFromConfig(t *testing.T) { var configData []byte var policy schedulerapi.Policy handler := utiltesting.FakeHandler{ StatusCode: 500, ResponseBody: "", T: t, } server := httptest.NewServer(&handler) defer server.Close() client := clientset.NewForConfigOrDie(&restclient.Config{Host: server.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &api.Registry.GroupOrDie(v1.GroupName).GroupVersion}}) factory := NewConfigFactory(client, v1.DefaultSchedulerName, v1.DefaultHardPodAffinitySymmetricWeight, v1.DefaultFailureDomains) // Pre-register some predicate and priority functions RegisterFitPredicate("PredicateOne", PredicateOne) RegisterFitPredicate("PredicateTwo", PredicateTwo) RegisterPriorityFunction("PriorityOne", PriorityOne, 1) RegisterPriorityFunction("PriorityTwo", PriorityTwo, 1) configData = []byte(`{ "kind" : "Policy", "apiVersion" : "v1", "predicates" : [ {"name" : "TestZoneAffinity", "argument" : {"serviceAffinity" : {"labels" : ["zone"]}}}, {"name" : "TestRequireZone", "argument" : {"labelsPresence" : {"labels" : ["zone"], "presence" : true}}}, {"name" : "PredicateOne"}, {"name" : "PredicateTwo"} ], "priorities" : [ {"name" : "RackSpread", "weight" : 3, "argument" : {"serviceAntiAffinity" : {"label" : "rack"}}}, {"name" : "PriorityOne", "weight" : 2}, {"name" : "PriorityTwo", "weight" : 1} ] }`) if err := runtime.DecodeInto(latestschedulerapi.Codec, configData, &policy); err != nil { t.Errorf("Invalid configuration: %v", err) } factory.CreateFromConfig(policy) }
// patchObjectJSON patches the <originalObject> with <patchJS> and stores // the result in <objToUpdate>. // Currently it also returns the original and patched objects serialized to // JSONs (this may not be needed once we can apply patches at the // map[string]interface{} level). func patchObjectJSON( patchType types.PatchType, codec runtime.Codec, originalObject runtime.Object, patchJS []byte, objToUpdate runtime.Object, versionedObj runtime.Object, ) (originalObjJS []byte, patchedObjJS []byte, retErr error) { js, err := runtime.Encode(codec, originalObject) if err != nil { return nil, nil, err } originalObjJS = js switch patchType { case types.JSONPatchType: patchObj, err := jsonpatch.DecodePatch(patchJS) if err != nil { return nil, nil, err } if patchedObjJS, err = patchObj.Apply(originalObjJS); err != nil { return nil, nil, err } case types.MergePatchType: if patchedObjJS, err = jsonpatch.MergePatch(originalObjJS, patchJS); err != nil { return nil, nil, err } case types.StrategicMergePatchType: if patchedObjJS, err = strategicpatch.StrategicMergePatch(originalObjJS, patchJS, versionedObj); err != nil { return nil, nil, err } default: // only here as a safety net - go-restful filters content-type return nil, nil, fmt.Errorf("unknown Content-Type header for patch: %v", patchType) } if err := runtime.DecodeInto(codec, patchedObjJS, objToUpdate); err != nil { return nil, nil, err } return }
func TestConvertTypesWhenDefaultNamesMatch(t *testing.T) { internalGV := schema.GroupVersion{Version: runtime.APIVersionInternal} externalGV := schema.GroupVersion{Version: "v1"} s := runtime.NewScheme() // create two names internally, with TestType1 being preferred s.AddKnownTypeWithName(internalGV.WithKind("TestType1"), &TestType1{}) s.AddKnownTypeWithName(internalGV.WithKind("OtherType1"), &TestType1{}) // create two names externally, with TestType1 being preferred s.AddKnownTypeWithName(externalGV.WithKind("TestType1"), &ExternalTestType1{}) s.AddKnownTypeWithName(externalGV.WithKind("OtherType1"), &ExternalTestType1{}) ext := &ExternalTestType1{} ext.APIVersion = "v1" ext.ObjectKind = "OtherType1" ext.A = "test" data, err := json.Marshal(ext) if err != nil { t.Fatalf("unexpected error: %v", err) } expect := &TestType1{A: "test"} codec := newCodecFactory(s, newSerializersForScheme(s, testMetaFactory{})).LegacyCodec(schema.GroupVersion{Version: "v1"}) obj, err := runtime.Decode(codec, data) if err != nil { t.Fatalf("unexpected error: %v", err) } if !semantic.DeepEqual(expect, obj) { t.Errorf("unexpected object: %#v", obj) } into := &TestType1{} if err := runtime.DecodeInto(codec, data, into); err != nil { t.Fatalf("unexpected error: %v", err) } if !semantic.DeepEqual(expect, into) { t.Errorf("unexpected object: %#v", obj) } }
func BenchmarkDecodeIntoInternalCodec(b *testing.B) { codec := testapi.Default.Codec() items := benchmarkItems() width := len(items) encoded := make([][]byte, width) for i := range items { data, err := runtime.Encode(codec, &items[i]) if err != nil { b.Fatal(err) } encoded[i] = data } b.ResetTimer() for i := 0; i < b.N; i++ { obj := api.Pod{} if err := runtime.DecodeInto(codec, encoded[i%width], &obj); err != nil { b.Fatal(err) } } b.StopTimer() }
func BenchmarkReplicationControllerCopy(b *testing.B) { data, err := ioutil.ReadFile("replication_controller_example.json") if err != nil { b.Fatalf("Unexpected error while reading file: %v", err) } var replicationController api.ReplicationController if err := runtime.DecodeInto(testapi.Default.Codec(), data, &replicationController); err != nil { b.Fatalf("Unexpected error decoding node: %v", err) } var result *api.ReplicationController for i := 0; i < b.N; i++ { obj, err := api.Scheme.DeepCopy(&replicationController) if err != nil { b.Fatalf("Unexpected error copying replication controller: %v", err) } result = obj.(*api.ReplicationController) } if !api.Semantic.DeepEqual(replicationController, *result) { b.Fatalf("Incorrect copy: expected %v, got %v", replicationController, *result) } }
func BenchmarkNodeCopy(b *testing.B) { data, err := ioutil.ReadFile("node_example.json") if err != nil { b.Fatalf("Unexpected error while reading file: %v", err) } var node api.Node if err := runtime.DecodeInto(testapi.Default.Codec(), data, &node); err != nil { b.Fatalf("Unexpected error decoding node: %v", err) } var result *api.Node for i := 0; i < b.N; i++ { obj, err := api.Scheme.DeepCopy(&node) if err != nil { b.Fatalf("Unexpected error copying node: %v", err) } result = obj.(*api.Node) } if !api.Semantic.DeepEqual(node, *result) { b.Fatalf("Incorrect copy: expected %v, got %v", node, *result) } }
// The label kubernetesPodLabel is added a long time ago (#7421), it serialized the whole v1.Pod to a docker label. // We want to remove this label because it serialized too much useless information. However kubelet may still work // with old containers which only have this label for a long time until we completely deprecate the old label. // Before that to ensure correctness we have to supply information with the old labels when newly added labels // are not available. // TODO(random-liu): Remove this function when we can completely remove label kubernetesPodLabel, probably after // dropping support for v1.1. func supplyContainerInfoWithOldLabel(labels map[string]string, containerInfo *labelledContainerInfo) { // Get v1.Pod from old label var pod *v1.Pod data, found := labels[kubernetesPodLabel] if !found { // Don't report any error here, because it's normal that a container has no pod label, especially // when we gradually deprecate the old label return } pod = &v1.Pod{} if err := runtime.DecodeInto(api.Codecs.UniversalDecoder(), []byte(data), pod); err != nil { // If the pod label can't be parsed, we should report an error logError(containerInfo, kubernetesPodLabel, err) return } if containerInfo.PodDeletionGracePeriod == nil { containerInfo.PodDeletionGracePeriod = pod.DeletionGracePeriodSeconds } if containerInfo.PodTerminationGracePeriod == nil { containerInfo.PodTerminationGracePeriod = pod.Spec.TerminationGracePeriodSeconds } // Get v1.Container from v1.Pod var container *v1.Container for i := range pod.Spec.Containers { if pod.Spec.Containers[i].Name == containerInfo.Name { container = &pod.Spec.Containers[i] break } } if container == nil { glog.Errorf("Unable to find container %q in pod %q", containerInfo.Name, format.Pod(pod)) return } if containerInfo.PreStopHandler == nil && container.Lifecycle != nil { containerInfo.PreStopHandler = container.Lifecycle.PreStop } }