func newRESTMapper(externalVersions []unversioned.GroupVersion) meta.RESTMapper { // the list of kinds that are scoped at the root of the api hierarchy // if a kind is not enumerated here, it is assumed to have a namespace scope rootScoped := sets.NewString() // these kinds should be excluded from the list of resources ignoredKinds := sets.NewString( "ListOptions", "DeleteOptions", "Status") mapper := api.NewDefaultRESTMapperFromScheme(externalVersions, interfacesFor, importPrefix, ignoredKinds, rootScoped, core.Scheme) // setup aliases for groups of resources mapper.AddResourceAlias("all", userResources...) return mapper }
func (gmf *GroupMetaFactory) newRESTMapper(scheme *runtime.Scheme, externalVersions []schema.GroupVersion, groupMeta *apimachinery.GroupMeta) meta.RESTMapper { // the list of kinds that are scoped at the root of the api hierarchy // if a kind is not enumerated here, it is assumed to have a namespace scope rootScoped := sets.NewString() if gmf.GroupArgs.RootScopedKinds != nil { rootScoped = gmf.GroupArgs.RootScopedKinds } ignoredKinds := sets.NewString() if gmf.GroupArgs.IgnoredKinds != nil { ignoredKinds = gmf.GroupArgs.IgnoredKinds } return api.NewDefaultRESTMapperFromScheme( externalVersions, groupMeta.InterfacesFor, gmf.GroupArgs.ImportPrefix, ignoredKinds, rootScoped, scheme, ) }
// Verifies that AddGroupVersions works as expected. func TestInstallAPIGroups(t *testing.T) { etcdserver, config, assert := setUp(t) defer etcdserver.Terminate(t) config.LegacyAPIGroupPrefixes = sets.NewString("/apiPrefix") config.DiscoveryAddresses = DefaultDiscoveryAddresses{DefaultAddress: "ExternalAddress"} s, err := config.SkipComplete().New() if err != nil { t.Fatalf("Error in bringing up the server: %v", err) } testAPI := func(gv schema.GroupVersion) APIGroupInfo { getter, noVerbs := testGetterStorage{}, testNoVerbsStorage{} scheme := runtime.NewScheme() scheme.AddKnownTypeWithName(gv.WithKind("Getter"), getter.New()) scheme.AddKnownTypeWithName(gv.WithKind("NoVerb"), noVerbs.New()) scheme.AddKnownTypes(v1.SchemeGroupVersion, &v1.ListOptions{}, &v1.DeleteOptions{}, &metav1.ExportOptions{}, &metav1.Status{}, ) interfacesFor := func(version schema.GroupVersion) (*meta.VersionInterfaces, error) { return &meta.VersionInterfaces{ ObjectConvertor: scheme, MetadataAccessor: meta.NewAccessor(), }, nil } mapper := api.NewDefaultRESTMapperFromScheme([]schema.GroupVersion{gv}, interfacesFor, "", sets.NewString(), sets.NewString(), scheme) groupMeta := apimachinery.GroupMeta{ GroupVersion: gv, GroupVersions: []schema.GroupVersion{gv}, RESTMapper: mapper, InterfacesFor: interfacesFor, } return APIGroupInfo{ GroupMeta: groupMeta, VersionedResourcesStorageMap: map[string]map[string]rest.Storage{ gv.Version: { "getter": &testGetterStorage{Version: gv.Version}, "noverbs": &testNoVerbsStorage{Version: gv.Version}, }, }, OptionsExternalVersion: &schema.GroupVersion{Version: "v1"}, ParameterCodec: api.ParameterCodec, NegotiatedSerializer: api.Codecs, Scheme: scheme, } } apis := []APIGroupInfo{ testAPI(schema.GroupVersion{Group: "", Version: "v1"}), testAPI(schema.GroupVersion{Group: "extensions", Version: "v1"}), testAPI(schema.GroupVersion{Group: "batch", Version: "v1"}), } err = s.InstallLegacyAPIGroup("/apiPrefix", &apis[0]) assert.NoError(err) groupPaths := []string{ config.LegacyAPIGroupPrefixes.List()[0], // /apiPrefix } for _, api := range apis[1:] { err = s.InstallAPIGroup(&api) assert.NoError(err) groupPaths = append(groupPaths, APIGroupPrefix+"/"+api.GroupMeta.GroupVersion.Group) // /apis/<group> } server := httptest.NewServer(s.InsecureHandler) defer server.Close() for i := range apis { // should serve APIGroup at group path info := &apis[i] path := groupPaths[i] resp, err := http.Get(server.URL + path) if err != nil { t.Errorf("[%d] unexpected error getting path %q path: %v", i, path, err) continue } body, err := ioutil.ReadAll(resp.Body) if err != nil { t.Errorf("[%d] unexpected error reading body at path %q: %v", i, path, err) continue } t.Logf("[%d] json at %s: %s", i, path, string(body)) if i == 0 { // legacy API returns APIVersions group := metav1.APIVersions{} err = json.Unmarshal(body, &group) if err != nil { t.Errorf("[%d] unexpected error parsing json body at path %q: %v", i, path, err) continue } } else { // API groups return APIGroup group := metav1.APIGroup{} err = json.Unmarshal(body, &group) if err != nil { t.Errorf("[%d] unexpected error parsing json body at path %q: %v", i, path, err) continue } if got, expected := group.Name, info.GroupMeta.GroupVersion.Group; got != expected { t.Errorf("[%d] unexpected group name at path %q: got=%q expected=%q", i, path, got, expected) continue } if got, expected := group.PreferredVersion.Version, info.GroupMeta.GroupVersion.Version; got != expected { t.Errorf("[%d] unexpected group version at path %q: got=%q expected=%q", i, path, got, expected) continue } } // should serve APIResourceList at group path + /<group-version> path = path + "/" + info.GroupMeta.GroupVersion.Version resp, err = http.Get(server.URL + path) if err != nil { t.Errorf("[%d] unexpected error getting path %q path: %v", i, path, err) continue } body, err = ioutil.ReadAll(resp.Body) if err != nil { t.Errorf("[%d] unexpected error reading body at path %q: %v", i, path, err) continue } t.Logf("[%d] json at %s: %s", i, path, string(body)) resources := metav1.APIResourceList{} err = json.Unmarshal(body, &resources) if err != nil { t.Errorf("[%d] unexpected error parsing json body at path %q: %v", i, path, err) continue } if got, expected := resources.GroupVersion, info.GroupMeta.GroupVersion.String(); got != expected { t.Errorf("[%d] unexpected groupVersion at path %q: got=%q expected=%q", i, path, got, expected) continue } // the verbs should match the features of resources for _, r := range resources.APIResources { switch r.Name { case "getter": if got, expected := sets.NewString([]string(r.Verbs)...), sets.NewString("get"); !got.Equal(expected) { t.Errorf("[%d] unexpected verbs for resource %s/%s: got=%v expected=%v", i, resources.GroupVersion, r.Name, got, expected) } case "noverbs": if r.Verbs == nil { t.Errorf("[%d] unexpected nil verbs slice. Expected: []string{}", i) } if got, expected := sets.NewString([]string(r.Verbs)...), sets.NewString(); !got.Equal(expected) { t.Errorf("[%d] unexpected verbs for resource %s/%s: got=%v expected=%v", i, resources.GroupVersion, r.Name, got, expected) } } } } }