Remove testapi use from pkg/api/testing

This commit is contained in:
Jordan Liggitt 2019-12-13 11:50:20 -05:00
parent 5d5b444c4d
commit 78a3a4a2b1
6 changed files with 143 additions and 67 deletions

View File

@ -12,27 +12,51 @@ go_library(
"conversion.go", "conversion.go",
"doc.go", "doc.go",
"fuzzer.go", "fuzzer.go",
"install.go",
"pod_specs.go", "pod_specs.go",
], ],
importpath = "k8s.io/kubernetes/pkg/api/testing", importpath = "k8s.io/kubernetes/pkg/api/testing",
deps = [ deps = [
"//pkg/api/legacyscheme:go_default_library", "//pkg/api/legacyscheme:go_default_library",
"//pkg/apis/admission/install:go_default_library",
"//pkg/apis/admissionregistration/fuzzer:go_default_library", "//pkg/apis/admissionregistration/fuzzer:go_default_library",
"//pkg/apis/admissionregistration/install:go_default_library",
"//pkg/apis/apps:go_default_library", "//pkg/apis/apps:go_default_library",
"//pkg/apis/apps/fuzzer:go_default_library", "//pkg/apis/apps/fuzzer:go_default_library",
"//pkg/apis/apps/install:go_default_library",
"//pkg/apis/auditregistration/fuzzer:go_default_library", "//pkg/apis/auditregistration/fuzzer:go_default_library",
"//pkg/apis/auditregistration/install:go_default_library",
"//pkg/apis/authentication/install:go_default_library",
"//pkg/apis/authorization/install:go_default_library",
"//pkg/apis/autoscaling/fuzzer:go_default_library", "//pkg/apis/autoscaling/fuzzer:go_default_library",
"//pkg/apis/autoscaling/install:go_default_library",
"//pkg/apis/batch/fuzzer:go_default_library", "//pkg/apis/batch/fuzzer:go_default_library",
"//pkg/apis/batch/install:go_default_library",
"//pkg/apis/certificates/fuzzer:go_default_library", "//pkg/apis/certificates/fuzzer:go_default_library",
"//pkg/apis/certificates/install:go_default_library",
"//pkg/apis/coordination/install:go_default_library",
"//pkg/apis/core:go_default_library", "//pkg/apis/core:go_default_library",
"//pkg/apis/core/fuzzer:go_default_library", "//pkg/apis/core/fuzzer:go_default_library",
"//pkg/apis/core/install:go_default_library",
"//pkg/apis/discovery/fuzzer:go_default_library", "//pkg/apis/discovery/fuzzer:go_default_library",
"//pkg/apis/discovery/install:go_default_library",
"//pkg/apis/events/install:go_default_library",
"//pkg/apis/extensions/fuzzer:go_default_library", "//pkg/apis/extensions/fuzzer:go_default_library",
"//pkg/apis/extensions/install:go_default_library",
"//pkg/apis/flowcontrol/install:go_default_library",
"//pkg/apis/imagepolicy/install:go_default_library",
"//pkg/apis/networking/fuzzer:go_default_library", "//pkg/apis/networking/fuzzer:go_default_library",
"//pkg/apis/networking/install:go_default_library",
"//pkg/apis/node/install:go_default_library",
"//pkg/apis/policy/fuzzer:go_default_library", "//pkg/apis/policy/fuzzer:go_default_library",
"//pkg/apis/policy/install:go_default_library",
"//pkg/apis/rbac/fuzzer:go_default_library", "//pkg/apis/rbac/fuzzer:go_default_library",
"//pkg/apis/rbac/install:go_default_library",
"//pkg/apis/scheduling/fuzzer:go_default_library", "//pkg/apis/scheduling/fuzzer:go_default_library",
"//pkg/apis/scheduling/install:go_default_library",
"//pkg/apis/settings/install:go_default_library",
"//pkg/apis/storage/fuzzer:go_default_library", "//pkg/apis/storage/fuzzer:go_default_library",
"//pkg/apis/storage/install:go_default_library",
"//staging/src/k8s.io/api/apps/v1:go_default_library", "//staging/src/k8s.io/api/apps/v1:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/api/apitesting:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/apitesting:go_default_library",
@ -78,7 +102,6 @@ go_test(
embed = [":go_default_library"], embed = [":go_default_library"],
deps = [ deps = [
"//pkg/api/legacyscheme:go_default_library", "//pkg/api/legacyscheme:go_default_library",
"//pkg/api/testapi:go_default_library",
"//pkg/api/testing/compat:go_default_library", "//pkg/api/testing/compat:go_default_library",
"//pkg/apis/apps:go_default_library", "//pkg/apis/apps:go_default_library",
"//pkg/apis/apps/v1:go_default_library", "//pkg/apis/apps/v1:go_default_library",

View File

@ -21,13 +21,13 @@ import (
"math/rand" "math/rand"
"testing" "testing"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/apitesting/fuzzer" "k8s.io/apimachinery/pkg/api/apitesting/fuzzer"
apiequality "k8s.io/apimachinery/pkg/api/equality" apiequality "k8s.io/apimachinery/pkg/api/equality"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/util/diff" "k8s.io/apimachinery/pkg/util/diff"
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/api/testapi"
api "k8s.io/kubernetes/pkg/apis/core" api "k8s.io/kubernetes/pkg/apis/core"
) )
@ -63,7 +63,7 @@ func BenchmarkNodeConversion(b *testing.B) {
b.Fatalf("Unexpected error while reading file: %v", err) b.Fatalf("Unexpected error while reading file: %v", err)
} }
var node api.Node var node api.Node
if err := runtime.DecodeInto(testapi.Default.Codec(), data, &node); err != nil { if err := runtime.DecodeInto(legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), data, &node); err != nil {
b.Fatalf("Unexpected error decoding node: %v", err) b.Fatalf("Unexpected error decoding node: %v", err)
} }
@ -93,7 +93,7 @@ func BenchmarkReplicationControllerConversion(b *testing.B) {
b.Fatalf("Unexpected error while reading file: %v", err) b.Fatalf("Unexpected error while reading file: %v", err)
} }
var replicationController api.ReplicationController var replicationController api.ReplicationController
if err := runtime.DecodeInto(testapi.Default.Codec(), data, &replicationController); err != nil { if err := runtime.DecodeInto(legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), data, &replicationController); err != nil {
b.Fatalf("Unexpected error decoding node: %v", err) b.Fatalf("Unexpected error decoding node: %v", err)
} }

