diff --git a/pkg/api/conversion.go b/pkg/api/conversion.go index f5ceb96bbc..7802dd660a 100644 --- a/pkg/api/conversion.go +++ b/pkg/api/conversion.go @@ -81,6 +81,60 @@ func init() { *out = (*in).String() return nil }, + func(in *string, out *unversioned.LabelSelector, s conversion.Scope) error { + selector, err := labels.Parse(*in) + if err != nil { + return err + } + *out = unversioned.LabelSelector{selector} + return nil + }, + func(in *string, out *unversioned.FieldSelector, s conversion.Scope) error { + selector, err := fields.ParseSelector(*in) + if err != nil { + return err + } + *out = unversioned.FieldSelector{selector} + return nil + }, + func(in *[]string, out *unversioned.LabelSelector, s conversion.Scope) error { + selectorString := "" + if len(*in) > 0 { + selectorString = (*in)[0] + } + selector, err := labels.Parse(selectorString) + if err != nil { + return err + } + *out = unversioned.LabelSelector{selector} + return nil + }, + func(in *[]string, out *unversioned.FieldSelector, s conversion.Scope) error { + selectorString := "" + if len(*in) > 0 { + selectorString = (*in)[0] + } + selector, err := fields.ParseSelector(selectorString) + if err != nil { + return err + } + *out = unversioned.FieldSelector{selector} + return nil + }, + func(in *unversioned.LabelSelector, out *string, s conversion.Scope) error { + if in.Selector == nil { + return nil + } + *out = in.Selector.String() + return nil + }, + func(in *unversioned.FieldSelector, out *string, s conversion.Scope) error { + if in.Selector == nil { + return nil + } + *out = in.Selector.String() + return nil + }, func(in *resource.Quantity, out *resource.Quantity, s conversion.Scope) error { // Cannot deep copy these, because inf.Dec has unexported fields. *out = *in.Copy() diff --git a/pkg/api/rest/rest.go b/pkg/api/rest/rest.go index 2308876b7e..ec0f97c5f2 100644 --- a/pkg/api/rest/rest.go +++ b/pkg/api/rest/rest.go @@ -22,6 +22,7 @@ import ( "net/url" "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/watch" ) @@ -60,7 +61,7 @@ type Lister interface { // This object must be a pointer type for use with Codec.DecodeInto([]byte, runtime.Object) NewList() runtime.Object // List selects resources in the storage which match to the selector. 'options' can be nil. - List(ctx api.Context, options *api.ListOptions) (runtime.Object, error) + List(ctx api.Context, options *unversioned.ListOptions) (runtime.Object, error) } // Getter is an object that can retrieve a named RESTful resource. @@ -181,7 +182,7 @@ type Watcher interface { // are supported; an error should be returned if 'field' tries to select on a field that // isn't supported. 'resourceVersion' allows for continuing/starting a watch at a // particular version. - Watch(ctx api.Context, options *api.ListOptions) (watch.Interface, error) + Watch(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) } // StandardStorage is an interface covering the common verbs. Provided for testing whether a diff --git a/pkg/api/rest/resttest/resttest.go b/pkg/api/rest/resttest/resttest.go index d565eb0abd..058a515d4b 100644 --- a/pkg/api/rest/resttest/resttest.go +++ b/pkg/api/rest/resttest/resttest.go @@ -864,7 +864,7 @@ func (t *Tester) testListMatchLabels(obj runtime.Object, assignFn AssignFunc) { filtered := []runtime.Object{objs[1]} selector := labels.SelectorFromSet(labels.Set(testLabels)) - options := &api.ListOptions{LabelSelector: selector} + options := &unversioned.ListOptions{LabelSelector: unversioned.LabelSelector{selector}} listObj, err := t.storage.(rest.Lister).List(ctx, options) if err != nil { t.Errorf("unexpected error: %v", err) @@ -906,7 +906,7 @@ func (t *Tester) testWatchFields(obj runtime.Object, emitFn EmitFunc, fieldsPass for _, field := range fieldsPass { for _, action := range actions { - options := &api.ListOptions{FieldSelector: field.AsSelector(), ResourceVersion: "1"} + options := &unversioned.ListOptions{FieldSelector: unversioned.FieldSelector{field.AsSelector()}, ResourceVersion: "1"} watcher, err := t.storage.(rest.Watcher).Watch(ctx, options) if err != nil { t.Errorf("unexpected error: %v, %v", err, action) @@ -930,7 +930,7 @@ func (t *Tester) testWatchFields(obj runtime.Object, emitFn EmitFunc, fieldsPass for _, field := range fieldsFail { for _, action := range actions { - options := &api.ListOptions{FieldSelector: field.AsSelector(), ResourceVersion: "1"} + options := &unversioned.ListOptions{FieldSelector: unversioned.FieldSelector{field.AsSelector()}, ResourceVersion: "1"} watcher, err := t.storage.(rest.Watcher).Watch(ctx, options) if err != nil { t.Errorf("unexpected error: %v", err) @@ -955,7 +955,7 @@ func (t *Tester) testWatchLabels(obj runtime.Object, emitFn EmitFunc, labelsPass for _, label := range labelsPass { for _, action := range actions { - options := &api.ListOptions{LabelSelector: label.AsSelector(), ResourceVersion: "1"} + options := &unversioned.ListOptions{LabelSelector: unversioned.LabelSelector{label.AsSelector()}, ResourceVersion: "1"} watcher, err := t.storage.(rest.Watcher).Watch(ctx, options) if err != nil { t.Errorf("unexpected error: %v", err) @@ -978,7 +978,7 @@ func (t *Tester) testWatchLabels(obj runtime.Object, emitFn EmitFunc, labelsPass for _, label := range labelsFail { for _, action := range actions { - options := &api.ListOptions{LabelSelector: label.AsSelector(), ResourceVersion: "1"} + options := &unversioned.ListOptions{LabelSelector: unversioned.LabelSelector{label.AsSelector()}, ResourceVersion: "1"} watcher, err := t.storage.(rest.Watcher).Watch(ctx, options) if err != nil { t.Errorf("unexpected error: %v", err) diff --git a/pkg/api/testing/fuzzer.go b/pkg/api/testing/fuzzer.go index 5a74873fdf..b6d7a86fcf 100644 --- a/pkg/api/testing/fuzzer.go +++ b/pkg/api/testing/fuzzer.go @@ -91,6 +91,13 @@ func FuzzerFor(t *testing.T, version string, src rand.Source) *fuzz.Fuzzer { j.LabelSelector, _ = labels.Parse("a=b") j.FieldSelector, _ = fields.ParseSelector("a=b") }, + func(j *unversioned.ListOptions, c fuzz.Continue) { + // TODO: add some parsing + label, _ := labels.Parse("a=b") + j.LabelSelector = unversioned.LabelSelector{label} + field, _ := fields.ParseSelector("a=b") + j.FieldSelector = unversioned.FieldSelector{field} + }, func(s *api.PodSpec, c fuzz.Continue) { c.FuzzNoCustom(s) // has a default value diff --git a/pkg/apiserver/apiserver_test.go b/pkg/apiserver/apiserver_test.go index 90b1c4a318..07f90ed758 100644 --- a/pkg/apiserver/apiserver_test.go +++ b/pkg/apiserver/apiserver_test.go @@ -112,50 +112,23 @@ func newMapper() *meta.DefaultRESTMapper { } func addGrouplessTypes() { - type ListOptions struct { - runtime.Object - unversioned.TypeMeta `json:",inline"` - LabelSelector string `json:"labelSelector,omitempty"` - FieldSelector string `json:"fieldSelector,omitempty"` - Watch bool `json:"watch,omitempty"` - ResourceVersion string `json:"resourceVersion,omitempty"` - TimeoutSeconds *int64 `json:"timeoutSeconds,omitempty"` - } api.Scheme.AddKnownTypes( grouplessGroupVersion.String(), &apiservertesting.Simple{}, &apiservertesting.SimpleList{}, &unversioned.Status{}, - &ListOptions{}, &api.DeleteOptions{}, &apiservertesting.SimpleGetOptions{}, &apiservertesting.SimpleRoot{}) + &unversioned.ListOptions{}, &api.DeleteOptions{}, &apiservertesting.SimpleGetOptions{}, &apiservertesting.SimpleRoot{}) api.Scheme.AddKnownTypes(grouplessGroupVersion.String(), &api.Pod{}) } func addTestTypes() { - type ListOptions struct { - runtime.Object - unversioned.TypeMeta `json:",inline"` - LabelSelector string `json:"labels,omitempty"` - FieldSelector string `json:"fields,omitempty"` - Watch bool `json:"watch,omitempty"` - ResourceVersion string `json:"resourceVersion,omitempty"` - TimeoutSeconds *int64 `json:"timeoutSeconds,omitempty"` - } api.Scheme.AddKnownTypes( testGroupVersion.String(), &apiservertesting.Simple{}, &apiservertesting.SimpleList{}, &unversioned.Status{}, - &ListOptions{}, &api.DeleteOptions{}, &apiservertesting.SimpleGetOptions{}, &apiservertesting.SimpleRoot{}) + &unversioned.ListOptions{}, &api.DeleteOptions{}, &apiservertesting.SimpleGetOptions{}, &apiservertesting.SimpleRoot{}) api.Scheme.AddKnownTypes(testGroupVersion.String(), &api.Pod{}) } func addNewTestTypes() { - type ListOptions struct { - runtime.Object - unversioned.TypeMeta `json:",inline"` - LabelSelector string `json:"labelSelector,omitempty"` - FieldSelector string `json:"fieldSelector,omitempty"` - Watch bool `json:"watch,omitempty"` - ResourceVersion string `json:"resourceVersion,omitempty"` - TimeoutSeconds *int64 `json:"timeoutSeconds,omitempty"` - } api.Scheme.AddKnownTypes( newGroupVersion.String(), &apiservertesting.Simple{}, &apiservertesting.SimpleList{}, &unversioned.Status{}, - &ListOptions{}, &api.DeleteOptions{}, &apiservertesting.SimpleGetOptions{}, &apiservertesting.SimpleRoot{}) + &unversioned.ListOptions{}, &api.DeleteOptions{}, &apiservertesting.SimpleGetOptions{}, &apiservertesting.SimpleRoot{}) } func init() { @@ -165,7 +138,7 @@ func init() { // "internal" version api.Scheme.AddKnownTypes( "", &apiservertesting.Simple{}, &apiservertesting.SimpleList{}, &unversioned.Status{}, - &api.ListOptions{}, &apiservertesting.SimpleGetOptions{}, &apiservertesting.SimpleRoot{}) + &unversioned.ListOptions{}, &apiservertesting.SimpleGetOptions{}, &apiservertesting.SimpleRoot{}) addGrouplessTypes() addTestTypes() addNewTestTypes() @@ -363,18 +336,18 @@ type SimpleRESTStorage struct { injectedFunction func(obj runtime.Object) (returnObj runtime.Object, err error) } -func (storage *SimpleRESTStorage) List(ctx api.Context, options *api.ListOptions) (runtime.Object, error) { +func (storage *SimpleRESTStorage) List(ctx api.Context, options *unversioned.ListOptions) (runtime.Object, error) { storage.checkContext(ctx) result := &apiservertesting.SimpleList{ Items: storage.list, } storage.requestedLabelSelector = labels.Everything() - if options != nil && options.LabelSelector != nil { - storage.requestedLabelSelector = options.LabelSelector + if options != nil && options.LabelSelector.Selector != nil { + storage.requestedLabelSelector = options.LabelSelector.Selector } storage.requestedFieldSelector = fields.Everything() - if options != nil && options.FieldSelector != nil { - storage.requestedFieldSelector = options.FieldSelector + if options != nil && options.FieldSelector.Selector != nil { + storage.requestedFieldSelector = options.FieldSelector.Selector } return result, storage.errors["list"] } @@ -472,15 +445,15 @@ func (storage *SimpleRESTStorage) Update(ctx api.Context, obj runtime.Object) (r } // Implement ResourceWatcher. -func (storage *SimpleRESTStorage) Watch(ctx api.Context, options *api.ListOptions) (watch.Interface, error) { +func (storage *SimpleRESTStorage) Watch(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) { storage.checkContext(ctx) storage.requestedLabelSelector = labels.Everything() - if options != nil && options.LabelSelector != nil { - storage.requestedLabelSelector = options.LabelSelector + if options != nil && options.LabelSelector.Selector != nil { + storage.requestedLabelSelector = options.LabelSelector.Selector } storage.requestedFieldSelector = fields.Everything() - if options != nil && options.FieldSelector != nil { - storage.requestedFieldSelector = options.FieldSelector + if options != nil && options.FieldSelector.Selector != nil { + storage.requestedFieldSelector = options.FieldSelector.Selector } storage.requestedResourceVersion = "" if options != nil { @@ -931,7 +904,7 @@ func TestList(t *testing.T) { legacy: true, }, { - url: "/" + prefix + "/" + testGroupVersion.Group + "/" + testGroupVersion.Version + "/simple?namespace=other&labels=a%3Db&fields=c%3Dd", + url: "/" + prefix + "/" + testGroupVersion.Group + "/" + testGroupVersion.Version + "/simple?namespace=other&labelSelector=a%3Db&fieldSelector=c%3Dd", namespace: "", selfLink: "/" + prefix + "/" + testGroupVersion.Group + "/" + testGroupVersion.Version + "/simple", legacy: true, @@ -952,7 +925,7 @@ func TestList(t *testing.T) { legacy: true, }, { - url: "/" + prefix + "/" + testGroupVersion.Group + "/" + testGroupVersion.Version + "/namespaces/other/simple?labels=a%3Db&fields=c%3Dd", + url: "/" + prefix + "/" + testGroupVersion.Group + "/" + testGroupVersion.Version + "/namespaces/other/simple?labelSelector=a%3Db&fieldSelector=c%3Dd", namespace: "other", selfLink: "/" + prefix + "/" + testGroupVersion.Group + "/" + testGroupVersion.Version + "/namespaces/other/simple", legacy: true, diff --git a/pkg/apiserver/resthandler.go b/pkg/apiserver/resthandler.go index 1bff6af857..334519661a 100644 --- a/pkg/apiserver/resthandler.go +++ b/pkg/apiserver/resthandler.go @@ -240,31 +240,24 @@ func ListResource(r rest.Lister, rw rest.Watcher, scope RequestScope, forceWatch ctx := scope.ContextFunc(req) ctx = api.WithNamespace(ctx, namespace) - versioned, err := scope.Creater.New(scope.ServerAPIVersion, "ListOptions") - if err != nil { - errorJSON(err, scope.Codec, w) - return - } - if err := scope.Codec.DecodeParametersInto(req.Request.URL.Query(), versioned); err != nil { - errorJSON(err, scope.Codec, w) - return - } - opts := api.ListOptions{} - if err := scope.Convertor.Convert(versioned, &opts); err != nil { + opts := unversioned.ListOptions{} + if err := scope.Codec.DecodeParametersInto(req.Request.URL.Query(), &opts); err != nil { errorJSON(err, scope.Codec, w) return } // transform fields - // TODO: Should this be done as part of convertion? - fn := func(label, value string) (newLabel, newValue string, err error) { - return scope.Convertor.ConvertFieldLabel(scope.APIVersion, scope.Kind, label, value) - } - if opts.FieldSelector, err = opts.FieldSelector.Transform(fn); err != nil { - // TODO: allow bad request to set field causes based on query parameters - err = errors.NewBadRequest(err.Error()) - errorJSON(err, scope.Codec, w) - return + // TODO: DecodeParametersInto should do this. + if opts.FieldSelector.Selector != nil { + fn := func(label, value string) (newLabel, newValue string, err error) { + return scope.Convertor.ConvertFieldLabel(scope.APIVersion, scope.Kind, label, value) + } + if opts.FieldSelector.Selector, err = opts.FieldSelector.Selector.Transform(fn); err != nil { + // TODO: allow bad request to set field causes based on query parameters + err = errors.NewBadRequest(err.Error()) + errorJSON(err, scope.Codec, w) + return + } } if hasName { @@ -273,7 +266,7 @@ func ListResource(r rest.Lister, rw rest.Watcher, scope RequestScope, forceWatch // a request for a single object and optimize the // storage query accordingly. nameSelector := fields.OneTermEqualSelector("metadata.name", name) - if opts.FieldSelector != nil && !opts.FieldSelector.Empty() { + if opts.FieldSelector.Selector != nil && !opts.FieldSelector.Selector.Empty() { // It doesn't make sense to ask for both a name // and a field selector, since just the name is // sufficient to narrow down the request to a @@ -285,7 +278,7 @@ func ListResource(r rest.Lister, rw rest.Watcher, scope RequestScope, forceWatch ) return } - opts.FieldSelector = nameSelector + opts.FieldSelector.Selector = nameSelector } if (opts.Watch || forceWatch) && rw != nil { diff --git a/pkg/apiserver/watch_test.go b/pkg/apiserver/watch_test.go index 9575ff00fa..a210f0ccac 100644 --- a/pkg/apiserver/watch_test.go +++ b/pkg/apiserver/watch_test.go @@ -198,14 +198,14 @@ func TestWatchParamParsing(t *testing.T) { namespace: api.NamespaceAll, }, { path: rootPath, - rawQuery: "resourceVersion=314159&fields=Host%3D&labels=name%3Dfoo", + rawQuery: "resourceVersion=314159&fieldSelector=Host%3D&labelSelector=name%3Dfoo", resourceVersion: "314159", labelSelector: "name=foo", fieldSelector: "Host=", namespace: api.NamespaceAll, }, { path: rootPath, - rawQuery: "fields=id%3dfoo&resourceVersion=1492", + rawQuery: "fieldSelector=id%3dfoo&resourceVersion=1492", resourceVersion: "1492", labelSelector: "", fieldSelector: "id=foo", @@ -227,14 +227,14 @@ func TestWatchParamParsing(t *testing.T) { namespace: "other", }, { path: namespacedPath, - rawQuery: "resourceVersion=314159&fields=Host%3D&labels=name%3Dfoo", + rawQuery: "resourceVersion=314159&fieldSelector=Host%3D&labelSelector=name%3Dfoo", resourceVersion: "314159", labelSelector: "name=foo", fieldSelector: "Host=", namespace: "other", }, { path: namespacedPath, - rawQuery: "fields=id%3dfoo&resourceVersion=1492", + rawQuery: "fieldSelector=id%3dfoo&resourceVersion=1492", resourceVersion: "1492", labelSelector: "", fieldSelector: "id=foo", diff --git a/pkg/registry/componentstatus/rest.go b/pkg/registry/componentstatus/rest.go index b8be2a6dae..30d548ef8d 100644 --- a/pkg/registry/componentstatus/rest.go +++ b/pkg/registry/componentstatus/rest.go @@ -21,6 +21,7 @@ import ( "net/http" "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/apiserver" "k8s.io/kubernetes/pkg/probe" "k8s.io/kubernetes/pkg/runtime" @@ -49,7 +50,7 @@ func (rs *REST) NewList() runtime.Object { // Returns the list of component status. Note that the label and field are both ignored. // Note that this call doesn't support labels or selectors. -func (rs *REST) List(ctx api.Context, options *api.ListOptions) (runtime.Object, error) { +func (rs *REST) List(ctx api.Context, options *unversioned.ListOptions) (runtime.Object, error) { servers := rs.GetServersToValidate() // TODO: This should be parallelized. diff --git a/pkg/registry/controller/registry.go b/pkg/registry/controller/registry.go index 12aa757405..1f5f38a86f 100644 --- a/pkg/registry/controller/registry.go +++ b/pkg/registry/controller/registry.go @@ -21,13 +21,14 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/rest" + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/watch" ) // Registry is an interface for things that know how to store ReplicationControllers. type Registry interface { - ListControllers(ctx api.Context, options *api.ListOptions) (*api.ReplicationControllerList, error) - WatchControllers(ctx api.Context, options *api.ListOptions) (watch.Interface, error) + ListControllers(ctx api.Context, options *unversioned.ListOptions) (*api.ReplicationControllerList, error) + WatchControllers(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) GetController(ctx api.Context, controllerID string) (*api.ReplicationController, error) CreateController(ctx api.Context, controller *api.ReplicationController) (*api.ReplicationController, error) UpdateController(ctx api.Context, controller *api.ReplicationController) (*api.ReplicationController, error) @@ -45,8 +46,8 @@ func NewRegistry(s rest.StandardStorage) Registry { return &storage{s} } -func (s *storage) ListControllers(ctx api.Context, options *api.ListOptions) (*api.ReplicationControllerList, error) { - if options != nil && options.FieldSelector != nil && !options.FieldSelector.Empty() { +func (s *storage) ListControllers(ctx api.Context, options *unversioned.ListOptions) (*api.ReplicationControllerList, error) { + if options != nil && options.FieldSelector.Selector != nil && !options.FieldSelector.Selector.Empty() { return nil, fmt.Errorf("field selector not supported yet") } obj, err := s.List(ctx, options) @@ -56,7 +57,7 @@ func (s *storage) ListControllers(ctx api.Context, options *api.ListOptions) (*a return obj.(*api.ReplicationControllerList), err } -func (s *storage) WatchControllers(ctx api.Context, options *api.ListOptions) (watch.Interface, error) { +func (s *storage) WatchControllers(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) { return s.Watch(ctx, options) } diff --git a/pkg/registry/deployment/registry.go b/pkg/registry/deployment/registry.go index ec967e93d9..f7d565cbeb 100644 --- a/pkg/registry/deployment/registry.go +++ b/pkg/registry/deployment/registry.go @@ -21,12 +21,13 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/rest" + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/apis/extensions" ) // Registry is an interface for things that know how to store Deployments. type Registry interface { - ListDeployments(ctx api.Context, options *api.ListOptions) (*extensions.DeploymentList, error) + ListDeployments(ctx api.Context, options *unversioned.ListOptions) (*extensions.DeploymentList, error) GetDeployment(ctx api.Context, deploymentID string) (*extensions.Deployment, error) CreateDeployment(ctx api.Context, deployment *extensions.Deployment) (*extensions.Deployment, error) UpdateDeployment(ctx api.Context, deployment *extensions.Deployment) (*extensions.Deployment, error) @@ -43,8 +44,8 @@ func NewRegistry(s rest.StandardStorage) Registry { return &storage{s} } -func (s *storage) ListDeployments(ctx api.Context, options *api.ListOptions) (*extensions.DeploymentList, error) { - if options != nil && options.FieldSelector != nil && !options.FieldSelector.Empty() { +func (s *storage) ListDeployments(ctx api.Context, options *unversioned.ListOptions) (*extensions.DeploymentList, error) { + if options != nil && options.FieldSelector.Selector != nil && !options.FieldSelector.Selector.Empty() { return nil, fmt.Errorf("field selector not supported yet") } obj, err := s.List(ctx, options) diff --git a/pkg/registry/endpoint/registry.go b/pkg/registry/endpoint/registry.go index a034852fb6..331bd82f71 100644 --- a/pkg/registry/endpoint/registry.go +++ b/pkg/registry/endpoint/registry.go @@ -19,14 +19,15 @@ package endpoint import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/rest" + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/watch" ) // Registry is an interface for things that know how to store endpoints. type Registry interface { - ListEndpoints(ctx api.Context, options *api.ListOptions) (*api.EndpointsList, error) + ListEndpoints(ctx api.Context, options *unversioned.ListOptions) (*api.EndpointsList, error) GetEndpoints(ctx api.Context, name string) (*api.Endpoints, error) - WatchEndpoints(ctx api.Context, options *api.ListOptions) (watch.Interface, error) + WatchEndpoints(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) UpdateEndpoints(ctx api.Context, e *api.Endpoints) error DeleteEndpoints(ctx api.Context, name string) error } @@ -42,7 +43,7 @@ func NewRegistry(s rest.StandardStorage) Registry { return &storage{s} } -func (s *storage) ListEndpoints(ctx api.Context, options *api.ListOptions) (*api.EndpointsList, error) { +func (s *storage) ListEndpoints(ctx api.Context, options *unversioned.ListOptions) (*api.EndpointsList, error) { obj, err := s.List(ctx, options) if err != nil { return nil, err @@ -50,7 +51,7 @@ func (s *storage) ListEndpoints(ctx api.Context, options *api.ListOptions) (*api return obj.(*api.EndpointsList), nil } -func (s *storage) WatchEndpoints(ctx api.Context, options *api.ListOptions) (watch.Interface, error) { +func (s *storage) WatchEndpoints(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) { return s.Watch(ctx, options) } diff --git a/pkg/registry/generic/etcd/etcd.go b/pkg/registry/generic/etcd/etcd.go index 9d15578f64..465b487a1d 100644 --- a/pkg/registry/generic/etcd/etcd.go +++ b/pkg/registry/generic/etcd/etcd.go @@ -161,20 +161,20 @@ func (e *Etcd) NewList() runtime.Object { } // List returns a list of items matching labels and field -func (e *Etcd) List(ctx api.Context, options *api.ListOptions) (runtime.Object, error) { +func (e *Etcd) List(ctx api.Context, options *unversioned.ListOptions) (runtime.Object, error) { label := labels.Everything() - if options != nil && options.LabelSelector != nil { - label = options.LabelSelector + if options != nil && options.LabelSelector.Selector != nil { + label = options.LabelSelector.Selector } field := fields.Everything() - if options != nil && options.FieldSelector != nil { - field = options.FieldSelector + if options != nil && options.FieldSelector.Selector != nil { + field = options.FieldSelector.Selector } return e.ListPredicate(ctx, e.PredicateFunc(label, field), options) } // ListPredicate returns a list of all the items matching m. -func (e *Etcd) ListPredicate(ctx api.Context, m generic.Matcher, options *api.ListOptions) (runtime.Object, error) { +func (e *Etcd) ListPredicate(ctx api.Context, m generic.Matcher, options *unversioned.ListOptions) (runtime.Object, error) { list := e.NewListFunc() trace := util.NewTrace("List " + reflect.TypeOf(list).String()) filterFunc := e.filterAndDecorateFunction(m) @@ -191,7 +191,7 @@ func (e *Etcd) ListPredicate(ctx api.Context, m generic.Matcher, options *api.Li trace.Step("About to list directory") if options == nil { - options = &api.ListOptions{ResourceVersion: "0"} + options = &unversioned.ListOptions{ResourceVersion: "0"} } version, err := storage.ParseWatchResourceVersion(options.ResourceVersion, e.EndpointName) if err != nil { @@ -467,14 +467,14 @@ func (e *Etcd) finalizeDelete(obj runtime.Object, runHooks bool) (runtime.Object // WatchPredicate. If possible, you should customize PredicateFunc to produre a // matcher that matches by key. generic.SelectionPredicate does this for you // automatically. -func (e *Etcd) Watch(ctx api.Context, options *api.ListOptions) (watch.Interface, error) { +func (e *Etcd) Watch(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) { label := labels.Everything() - if options != nil && options.LabelSelector != nil { - label = options.LabelSelector + if options != nil && options.LabelSelector.Selector != nil { + label = options.LabelSelector.Selector } field := fields.Everything() - if options != nil && options.FieldSelector != nil { - field = options.FieldSelector + if options != nil && options.FieldSelector.Selector != nil { + field = options.FieldSelector.Selector } resourceVersion := "" if options != nil { diff --git a/pkg/registry/namespace/registry.go b/pkg/registry/namespace/registry.go index 33b50d32e6..4483aef73a 100644 --- a/pkg/registry/namespace/registry.go +++ b/pkg/registry/namespace/registry.go @@ -19,13 +19,14 @@ package namespace import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/rest" + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/watch" ) // Registry is an interface implemented by things that know how to store Namespace objects. type Registry interface { - ListNamespaces(ctx api.Context, options *api.ListOptions) (*api.NamespaceList, error) - WatchNamespaces(ctx api.Context, options *api.ListOptions) (watch.Interface, error) + ListNamespaces(ctx api.Context, options *unversioned.ListOptions) (*api.NamespaceList, error) + WatchNamespaces(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) GetNamespace(ctx api.Context, namespaceID string) (*api.Namespace, error) CreateNamespace(ctx api.Context, namespace *api.Namespace) error UpdateNamespace(ctx api.Context, namespace *api.Namespace) error @@ -43,7 +44,7 @@ func NewRegistry(s rest.StandardStorage) Registry { return &storage{s} } -func (s *storage) ListNamespaces(ctx api.Context, options *api.ListOptions) (*api.NamespaceList, error) { +func (s *storage) ListNamespaces(ctx api.Context, options *unversioned.ListOptions) (*api.NamespaceList, error) { obj, err := s.List(ctx, options) if err != nil { return nil, err @@ -51,7 +52,7 @@ func (s *storage) ListNamespaces(ctx api.Context, options *api.ListOptions) (*ap return obj.(*api.NamespaceList), nil } -func (s *storage) WatchNamespaces(ctx api.Context, options *api.ListOptions) (watch.Interface, error) { +func (s *storage) WatchNamespaces(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) { return s.Watch(ctx, options) } diff --git a/pkg/registry/node/registry.go b/pkg/registry/node/registry.go index 3d6f3bf07e..ff6839540d 100644 --- a/pkg/registry/node/registry.go +++ b/pkg/registry/node/registry.go @@ -19,17 +19,18 @@ package node import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/rest" + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/watch" ) // Registry is an interface for things that know how to store node. type Registry interface { - ListNodes(ctx api.Context, options *api.ListOptions) (*api.NodeList, error) + ListNodes(ctx api.Context, options *unversioned.ListOptions) (*api.NodeList, error) CreateNode(ctx api.Context, node *api.Node) error UpdateNode(ctx api.Context, node *api.Node) error GetNode(ctx api.Context, nodeID string) (*api.Node, error) DeleteNode(ctx api.Context, nodeID string) error - WatchNodes(ctx api.Context, options *api.ListOptions) (watch.Interface, error) + WatchNodes(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) } // storage puts strong typing around storage calls @@ -43,7 +44,7 @@ func NewRegistry(s rest.StandardStorage) Registry { return &storage{s} } -func (s *storage) ListNodes(ctx api.Context, options *api.ListOptions) (*api.NodeList, error) { +func (s *storage) ListNodes(ctx api.Context, options *unversioned.ListOptions) (*api.NodeList, error) { obj, err := s.List(ctx, options) if err != nil { return nil, err @@ -62,7 +63,7 @@ func (s *storage) UpdateNode(ctx api.Context, node *api.Node) error { return err } -func (s *storage) WatchNodes(ctx api.Context, options *api.ListOptions) (watch.Interface, error) { +func (s *storage) WatchNodes(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) { return s.Watch(ctx, options) } diff --git a/pkg/registry/registrytest/endpoint.go b/pkg/registry/registrytest/endpoint.go index c02adb10bb..659dcab0a3 100644 --- a/pkg/registry/registrytest/endpoint.go +++ b/pkg/registry/registrytest/endpoint.go @@ -22,6 +22,7 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/errors" + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/watch" ) @@ -34,7 +35,7 @@ type EndpointRegistry struct { lock sync.Mutex } -func (e *EndpointRegistry) ListEndpoints(ctx api.Context, options *api.ListOptions) (*api.EndpointsList, error) { +func (e *EndpointRegistry) ListEndpoints(ctx api.Context, options *unversioned.ListOptions) (*api.EndpointsList, error) { // TODO: support namespaces in this mock e.lock.Lock() defer e.lock.Unlock() @@ -59,7 +60,7 @@ func (e *EndpointRegistry) GetEndpoints(ctx api.Context, name string) (*api.Endp return nil, errors.NewNotFound("Endpoints", name) } -func (e *EndpointRegistry) WatchEndpoints(ctx api.Context, options *api.ListOptions) (watch.Interface, error) { +func (e *EndpointRegistry) WatchEndpoints(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) { return nil, fmt.Errorf("unimplemented!") } diff --git a/pkg/registry/registrytest/node.go b/pkg/registry/registrytest/node.go index aef59d6a2a..fa8d7c719e 100644 --- a/pkg/registry/registrytest/node.go +++ b/pkg/registry/registrytest/node.go @@ -21,6 +21,7 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/errors" + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/watch" ) @@ -57,7 +58,7 @@ func (r *NodeRegistry) SetError(err error) { r.Err = err } -func (r *NodeRegistry) ListNodes(ctx api.Context, options *api.ListOptions) (*api.NodeList, error) { +func (r *NodeRegistry) ListNodes(ctx api.Context, options *unversioned.ListOptions) (*api.NodeList, error) { r.Lock() defer r.Unlock() return &r.Nodes, r.Err @@ -110,6 +111,6 @@ func (r *NodeRegistry) DeleteNode(ctx api.Context, nodeID string) error { return r.Err } -func (r *NodeRegistry) WatchNodes(ctx api.Context, options *api.ListOptions) (watch.Interface, error) { +func (r *NodeRegistry) WatchNodes(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) { return nil, r.Err } diff --git a/pkg/registry/registrytest/service.go b/pkg/registry/registrytest/service.go index 643c306cb7..b0791baba9 100644 --- a/pkg/registry/registrytest/service.go +++ b/pkg/registry/registrytest/service.go @@ -20,6 +20,7 @@ import ( "sync" "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/watch" ) @@ -45,7 +46,7 @@ func (r *ServiceRegistry) SetError(err error) { r.Err = err } -func (r *ServiceRegistry) ListServices(ctx api.Context, options *api.ListOptions) (*api.ServiceList, error) { +func (r *ServiceRegistry) ListServices(ctx api.Context, options *unversioned.ListOptions) (*api.ServiceList, error) { r.mu.Lock() defer r.mu.Unlock() @@ -106,7 +107,7 @@ func (r *ServiceRegistry) UpdateService(ctx api.Context, svc *api.Service) (*api return svc, r.Err } -func (r *ServiceRegistry) WatchServices(ctx api.Context, options *api.ListOptions) (watch.Interface, error) { +func (r *ServiceRegistry) WatchServices(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) { r.mu.Lock() defer r.mu.Unlock() diff --git a/pkg/registry/secret/registry.go b/pkg/registry/secret/registry.go index ef989f0067..0369c1928f 100644 --- a/pkg/registry/secret/registry.go +++ b/pkg/registry/secret/registry.go @@ -19,13 +19,14 @@ package secret import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/rest" + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/watch" ) // Registry is an interface implemented by things that know how to store Secret objects. type Registry interface { - ListSecrets(ctx api.Context, options *api.ListOptions) (*api.SecretList, error) - WatchSecrets(ctx api.Context, options *api.ListOptions) (watch.Interface, error) + ListSecrets(ctx api.Context, options *unversioned.ListOptions) (*api.SecretList, error) + WatchSecrets(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) GetSecret(ctx api.Context, name string) (*api.Secret, error) CreateSecret(ctx api.Context, Secret *api.Secret) (*api.Secret, error) UpdateSecret(ctx api.Context, Secret *api.Secret) (*api.Secret, error) @@ -43,7 +44,7 @@ func NewRegistry(s rest.StandardStorage) Registry { return &storage{s} } -func (s *storage) ListSecrets(ctx api.Context, options *api.ListOptions) (*api.SecretList, error) { +func (s *storage) ListSecrets(ctx api.Context, options *unversioned.ListOptions) (*api.SecretList, error) { obj, err := s.List(ctx, options) if err != nil { return nil, err @@ -51,7 +52,7 @@ func (s *storage) ListSecrets(ctx api.Context, options *api.ListOptions) (*api.S return obj.(*api.SecretList), nil } -func (s *storage) WatchSecrets(ctx api.Context, options *api.ListOptions) (watch.Interface, error) { +func (s *storage) WatchSecrets(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) { return s.Watch(ctx, options) } diff --git a/pkg/registry/service/ipallocator/controller/repair.go b/pkg/registry/service/ipallocator/controller/repair.go index cc95a57623..fde97ca11e 100644 --- a/pkg/registry/service/ipallocator/controller/repair.go +++ b/pkg/registry/service/ipallocator/controller/repair.go @@ -22,6 +22,7 @@ import ( "time" "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/registry/service" "k8s.io/kubernetes/pkg/registry/service/ipallocator" "k8s.io/kubernetes/pkg/util" @@ -92,7 +93,7 @@ func (c *Repair) RunOnce() error { } ctx := api.WithNamespace(api.NewDefaultContext(), api.NamespaceAll) - options := &api.ListOptions{ResourceVersion: latest.ObjectMeta.ResourceVersion} + options := &unversioned.ListOptions{ResourceVersion: latest.ObjectMeta.ResourceVersion} list, err := c.registry.ListServices(ctx, options) if err != nil { return fmt.Errorf("unable to refresh the service IP block: %v", err) diff --git a/pkg/registry/service/portallocator/controller/repair.go b/pkg/registry/service/portallocator/controller/repair.go index c388a8dc95..7fe6dcd416 100644 --- a/pkg/registry/service/portallocator/controller/repair.go +++ b/pkg/registry/service/portallocator/controller/repair.go @@ -21,6 +21,7 @@ import ( "time" "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/registry/service" "k8s.io/kubernetes/pkg/registry/service/portallocator" "k8s.io/kubernetes/pkg/util" @@ -79,7 +80,7 @@ func (c *Repair) RunOnce() error { } ctx := api.WithNamespace(api.NewDefaultContext(), api.NamespaceAll) - options := &api.ListOptions{ResourceVersion: latest.ObjectMeta.ResourceVersion} + options := &unversioned.ListOptions{ResourceVersion: latest.ObjectMeta.ResourceVersion} list, err := c.registry.ListServices(ctx, options) if err != nil { return fmt.Errorf("unable to refresh the port block: %v", err) diff --git a/pkg/registry/service/registry.go b/pkg/registry/service/registry.go index 154dcb9d19..c0589c1558 100644 --- a/pkg/registry/service/registry.go +++ b/pkg/registry/service/registry.go @@ -19,17 +19,18 @@ package service import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/rest" + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/watch" ) // Registry is an interface for things that know how to store services. type Registry interface { - ListServices(ctx api.Context, options *api.ListOptions) (*api.ServiceList, error) + ListServices(ctx api.Context, options *unversioned.ListOptions) (*api.ServiceList, error) CreateService(ctx api.Context, svc *api.Service) (*api.Service, error) GetService(ctx api.Context, name string) (*api.Service, error) DeleteService(ctx api.Context, name string) error UpdateService(ctx api.Context, svc *api.Service) (*api.Service, error) - WatchServices(ctx api.Context, options *api.ListOptions) (watch.Interface, error) + WatchServices(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) } // storage puts strong typing around storage calls @@ -43,7 +44,7 @@ func NewRegistry(s rest.StandardStorage) Registry { return &storage{s} } -func (s *storage) ListServices(ctx api.Context, options *api.ListOptions) (*api.ServiceList, error) { +func (s *storage) ListServices(ctx api.Context, options *unversioned.ListOptions) (*api.ServiceList, error) { obj, err := s.List(ctx, options) if err != nil { return nil, err @@ -80,7 +81,7 @@ func (s *storage) UpdateService(ctx api.Context, svc *api.Service) (*api.Service return obj.(*api.Service), nil } -func (s *storage) WatchServices(ctx api.Context, options *api.ListOptions) (watch.Interface, error) { +func (s *storage) WatchServices(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) { return s.Watch(ctx, options) } diff --git a/pkg/registry/service/rest.go b/pkg/registry/service/rest.go index b632ee3357..95fc8adba8 100644 --- a/pkg/registry/service/rest.go +++ b/pkg/registry/service/rest.go @@ -172,13 +172,13 @@ func (rs *REST) Get(ctx api.Context, id string) (runtime.Object, error) { return rs.registry.GetService(ctx, id) } -func (rs *REST) List(ctx api.Context, options *api.ListOptions) (runtime.Object, error) { +func (rs *REST) List(ctx api.Context, options *unversioned.ListOptions) (runtime.Object, error) { return rs.registry.ListServices(ctx, options) } // Watch returns Services events via a watch.Interface. // It implements rest.Watcher. -func (rs *REST) Watch(ctx api.Context, options *api.ListOptions) (watch.Interface, error) { +func (rs *REST) Watch(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) { return rs.registry.WatchServices(ctx, options) } diff --git a/pkg/registry/serviceaccount/registry.go b/pkg/registry/serviceaccount/registry.go index 4dad500bc6..278648bb9b 100644 --- a/pkg/registry/serviceaccount/registry.go +++ b/pkg/registry/serviceaccount/registry.go @@ -19,13 +19,14 @@ package serviceaccount import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/rest" + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/watch" ) // Registry is an interface implemented by things that know how to store ServiceAccount objects. type Registry interface { - ListServiceAccounts(ctx api.Context, options *api.ListOptions) (*api.ServiceAccountList, error) - WatchServiceAccounts(ctx api.Context, options *api.ListOptions) (watch.Interface, error) + ListServiceAccounts(ctx api.Context, options *unversioned.ListOptions) (*api.ServiceAccountList, error) + WatchServiceAccounts(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) GetServiceAccount(ctx api.Context, name string) (*api.ServiceAccount, error) CreateServiceAccount(ctx api.Context, ServiceAccount *api.ServiceAccount) error UpdateServiceAccount(ctx api.Context, ServiceAccount *api.ServiceAccount) error @@ -43,7 +44,7 @@ func NewRegistry(s rest.StandardStorage) Registry { return &storage{s} } -func (s *storage) ListServiceAccounts(ctx api.Context, options *api.ListOptions) (*api.ServiceAccountList, error) { +func (s *storage) ListServiceAccounts(ctx api.Context, options *unversioned.ListOptions) (*api.ServiceAccountList, error) { obj, err := s.List(ctx, options) if err != nil { return nil, err @@ -51,7 +52,7 @@ func (s *storage) ListServiceAccounts(ctx api.Context, options *api.ListOptions) return obj.(*api.ServiceAccountList), nil } -func (s *storage) WatchServiceAccounts(ctx api.Context, options *api.ListOptions) (watch.Interface, error) { +func (s *storage) WatchServiceAccounts(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) { return s.Watch(ctx, options) } diff --git a/pkg/registry/thirdpartyresourcedata/registry.go b/pkg/registry/thirdpartyresourcedata/registry.go index 5e560dede2..09600e38d7 100644 --- a/pkg/registry/thirdpartyresourcedata/registry.go +++ b/pkg/registry/thirdpartyresourcedata/registry.go @@ -19,14 +19,15 @@ package thirdpartyresourcedata import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/rest" + "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/watch" ) // Registry is an interface implemented by things that know how to store ThirdPartyResourceData objects. type Registry interface { - ListThirdPartyResourceData(ctx api.Context, options *api.ListOptions) (*extensions.ThirdPartyResourceDataList, error) - WatchThirdPartyResourceData(ctx api.Context, options *api.ListOptions) (watch.Interface, error) + ListThirdPartyResourceData(ctx api.Context, options *unversioned.ListOptions) (*extensions.ThirdPartyResourceDataList, error) + WatchThirdPartyResourceData(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) GetThirdPartyResourceData(ctx api.Context, name string) (*extensions.ThirdPartyResourceData, error) CreateThirdPartyResourceData(ctx api.Context, resource *extensions.ThirdPartyResourceData) (*extensions.ThirdPartyResourceData, error) UpdateThirdPartyResourceData(ctx api.Context, resource *extensions.ThirdPartyResourceData) (*extensions.ThirdPartyResourceData, error) @@ -44,7 +45,7 @@ func NewRegistry(s rest.StandardStorage) Registry { return &storage{s} } -func (s *storage) ListThirdPartyResourceData(ctx api.Context, options *api.ListOptions) (*extensions.ThirdPartyResourceDataList, error) { +func (s *storage) ListThirdPartyResourceData(ctx api.Context, options *unversioned.ListOptions) (*extensions.ThirdPartyResourceDataList, error) { obj, err := s.List(ctx, options) if err != nil { return nil, err @@ -52,7 +53,7 @@ func (s *storage) ListThirdPartyResourceData(ctx api.Context, options *api.ListO return obj.(*extensions.ThirdPartyResourceDataList), nil } -func (s *storage) WatchThirdPartyResourceData(ctx api.Context, options *api.ListOptions) (watch.Interface, error) { +func (s *storage) WatchThirdPartyResourceData(ctx api.Context, options *unversioned.ListOptions) (watch.Interface, error) { return s.Watch(ctx, options) }