// WatchPredicate starts a watch for the items that m matches. func (e *Etcd) WatchPredicate(ctx api.Context, m generic.Matcher, resourceVersion string) (watch.Interface, error) { version, err := storage.ParseWatchResourceVersion(resourceVersion, e.EndpointName) if err != nil { return nil, err } filterFunc := func(obj runtime.Object) bool { matches, err := m.Matches(obj) if err != nil { glog.Errorf("unable to match watch: %v", err) return false } if matches && e.Decorator != nil { if err := e.Decorator(obj); err != nil { glog.Errorf("unable to decorate watch: %v", err) return false } } return matches } if name, ok := m.MatchesSingle(); ok { key, err := e.KeyFunc(ctx, name) if err != nil { return nil, err } return e.Storage.Watch(key, version, filterFunc) } return e.Storage.WatchList(e.KeyRootFunc(ctx), version, filterFunc) }
// ListPredicate returns a list of all the items matching m. func (e *Etcd) ListPredicate(ctx api.Context, m generic.Matcher) (runtime.Object, error) { list := e.NewListFunc() trace := util.NewTrace("List " + reflect.TypeOf(list).String()) filterFunc := e.filterAndDecorateFunction(m) defer trace.LogIfLong(600 * time.Millisecond) if name, ok := m.MatchesSingle(); ok { if key, err := e.KeyFunc(ctx, name); err == nil { trace.Step("About to read single object") err := e.Storage.GetToList(key, filterFunc, list) trace.Step("Object extracted") if err != nil { return nil, err } return list, nil } // if we cannot extract a key based on the current context, the optimization is skipped } trace.Step("About to list directory") err := e.Storage.List(e.KeyRootFunc(ctx), filterFunc, list) trace.Step("List extracted") if err != nil { return nil, err } return list, nil }
// ListPredicate returns a list of all the items matching m. func (e *Etcd) ListPredicate(ctx api.Context, m generic.Matcher) (runtime.Object, error) { list := e.NewListFunc() trace := util.NewTrace("List " + reflect.TypeOf(list).String()) defer trace.LogIfLong(600 * time.Millisecond) if name, ok := m.MatchesSingle(); ok { trace.Step("About to read single object") key, err := e.KeyFunc(ctx, name) if err != nil { return nil, err } err = e.Storage.GetToList(key, list) trace.Step("Object extracted") if err != nil { return nil, err } } else { trace.Step("About to list directory") err := e.Storage.List(e.KeyRootFunc(ctx), list) trace.Step("List extracted") if err != nil { return nil, err } } defer trace.Step("List filtered") return generic.FilterList(list, m, generic.DecoratorFunc(e.Decorator)) }
// 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) { list := e.NewListFunc() trace := util.NewTrace("List " + reflect.TypeOf(list).String()) filterFunc := e.filterAndDecorateFunction(m) defer trace.LogIfLong(600 * time.Millisecond) if name, ok := m.MatchesSingle(); ok { if key, err := e.KeyFunc(ctx, name); err == nil { trace.Step("About to read single object") err := e.Storage.GetToList(ctx, key, filterFunc, list) trace.Step("Object extracted") return list, etcderr.InterpretListError(err, e.EndpointName) } // if we cannot extract a key based on the current context, the optimization is skipped } trace.Step("About to list directory") if options == nil { options = &api.ListOptions{ResourceVersion: "0"} } version, err := storage.ParseWatchResourceVersion(options.ResourceVersion, e.EndpointName) if err != nil { return nil, err } err = e.Storage.List(ctx, e.KeyRootFunc(ctx), version, filterFunc, list) trace.Step("List extracted") return list, etcderr.InterpretListError(err, e.EndpointName) }
// filterList filters any list object that conforms to the api conventions, // provided that 'm' works with the concrete type of list. d is an optional // decorator for the returned functions. Only matching items are decorated. func filterList(list runtime.Object, m generic.Matcher, d decoratorFunc) (filtered runtime.Object, err error) { // TODO: push a matcher down into tools.etcdHelper to avoid all this // nonsense. This is a lot of unnecessary copies. items, err := meta.ExtractList(list) if err != nil { return nil, err } var filteredItems []runtime.Object for _, obj := range items { match, err := m.Matches(obj) if err != nil { return nil, err } if match { if d != nil { if err := d(obj); err != nil { return nil, err } } filteredItems = append(filteredItems, obj) } } err = meta.SetList(list, filteredItems) if err != nil { return nil, err } return list, nil }
// WatchPredicate starts a watch for the items that m matches. func (e *Store) WatchPredicate(ctx api.Context, m generic.Matcher, resourceVersion string) (watch.Interface, error) { filterFunc := e.filterAndDecorateFunction(m) if name, ok := m.MatchesSingle(); ok { if key, err := e.KeyFunc(ctx, name); err == nil { if err != nil { return nil, err } return e.Storage.Watch(ctx, key, resourceVersion, filterFunc) } // if we cannot extract a key based on the current context, the optimization is skipped } return e.Storage.WatchList(ctx, e.KeyRootFunc(ctx), resourceVersion, filterFunc) }
func (e *Store) filterAndDecorateFunction(m generic.Matcher) func(runtime.Object) bool { return func(obj runtime.Object) bool { matches, err := m.Matches(obj) if err != nil { glog.Errorf("unable to match watch: %v", err) return false } if matches && e.Decorator != nil { if err := e.Decorator(obj); err != nil { glog.Errorf("unable to decorate watch: %v", err) return false } } return matches } }
// ListPredicate returns a list of all the items matching m. func (e *Store) ListPredicate(ctx api.Context, m generic.Matcher, options *api.ListOptions) (runtime.Object, error) { list := e.NewListFunc() filterFunc := e.filterAndDecorateFunction(m) if name, ok := m.MatchesSingle(); ok { if key, err := e.KeyFunc(ctx, name); err == nil { err := e.Storage.GetToList(ctx, key, filterFunc, list) return list, storeerr.InterpretListError(err, e.QualifiedResource) } // if we cannot extract a key based on the current context, the optimization is skipped } if options == nil { options = &api.ListOptions{ResourceVersion: "0"} } err := e.Storage.List(ctx, e.KeyRootFunc(ctx), options.ResourceVersion, filterFunc, list) return list, storeerr.InterpretListError(err, e.QualifiedResource) }
func (e *Store) createFilter(m generic.Matcher) storage.Filter { filterFunc := func(obj runtime.Object) bool { matches, err := m.Matches(obj) if err != nil { glog.Errorf("unable to match watch: %v", err) return false } if matches && e.Decorator != nil { if err := e.Decorator(obj); err != nil { glog.Errorf("unable to decorate watch: %v", err) return false } } return matches } return storage.NewSimpleFilter(filterFunc, m.MatcherIndex) }
// WatchPredicate starts a watch for the items that m matches. func (e *Etcd) WatchPredicate(ctx api.Context, m generic.Matcher, resourceVersion string) (watch.Interface, error) { version, err := storage.ParseWatchResourceVersion(resourceVersion, e.EndpointName) if err != nil { return nil, err } filterFunc := e.filterAndDecorateFunction(m) if name, ok := m.MatchesSingle(); ok { key, err := e.KeyFunc(ctx, name) if err != nil { return nil, err } return e.Storage.Watch(key, version, filterFunc) } return e.Storage.WatchList(e.KeyRootFunc(ctx), version, filterFunc) }
// ListPredicate returns a list of all the items matching m. func (e *Etcd) ListPredicate(ctx api.Context, m generic.Matcher, options *unversioned.ListOptions) (runtime.Object, error) { list := e.NewListFunc() filterFunc := e.filterAndDecorateFunction(m) if name, ok := m.MatchesSingle(); ok { if key, err := e.KeyFunc(ctx, name); err == nil { err := e.Storage.GetToList(ctx, key, filterFunc, list) return list, etcderr.InterpretListError(err, e.EndpointName) } // if we cannot extract a key based on the current context, the optimization is skipped } if options == nil { options = &unversioned.ListOptions{ResourceVersion: "0"} } version, err := storage.ParseWatchResourceVersion(options.ResourceVersion, e.EndpointName) if err != nil { return nil, err } err = e.Storage.List(ctx, e.KeyRootFunc(ctx), version, filterFunc, list) return list, etcderr.InterpretListError(err, e.EndpointName) }