func newExternalScheme() (*runtime.Scheme, meta.RESTMapper, runtime.Codec) { scheme := runtime.NewScheme() scheme.AddKnownTypeWithName(internalGV.WithKind("Type"), &internalType{}) scheme.AddKnownTypeWithName(unlikelyGV.WithKind("Type"), &externalType{}) //This tests that kubectl will not confuse the external scheme with the internal scheme, even when they accidentally have versions of the same name. scheme.AddKnownTypeWithName(validVersionGV.WithKind("Type"), &ExternalType2{}) codecs := serializer.NewCodecFactory(scheme) codec := codecs.LegacyCodec(unlikelyGV) mapper := meta.NewDefaultRESTMapper([]unversioned.GroupVersion{unlikelyGV, validVersionGV}, func(version unversioned.GroupVersion) (*meta.VersionInterfaces, error) { return &meta.VersionInterfaces{ ObjectConvertor: scheme, MetadataAccessor: meta.NewAccessor(), }, versionErrIfFalse(version == validVersionGV || version == unlikelyGV) }) for _, gv := range []unversioned.GroupVersion{unlikelyGV, validVersionGV} { for kind := range scheme.KnownTypes(gv) { gvk := gv.WithKind(kind) scope := meta.RESTScopeNamespace mapper.Add(gvk, scope) } } return scheme, mapper, codec }
func TestResourceVersionerOfAPI(t *testing.T) { type T struct { runtime.Object Expected string } testCases := map[string]T{ "empty api object": {&MyAPIObject{}, ""}, "api object with version": {&MyAPIObject{TypeMeta: InternalTypeMeta{ResourceVersion: "1"}}, "1"}, "pointer to api object with version": {&MyAPIObject{TypeMeta: InternalTypeMeta{ResourceVersion: "1"}}, "1"}, } versioning := meta.NewAccessor() for key, testCase := range testCases { actual, err := versioning.ResourceVersion(testCase.Object) if err != nil { t.Errorf("%s: unexpected error %#v", key, err) } if actual != testCase.Expected { t.Errorf("%s: expected %v, got %v", key, testCase.Expected, actual) } } failingCases := map[string]struct { runtime.Object Expected string }{ "not a valid object to try": {&MyIncorrectlyMarkedAsAPIObject{}, "1"}, } for key, testCase := range failingCases { _, err := versioning.ResourceVersion(testCase.Object) if err == nil { t.Errorf("%s: expected error, got nil", key) } } setCases := map[string]struct { runtime.Object Expected string }{ "pointer to api object with version": {&MyAPIObject{TypeMeta: InternalTypeMeta{ResourceVersion: "1"}}, "1"}, } for key, testCase := range setCases { if err := versioning.SetResourceVersion(testCase.Object, "5"); err != nil { t.Errorf("%s: unexpected error %#v", key, err) } actual, err := versioning.ResourceVersion(testCase.Object) if err != nil { t.Errorf("%s: unexpected error %#v", key, err) } if actual != "5" { t.Errorf("%s: expected %v, got %v", key, "5", actual) } } }
func TestTypeMetaSelfLinker(t *testing.T) { table := map[string]struct { obj runtime.Object expect string try string succeed bool }{ "normal": { obj: &MyAPIObject{TypeMeta: InternalTypeMeta{SelfLink: "foobar"}}, expect: "foobar", try: "newbar", succeed: true, }, "fail": { obj: &MyIncorrectlyMarkedAsAPIObject{}, succeed: false, }, } linker := runtime.SelfLinker(meta.NewAccessor()) for name, item := range table { got, err := linker.SelfLink(item.obj) if e, a := item.succeed, err == nil; e != a { t.Errorf("%v: expected %v, got %v", name, e, a) } if e, a := item.expect, got; item.succeed && e != a { t.Errorf("%v: expected %v, got %v", name, e, a) } err = linker.SetSelfLink(item.obj, item.try) if e, a := item.succeed, err == nil; e != a { t.Errorf("%v: expected %v, got %v", name, e, a) } if item.succeed { got, err := linker.SelfLink(item.obj) if err != nil { t.Errorf("%v: expected no err, got %v", name, err) } if e, a := item.try, got; e != a { t.Errorf("%v: expected %v, got %v", name, e, a) } } } }
"github.com/golang/glog" "github.com/ttysteale/kubernetes-api/api" "github.com/ttysteale/kubernetes-api/api/meta" "github.com/ttysteale/kubernetes-api/api/unversioned" "github.com/ttysteale/kubernetes-api/apimachinery" "github.com/ttysteale/kubernetes-api/apimachinery/registered" "github.com/ttysteale/kubernetes-api/apis/certificates" "github.com/ttysteale/kubernetes-api/apis/certificates/v1alpha1" "github.com/ttysteale/kubernetes-api/runtime" "github.com/ttysteale/kubernetes-api/util/sets" ) const importPrefix = "github.com/ttysteale/kubernetes-api/apis/certificates" var accessor = meta.NewAccessor() // availableVersions lists all known external versions for this group from most preferred to least preferred var availableVersions = []unversioned.GroupVersion{v1alpha1.SchemeGroupVersion} func init() { registered.RegisterVersions(availableVersions) externalVersions := []unversioned.GroupVersion{} for _, v := range availableVersions { if registered.IsAllowedVersion(v) { externalVersions = append(externalVersions, v) } } if len(externalVersions) == 0 { glog.V(4).Infof("No version is registered for group %v", certificates.GroupName) return
func TestGenericTypeMetaAccessor(t *testing.T) { j := &InternalObject{ InternalTypeMeta{ Namespace: "bar", Name: "foo", GenerateName: "prefix", UID: "uid", APIVersion: "/a", Kind: "b", ResourceVersion: "1", SelfLink: "some/place/only/we/know", Labels: map[string]string{"foo": "bar"}, Annotations: map[string]string{"x": "y"}, // OwnerReferences are tested separately }, } accessor := meta.NewAccessor() namespace, err := accessor.Namespace(j) if err != nil { t.Errorf("unexpected error: %v", err) } if e, a := "bar", namespace; e != a { t.Errorf("expected %v, got %v", e, a) } name, err := accessor.Name(j) if err != nil { t.Errorf("unexpected error: %v", err) } if e, a := "foo", name; e != a { t.Errorf("expected %v, got %v", e, a) } generateName, err := accessor.GenerateName(j) if err != nil { t.Errorf("unexpected error: %v", err) } if e, a := "prefix", generateName; e != a { t.Errorf("expected %v, got %v", e, a) } uid, err := accessor.UID(j) if err != nil { t.Errorf("unexpected error: %v", err) } if e, a := "uid", string(uid); e != a { t.Errorf("expected %v, got %v", e, a) } apiVersion, err := accessor.APIVersion(j) if err != nil { t.Errorf("unexpected error: %v", err) } if e, a := "a", apiVersion; e != a { t.Errorf("expected %v, got %v", e, a) } kind, err := accessor.Kind(j) if err != nil { t.Errorf("unexpected error: %v", err) } if e, a := "b", kind; e != a { t.Errorf("expected %v, got %v", e, a) } rv, err := accessor.ResourceVersion(j) if err != nil { t.Errorf("unexpected error: %v", err) } if e, a := "1", rv; e != a { t.Errorf("expected %v, got %v", e, a) } selfLink, err := accessor.SelfLink(j) if err != nil { t.Errorf("unexpected error: %v", err) } if e, a := "some/place/only/we/know", selfLink; e != a { t.Errorf("expected %v, got %v", e, a) } labels, err := accessor.Labels(j) if err != nil { t.Errorf("unexpected error: %v", err) } if e, a := 1, len(labels); e != a { t.Errorf("expected %v, got %v", e, a) } annotations, err := accessor.Annotations(j) if err != nil { t.Errorf("unexpected error: %v", err) } if e, a := 1, len(annotations); e != a { t.Errorf("expected %v, got %v", e, a) } if err := accessor.SetNamespace(j, "baz"); err != nil { t.Errorf("unexpected error: %v", err) } if err := accessor.SetName(j, "bar"); err != nil { t.Errorf("unexpected error: %v", err) } if err := accessor.SetGenerateName(j, "generate"); err != nil { t.Errorf("unexpected error: %v", err) } if err := accessor.SetUID(j, "other"); err != nil { t.Errorf("unexpected error: %v", err) } if err := accessor.SetAPIVersion(j, "c"); err != nil { t.Errorf("unexpected error: %v", err) } if err := accessor.SetKind(j, "d"); err != nil { t.Errorf("unexpected error: %v", err) } if err := accessor.SetResourceVersion(j, "2"); err != nil { t.Errorf("unexpected error: %v", err) } if err := accessor.SetSelfLink(j, "google.com"); err != nil { t.Errorf("unexpected error: %v", err) } if err := accessor.SetLabels(j, map[string]string{}); err != nil { t.Errorf("unexpected error: %v", err) } var nilMap map[string]string if err := accessor.SetAnnotations(j, nilMap); err != nil { t.Errorf("unexpected error: %v", err) } // Prove that accessor changes the original object. if e, a := "baz", j.TypeMeta.Namespace; e != a { t.Errorf("expected %v, got %v", e, a) } if e, a := "bar", j.TypeMeta.Name; e != a { t.Errorf("expected %v, got %v", e, a) } if e, a := "generate", j.TypeMeta.GenerateName; e != a { t.Errorf("expected %v, got %v", e, a) } if e, a := "other", j.TypeMeta.UID; e != a { t.Errorf("expected %v, got %v", e, a) } if e, a := "c", j.TypeMeta.APIVersion; e != a { t.Errorf("expected %v, got %v", e, a) } if e, a := "d", j.TypeMeta.Kind; e != a { t.Errorf("expected %v, got %v", e, a) } if e, a := "2", j.TypeMeta.ResourceVersion; e != a { t.Errorf("expected %v, got %v", e, a) } if e, a := "google.com", j.TypeMeta.SelfLink; e != a { t.Errorf("expected %v, got %v", e, a) } if e, a := map[string]string{}, j.TypeMeta.Labels; !reflect.DeepEqual(e, a) { t.Errorf("expected %#v, got %#v", e, a) } if e, a := nilMap, j.TypeMeta.Annotations; !reflect.DeepEqual(e, a) { t.Errorf("expected %#v, got %#v", e, a) } }