diff --git a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install/install.go b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install/install.go
index 39a4b1bbd16f..9917557830c7 100644
--- a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install/install.go
+++ b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install/install.go
@@ -34,7 +34,7 @@ import (
"k8s.io/kubernetes/pkg/util/sets"
)
-const importPrefix = "k8s.io/kubernetes/pkg/apis/testgroup"
+const importPrefix = "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup"
var accessor = meta.NewAccessor()
diff --git a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1/register.go b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1/register.go
index 9f6e96ae0a78..90dbbbfeb4f2 100644
--- a/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1/register.go
+++ b/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1/register.go
@@ -40,7 +40,10 @@ func addKnownTypes(scheme *runtime.Scheme) {
)
scheme.AddKnownTypes(SchemeGroupVersion,
- &v1.ListOptions{})
+ &v1.ListOptions{},
+ &v1.DeleteOptions{},
+ &unversioned.Status{},
+ &v1.ExportOptions{})
}
func (obj *TestType) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta }
diff --git a/examples/apiserver/README.md b/examples/apiserver/README.md
new file mode 100644
index 000000000000..522544984f8e
--- /dev/null
+++ b/examples/apiserver/README.md
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
PLEASE NOTE: This document applies to the HEAD of the source tree
+
+If you are using a released version of Kubernetes, you should
+refer to the docs that go with that version.
+
+Documentation for other releases can be found at
+[releases.k8s.io](http://releases.k8s.io).
+
+--
+
+
+
+
+
+# API Server
+
+This is a work in progress example for an API Server.
+We are working on isolating the generic api server code from kubernetes specific
+API objects. Some relevant issues:
+
+* https://github.com/kubernetes/kubernetes/issues/17412
+* https://github.com/kubernetes/kubernetes/issues/2742
+* https://github.com/kubernetes/kubernetes/issues/13541
+
+This code here is to examplify what it takes to write your own API server.
+
+
+
+[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/examples/apiserver/README.md?pixel)]()
+
diff --git a/examples/apiserver/rest/reststorage.go b/examples/apiserver/rest/reststorage.go
new file mode 100644
index 000000000000..8b9a71478788
--- /dev/null
+++ b/examples/apiserver/rest/reststorage.go
@@ -0,0 +1,65 @@
+/*
+Copyright 2016 The Kubernetes Authors All rights reserved.
+
+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 rest
+
+import (
+ "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup"
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/fields"
+ "k8s.io/kubernetes/pkg/labels"
+ "k8s.io/kubernetes/pkg/registry/generic"
+ etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
+ "k8s.io/kubernetes/pkg/runtime"
+ "k8s.io/kubernetes/pkg/storage"
+)
+
+type REST struct {
+ *etcdgeneric.Etcd
+}
+
+// NewREST returns a RESTStorage object that will work with testtype.
+func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *REST {
+ prefix := "/testtype"
+ newListFunc := func() runtime.Object { return &testgroup.TestTypeList{} }
+ storageInterface := storageDecorator(
+ s, 100, &testgroup.TestType{}, prefix, false, newListFunc)
+ store := &etcdgeneric.Etcd{
+ NewFunc: func() runtime.Object { return &testgroup.TestType{} },
+ // NewListFunc returns an object capable of storing results of an etcd list.
+ NewListFunc: newListFunc,
+ // Produces a path that etcd understands, to the root of the resource
+ // by combining the namespace in the context with the given prefix.
+ KeyRootFunc: func(ctx api.Context) string {
+ return etcdgeneric.NamespaceKeyRootFunc(ctx, prefix)
+ },
+ // Produces a path that etcd understands, to the resource by combining
+ // the namespace in the context with the given prefix.
+ KeyFunc: func(ctx api.Context, name string) (string, error) {
+ return etcdgeneric.NamespaceKeyFunc(ctx, prefix, name)
+ },
+ // Retrieve the name field of the resource.
+ ObjectNameFunc: func(obj runtime.Object) (string, error) {
+ return obj.(*testgroup.TestType).Name, nil
+ },
+ // Used to match objects based on labels/fields for list.
+ PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher {
+ return generic.MatcherFunc(nil)
+ },
+ Storage: storageInterface,
+ }
+ return &REST{store}
+}
diff --git a/examples/apiserver/server.go b/examples/apiserver/server.go
new file mode 100644
index 000000000000..cd565e43a3c1
--- /dev/null
+++ b/examples/apiserver/server.go
@@ -0,0 +1,78 @@
+/*
+Copyright 2016 The Kubernetes Authors All rights reserved.
+
+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 main
+
+import (
+ "github.com/golang/glog"
+ "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/v1"
+ testgroupetcd "k8s.io/kubernetes/examples/apiserver/rest"
+ "k8s.io/kubernetes/pkg/api/rest"
+ "k8s.io/kubernetes/pkg/apimachinery"
+ "k8s.io/kubernetes/pkg/apimachinery/registered"
+ "k8s.io/kubernetes/pkg/genericapiserver"
+ etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
+
+ // Install the testgroup API
+ _ "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/testdata/apis/testgroup/install"
+)
+
+func newStorageDestinations(groupName string, groupMeta *apimachinery.GroupMeta) (*genericapiserver.StorageDestinations, error) {
+ storageDestinations := genericapiserver.NewStorageDestinations()
+ var storageConfig etcdstorage.EtcdConfig
+ storageConfig.ServerList = []string{"http://127.0.0.1:4001"}
+ storageConfig.Prefix = genericapiserver.DefaultEtcdPathPrefix
+ storageConfig.Codec = groupMeta.Codec
+ storageInterface, err := storageConfig.NewStorage()
+ if err != nil {
+ return nil, err
+ }
+ storageDestinations.AddAPIGroup(groupName, storageInterface)
+ return &storageDestinations, nil
+}
+
+func main() {
+ config := genericapiserver.Config{
+ EnableIndex: true,
+ APIPrefix: "/api",
+ APIGroupPrefix: "/apis",
+ }
+ s := genericapiserver.New(&config)
+
+ groupVersion := v1.SchemeGroupVersion
+ groupName := groupVersion.Group
+ groupMeta, err := registered.Group(groupName)
+ if err != nil {
+ glog.Fatalf("%v", err)
+ }
+ storageDestinations, err := newStorageDestinations(groupName, groupMeta)
+ if err != nil {
+ glog.Fatalf("Unable to init etcd: %v", err)
+ }
+ restStorageMap := map[string]rest.Storage{
+ "testtypes": testgroupetcd.NewREST(storageDestinations.Get(groupName, "testtype"), s.StorageDecorator()),
+ }
+ apiGroupInfo := genericapiserver.APIGroupInfo{
+ GroupMeta: *groupMeta,
+ VersionedResourcesStorageMap: map[string]map[string]rest.Storage{
+ groupVersion.Version: restStorageMap,
+ },
+ }
+ if err := s.InstallAPIGroups([]genericapiserver.APIGroupInfo{apiGroupInfo}); err != nil {
+ glog.Fatalf("Error in installing API: %v", err)
+ }
+ s.Run(genericapiserver.NewServerRunOptions())
+}