View File

@ -21,11 +21,12 @@ import (
"testing" "testing"
"time" "time"
v1 "k8s.io/api/core/v1"
apiequality "k8s.io/apimachinery/pkg/api/equality" apiequality "k8s.io/apimachinery/pkg/api/equality"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
"k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/legacyscheme"
api "k8s.io/kubernetes/pkg/apis/core" api "k8s.io/kubernetes/pkg/apis/core"
) )
@ -144,7 +145,7 @@ func BenchmarkNodeCopy(b *testing.B) {
b.Fatalf("Unexpected error while reading file: %v", err) b.Fatalf("Unexpected error while reading file: %v", err)
} }
var node api.Node var node api.Node
if err := runtime.DecodeInto(testapi.Default.Codec(), data, &node); err != nil { if err := runtime.DecodeInto(legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), data, &node); err != nil {
b.Fatalf("Unexpected error decoding node: %v", err) b.Fatalf("Unexpected error decoding node: %v", err)
} }
@ -163,7 +164,7 @@ func BenchmarkReplicationControllerCopy(b *testing.B) {
b.Fatalf("Unexpected error while reading file: %v", err) b.Fatalf("Unexpected error while reading file: %v", err)
} }
var replicationController api.ReplicationController var replicationController api.ReplicationController
if err := runtime.DecodeInto(testapi.Default.Codec(), data, &replicationController); err != nil { if err := runtime.DecodeInto(legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), data, &replicationController); err != nil {
b.Fatalf("Unexpected error decoding node: %v", err) b.Fatalf("Unexpected error decoding node: %v", err)
} }

View File

