// NewREST returns a RESTStorage object that will work against clusters. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ NewFunc: func() runtime.Object { return &federation.Cluster{} }, NewListFunc: func() runtime.Object { return &federation.ClusterList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*federation.Cluster).Name, nil }, PredicateFunc: cluster.MatchCluster, QualifiedResource: federation.Resource("clusters"), CreateStrategy: cluster.Strategy, UpdateStrategy: cluster.Strategy, DeleteStrategy: cluster.Strategy, ReturnDeletedObject: true, } options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: cluster.GetAttrs} if err := store.CompleteWithOptions(options); err != nil { panic(err) // TODO: Propagate error up } statusStore := *store statusStore.UpdateStrategy = cluster.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore} }
func installFederationAPIs(s *options.APIServer, g *genericapiserver.GenericAPIServer, f genericapiserver.StorageFactory) { storage, err := f.New(federation.Resource("clusters")) if err != nil { glog.Fatalf("Unable to find storage destination for %v, due to %v", "clusters", err.Error()) } clusterStorage, clusterStatusStorage := clusteretcd.NewREST(generic.RESTOptions{ Storage: storage, Decorator: g.StorageDecorator(), DeleteCollectionWorkers: s.DeleteCollectionWorkers, }) federationResources := map[string]rest.Storage{ "clusters": clusterStorage, "clusters/status": clusterStatusStorage, } federationGroupMeta := registered.GroupOrDie(federation.GroupName) apiGroupInfo := genericapiserver.APIGroupInfo{ GroupMeta: *federationGroupMeta, VersionedResourcesStorageMap: map[string]map[string]rest.Storage{ "v1alpha1": federationResources, }, OptionsExternalVersion: ®istered.GroupOrDie(api.GroupName).GroupVersion, Scheme: api.Scheme, ParameterCodec: api.ParameterCodec, NegotiatedSerializer: api.Codecs, } if err := g.InstallAPIGroup(&apiGroupInfo); err != nil { glog.Fatalf("Error in registering group versions: %v", err) } }
// NewREST returns a RESTStorage object that will work against clusters. func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &federation.ClusterList{} } storageInterface, _ := opts.Decorator( opts.StorageConfig, 100, &federation.Cluster{}, prefix, cluster.Strategy, newListFunc, cluster.GetAttrs, storage.NoTriggerPublisher, ) store := &genericregistry.Store{ NewFunc: func() runtime.Object { return &federation.Cluster{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return prefix }, KeyFunc: func(ctx api.Context, name string) (string, error) { return genericregistry.NoNamespaceKeyFunc(ctx, prefix, name) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*federation.Cluster).Name, nil }, PredicateFunc: cluster.MatchCluster, QualifiedResource: federation.Resource("clusters"), EnableGarbageCollection: opts.EnableGarbageCollection, DeleteCollectionWorkers: opts.DeleteCollectionWorkers, CreateStrategy: cluster.Strategy, UpdateStrategy: cluster.Strategy, DeleteStrategy: cluster.Strategy, ReturnDeletedObject: true, Storage: storageInterface, } statusStore := *store statusStore.UpdateStrategy = cluster.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore} }
func testUnjoinFederationFactory(name, server, secret string) cmdutil.Factory { urlPrefix := "/clusters/" cluster := fakeCluster(name, name, server) if secret != "" { cluster.Spec.SecretRef.Name = secret } f, tf, _, _ := cmdtesting.NewAPIFactory() codec := testapi.Federation.Codec() tf.ClientConfig = kubefedtesting.DefaultClientConfig() ns := testapi.Federation.NegotiatedSerializer() tf.Client = &fake.RESTClient{ NegotiatedSerializer: ns, GroupName: "federation", Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { switch p, m := req.URL.Path, req.Method; { case strings.HasPrefix(p, urlPrefix): got := strings.TrimPrefix(p, urlPrefix) if got != name { return nil, errors.NewNotFound(federationapi.Resource("clusters"), got) } switch m { case http.MethodGet: return &http.Response{StatusCode: http.StatusOK, Header: kubefedtesting.DefaultHeader(), Body: kubefedtesting.ObjBody(codec, &cluster)}, nil case http.MethodDelete: status := unversioned.Status{ Status: "Success", } return &http.Response{StatusCode: http.StatusOK, Header: kubefedtesting.DefaultHeader(), Body: kubefedtesting.ObjBody(codec, &status)}, nil default: return nil, fmt.Errorf("unexpected method: %#v\n%#v", req.URL, req) } default: return nil, fmt.Errorf("unexpected request: %#v\n%#v", req.URL, req) } }), } tf.Namespace = "test" return f }
func installFederationAPIs(s *genericapiserver.ServerRunOptions, g *genericapiserver.GenericAPIServer, f genericapiserver.StorageFactory) { clusterStorage, clusterStatusStorage := clusteretcd.NewREST(createRESTOptionsOrDie(s, g, f, federation.Resource("clusters"))) federationResources := map[string]rest.Storage{ "clusters": clusterStorage, "clusters/status": clusterStatusStorage, } federationGroupMeta := registered.GroupOrDie(federation.GroupName) apiGroupInfo := genericapiserver.APIGroupInfo{ GroupMeta: *federationGroupMeta, VersionedResourcesStorageMap: map[string]map[string]rest.Storage{ "v1alpha1": federationResources, }, OptionsExternalVersion: ®istered.GroupOrDie(api.GroupName).GroupVersion, Scheme: api.Scheme, ParameterCodec: api.ParameterCodec, NegotiatedSerializer: api.Codecs, } if err := g.InstallAPIGroup(&apiGroupInfo); err != nil { glog.Fatalf("Error in registering group versions: %v", err) } }