@ -0,0 +1,44 @@
/*
Copyright 2019 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package testing
import (
// Initialize install packages
_ "k8s.io/kubernetes/pkg/apis/admission/install"
_ "k8s.io/kubernetes/pkg/apis/admissionregistration/install"
_ "k8s.io/kubernetes/pkg/apis/apps/install"
_ "k8s.io/kubernetes/pkg/apis/auditregistration/install"
_ "k8s.io/kubernetes/pkg/apis/authentication/install"
_ "k8s.io/kubernetes/pkg/apis/authorization/install"
_ "k8s.io/kubernetes/pkg/apis/autoscaling/install"
_ "k8s.io/kubernetes/pkg/apis/batch/install"
_ "k8s.io/kubernetes/pkg/apis/certificates/install"
_ "k8s.io/kubernetes/pkg/apis/coordination/install"
_ "k8s.io/kubernetes/pkg/apis/core/install"
_ "k8s.io/kubernetes/pkg/apis/discovery/install"
_ "k8s.io/kubernetes/pkg/apis/events/install"
_ "k8s.io/kubernetes/pkg/apis/extensions/install"
_ "k8s.io/kubernetes/pkg/apis/flowcontrol/install"
_ "k8s.io/kubernetes/pkg/apis/imagepolicy/install"
_ "k8s.io/kubernetes/pkg/apis/networking/install"
_ "k8s.io/kubernetes/pkg/apis/node/install"
_ "k8s.io/kubernetes/pkg/apis/policy/install"
_ "k8s.io/kubernetes/pkg/apis/rbac/install"
_ "k8s.io/kubernetes/pkg/apis/scheduling/install"
_ "k8s.io/kubernetes/pkg/apis/settings/install"
_ "k8s.io/kubernetes/pkg/apis/storage/install"
)

View File

@ -42,7 +42,6 @@ import (
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
"k8s.io/apimachinery/pkg/watch" "k8s.io/apimachinery/pkg/watch"
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/apps"
k8s_apps_v1 "k8s.io/kubernetes/pkg/apis/apps/v1" k8s_apps_v1 "k8s.io/kubernetes/pkg/apis/apps/v1"
api "k8s.io/kubernetes/pkg/apis/core" api "k8s.io/kubernetes/pkg/apis/core"
@ -173,9 +172,16 @@ var commonKinds = []string{"Status", "ListOptions", "DeleteOptions", "ExportOpti
// TestCommonKindsRegistered verifies that all group/versions registered with // TestCommonKindsRegistered verifies that all group/versions registered with
// the testapi package have the common kinds. // the testapi package have the common kinds.
func TestCommonKindsRegistered(t *testing.T) { func TestCommonKindsRegistered(t *testing.T) {
gvs := map[schema.GroupVersion]bool{}
for gvk := range legacyscheme.Scheme.AllKnownTypes() {
if gvk.Version == runtime.APIVersionInternal {
continue
}
gvs[gvk.GroupVersion()] = true
}
for _, kind := range commonKinds { for _, kind := range commonKinds {
for _, group := range testapi.Groups { for gv := range gvs {
gv := group.GroupVersion()
gvk := gv.WithKind(kind) gvk := gv.WithKind(kind)
obj, err := legacyscheme.Scheme.New(gvk) obj, err := legacyscheme.Scheme.New(gvk)
if err != nil { if err != nil {
@ -186,7 +192,7 @@ func TestCommonKindsRegistered(t *testing.T) {
if obj, got, err = legacyscheme.Codecs.LegacyCodec().Decode([]byte(`{"kind":"`+kind+`"}`), &defaults, obj); err != nil || gvk != *got { if obj, got, err = legacyscheme.Codecs.LegacyCodec().Decode([]byte(`{"kind":"`+kind+`"}`), &defaults, obj); err != nil || gvk != *got {
t.Errorf("expected %v: %v %v", gvk, got, err) t.Errorf("expected %v: %v %v", gvk, got, err)
} }
data, err := runtime.Encode(legacyscheme.Codecs.LegacyCodec(*gv), obj) data, err := runtime.Encode(legacyscheme.Codecs.LegacyCodec(gv), obj)
if err != nil { if err != nil {
t.Errorf("expected %v: %v\n%s", gvk, err, string(data)) t.Errorf("expected %v: %v\n%s", gvk, err, string(data))
continue continue
@ -239,8 +245,8 @@ func TestEncodePtr(t *testing.T) {
}, },
} }
obj := runtime.Object(pod) obj := runtime.Object(pod)
data, err := runtime.Encode(testapi.Default.Codec(), obj) data, err := runtime.Encode(legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), obj)
obj2, err2 := runtime.Decode(testapi.Default.Codec(), data) obj2, err2 := runtime.Decode(legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), data)
if err != nil || err2 != nil { if err != nil || err2 != nil {
t.Fatalf("Failure: '%v' '%v'", err, err2) t.Fatalf("Failure: '%v' '%v'", err, err2)
} }
@ -262,7 +268,7 @@ metadata:
spec: spec:
containers: null containers: null
status: {}`) status: {}`)
if obj, err := runtime.Decode(testapi.Default.Codec(), testYAML); err != nil { if obj, err := runtime.Decode(legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), testYAML); err != nil {
t.Fatalf("unable to decode yaml: %v", err) t.Fatalf("unable to decode yaml: %v", err)
} else { } else {
if obj2, ok := obj.(*api.Pod); !ok { if obj2, ok := obj.(*api.Pod); !ok {
@ -279,11 +285,11 @@ status: {}`)
// an unknown kind will not be decoded without error. // an unknown kind will not be decoded without error.
func TestBadJSONRejection(t *testing.T) { func TestBadJSONRejection(t *testing.T) {
badJSONMissingKind := []byte(`{ }`) badJSONMissingKind := []byte(`{ }`)
if _, err := runtime.Decode(testapi.Default.Codec(), badJSONMissingKind); err == nil { if _, err := runtime.Decode(legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), badJSONMissingKind); err == nil {
t.Errorf("Did not reject despite lack of kind field: %s", badJSONMissingKind) t.Errorf("Did not reject despite lack of kind field: %s", badJSONMissingKind)
} }
badJSONUnknownType := []byte(`{"kind": "bar"}`) badJSONUnknownType := []byte(`{"kind": "bar"}`)
if _, err1 := runtime.Decode(testapi.Default.Codec(), badJSONUnknownType); err1 == nil { if _, err1 := runtime.Decode(legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), badJSONUnknownType); err1 == nil {
t.Errorf("Did not reject despite use of unknown type: %s", badJSONUnknownType) t.Errorf("Did not reject despite use of unknown type: %s", badJSONUnknownType)
} }
/*badJSONKindMismatch := []byte(`{"kind": "Pod"}`) /*badJSONKindMismatch := []byte(`{"kind": "Pod"}`)
@ -305,14 +311,14 @@ func TestUnversionedTypes(t *testing.T) {
for _, obj := range testcases { for _, obj := range testcases {
// Make sure the unversioned codec can encode // Make sure the unversioned codec can encode
unversionedJSON, err := runtime.Encode(testapi.Default.Codec(), obj) unversionedJSON, err := runtime.Encode(legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), obj)
if err != nil { if err != nil {
t.Errorf("%v: unexpected error: %v", obj, err) t.Errorf("%v: unexpected error: %v", obj, err)
continue continue
} }
// Make sure the versioned codec under test can decode // Make sure the versioned codec under test can decode
versionDecodedObject, err := runtime.Decode(testapi.Default.Codec(), unversionedJSON) versionDecodedObject, err := runtime.Decode(legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), unversionedJSON)
if err != nil { if err != nil {
t.Errorf("%v: unexpected error: %v", obj, err) t.Errorf("%v: unexpected error: %v", obj, err)
continue continue
@ -454,7 +460,7 @@ func BenchmarkEncodeCodec(b *testing.B) {
width := len(items) width := len(items)
b.ResetTimer() b.ResetTimer()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
if _, err := runtime.Encode(testapi.Default.Codec(), &items[i%width]); err != nil { if _, err := runtime.Encode(legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), &items[i%width]); err != nil {
b.Fatal(err) b.Fatal(err)
} }
} }
@ -474,7 +480,7 @@ func BenchmarkEncodeCodecFromInternal(b *testing.B) {
} }
b.ResetTimer() b.ResetTimer()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
if _, err := runtime.Encode(testapi.Default.Codec(), &encodable[i%width]); err != nil { if _, err := runtime.Encode(legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), &encodable[i%width]); err != nil {
b.Fatal(err) b.Fatal(err)
} }
} }
@ -495,7 +501,7 @@ func BenchmarkEncodeJSONMarshal(b *testing.B) {
} }
func BenchmarkDecodeCodec(b *testing.B) { func BenchmarkDecodeCodec(b *testing.B) {
codec := testapi.Default.Codec() codec := legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion)
items := benchmarkItems(b) items := benchmarkItems(b)
width := len(items) width := len(items)
encoded := make([][]byte, width) encoded := make([][]byte, width)
@ -517,7 +523,7 @@ func BenchmarkDecodeCodec(b *testing.B) {
} }
func BenchmarkDecodeIntoExternalCodec(b *testing.B) { func BenchmarkDecodeIntoExternalCodec(b *testing.B) {
codec := testapi.Default.Codec() codec := legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion)
items := benchmarkItems(b) items := benchmarkItems(b)
width := len(items) width := len(items)
encoded := make([][]byte, width) encoded := make([][]byte, width)
@ -540,7 +546,7 @@ func BenchmarkDecodeIntoExternalCodec(b *testing.B) {
} }
func BenchmarkDecodeIntoInternalCodec(b *testing.B) { func BenchmarkDecodeIntoInternalCodec(b *testing.B) {
codec := testapi.Default.Codec() codec := legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion)
items := benchmarkItems(b) items := benchmarkItems(b)
width := len(items) width := len(items)
encoded := make([][]byte, width) encoded := make([][]byte, width)
@ -564,7 +570,7 @@ func BenchmarkDecodeIntoInternalCodec(b *testing.B) {
// BenchmarkDecodeJSON provides a baseline for regular JSON decode performance // BenchmarkDecodeJSON provides a baseline for regular JSON decode performance
func BenchmarkDecodeIntoJSON(b *testing.B) { func BenchmarkDecodeIntoJSON(b *testing.B) {
codec := testapi.Default.Codec() codec := legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion)
items := benchmarkItems(b) items := benchmarkItems(b)
width := len(items) width := len(items)
encoded := make([][]byte, width) encoded := make([][]byte, width)
@ -589,7 +595,7 @@ func BenchmarkDecodeIntoJSON(b *testing.B) {
// BenchmarkDecodeIntoJSONCodecGenConfigFast provides a baseline // BenchmarkDecodeIntoJSONCodecGenConfigFast provides a baseline
// for JSON decode performance with jsoniter.ConfigFast // for JSON decode performance with jsoniter.ConfigFast
func BenchmarkDecodeIntoJSONCodecGenConfigFast(b *testing.B) { func BenchmarkDecodeIntoJSONCodecGenConfigFast(b *testing.B) {
kcodec := testapi.Default.Codec() kcodec := legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion)
items := benchmarkItems(b) items := benchmarkItems(b)
width := len(items) width := len(items)
encoded := make([][]byte, width) encoded := make([][]byte, width)
@ -616,7 +622,7 @@ func BenchmarkDecodeIntoJSONCodecGenConfigFast(b *testing.B) {
// jsoniter.ConfigCompatibleWithStandardLibrary, but with case sensitivity set // jsoniter.ConfigCompatibleWithStandardLibrary, but with case sensitivity set
// to true // to true
func BenchmarkDecodeIntoJSONCodecGenConfigCompatibleWithStandardLibrary(b *testing.B) { func BenchmarkDecodeIntoJSONCodecGenConfigCompatibleWithStandardLibrary(b *testing.B) {
kcodec := testapi.Default.Codec() kcodec := legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion)
items := benchmarkItems(b) items := benchmarkItems(b)
width := len(items) width := len(items)
encoded := make([][]byte, width) encoded := make([][]byte, width)
@ -654,7 +660,7 @@ func BenchmarkEncodeYAMLMarshal(b *testing.B) {
// BenchmarkDecodeYAML provides a baseline for regular YAML decode performance // BenchmarkDecodeYAML provides a baseline for regular YAML decode performance
func BenchmarkDecodeIntoYAML(b *testing.B) { func BenchmarkDecodeIntoYAML(b *testing.B) {
codec := testapi.Default.Codec() codec := legacyscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion)
items := benchmarkItems(b) items := benchmarkItems(b)
width := len(items) width := len(items)
encoded := make([][]byte, width) encoded := make([][]byte, width)

View File

@ -36,7 +36,6 @@ import (
"k8s.io/apimachinery/pkg/util/diff" "k8s.io/apimachinery/pkg/util/diff"
"k8s.io/apimachinery/pkg/util/json" "k8s.io/apimachinery/pkg/util/json"
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/api/testapi"
api "k8s.io/kubernetes/pkg/apis/core" api "k8s.io/kubernetes/pkg/apis/core"
) )
@ -120,55 +119,58 @@ func doRoundTrip(t *testing.T, internalVersion schema.GroupVersion, externalVers
} }
func TestRoundTrip(t *testing.T) { func TestRoundTrip(t *testing.T) {
for groupKey, group := range testapi.Groups { for gvk := range legacyscheme.Scheme.AllKnownTypes() {
for kind := range legacyscheme.Scheme.KnownTypes(*group.GroupVersion()) { if nonRoundTrippableTypes.Has(gvk.Kind) {
if nonRoundTrippableTypes.Has(kind) { continue
continue }
} if gvk.Version == runtime.APIVersionInternal {
t.Logf("Testing: %v in %v", kind, groupKey) continue
for i := 0; i < 50; i++ { }
doRoundTrip(t, schema.GroupVersion{Group: groupKey, Version: runtime.APIVersionInternal}, *group.GroupVersion(), kind) t.Logf("Testing: %v in %v", gvk.Kind, gvk.GroupVersion().String())
if t.Failed() { for i := 0; i < 50; i++ {
break doRoundTrip(t, schema.GroupVersion{Group: gvk.Group, Version: runtime.APIVersionInternal}, gvk.GroupVersion(), gvk.Kind)
} if t.Failed() {
break
} }
} }
} }
} }
func TestRoundTripWithEmptyCreationTimestamp(t *testing.T) { func TestRoundTripWithEmptyCreationTimestamp(t *testing.T) {
for groupKey, group := range testapi.Groups { for gvk := range legacyscheme.Scheme.AllKnownTypes() {
for kind := range legacyscheme.Scheme.KnownTypes(*group.GroupVersion()) { if nonRoundTrippableTypes.Has(gvk.Kind) {
if nonRoundTrippableTypes.Has(kind) { continue
continue }
} if gvk.Version == runtime.APIVersionInternal {
item, err := legacyscheme.Scheme.New(group.GroupVersion().WithKind(kind)) continue
if err != nil { }
t.Fatalf("Couldn't create external object %v: %v", kind, err)
}
t.Logf("Testing: %v in %v", kind, groupKey)
unstrBody, err := runtime.DefaultUnstructuredConverter.ToUnstructured(item) item, err := legacyscheme.Scheme.New(gvk)
if err != nil { if err != nil {
t.Fatalf("ToUnstructured failed: %v", err) t.Fatalf("Couldn't create external object %v: %v", gvk, err)
} }
t.Logf("Testing: %v in %v", gvk.Kind, gvk.GroupVersion().String())
unstructObj := &metaunstruct.Unstructured{} unstrBody, err := runtime.DefaultUnstructuredConverter.ToUnstructured(item)
unstructObj.Object = unstrBody if err != nil {
t.Fatalf("ToUnstructured failed: %v", err)
}
if meta, err := meta.Accessor(unstructObj); err == nil { unstructObj := &metaunstruct.Unstructured{}
meta.SetCreationTimestamp(metav1.Time{}) unstructObj.Object = unstrBody
} else {
t.Fatalf("Unable to set creation timestamp: %v", err)
}
// attempt to re-convert unstructured object - conversion should not fail if meta, err := meta.Accessor(unstructObj); err == nil {
// based on empty metadata fields, such as creationTimestamp meta.SetCreationTimestamp(metav1.Time{})
newObj := reflect.New(reflect.TypeOf(item).Elem()).Interface().(runtime.Object) } else {
err = runtime.DefaultUnstructuredConverter.FromUnstructured(unstructObj.Object, newObj) t.Fatalf("Unable to set creation timestamp: %v", err)
if err != nil { }
t.Fatalf("FromUnstructured failed: %v", err)
} // attempt to re-convert unstructured object - conversion should not fail
// based on empty metadata fields, such as creationTimestamp
newObj := reflect.New(reflect.TypeOf(item).Elem()).Interface().(runtime.Object)
err = runtime.DefaultUnstructuredConverter.FromUnstructured(unstructObj.Object, newObj)
if err != nil {
t.Fatalf("FromUnstructured failed: %v", err)
} }
} }
} }