// WatchControllers begins watching for new, changed, or deleted controllers. func (r *Registry) WatchControllers(ctx api.Context, label labels.Selector, field fields.Selector, resourceVersion string) (watch.Interface, error) { if !field.Empty() { return nil, fmt.Errorf("field selectors are not supported on replication controllers") } version, err := tools.ParseWatchResourceVersion(resourceVersion, "replicationControllers") if err != nil { return nil, err } key := makeControllerListKey(ctx) return r.WatchList(key, version, func(obj runtime.Object) bool { controller, ok := obj.(*api.ReplicationController) if !ok { // Must be an error: return true to propagate to upper level. return true } match := label.Matches(labels.Set(controller.Labels)) if match { pods, err := r.pods.ListPods(ctx, labels.Set(controller.Spec.Selector).AsSelector()) if err != nil { glog.Warningf("Error listing pods: %v", err) // No object that's useable so drop it on the floor return false } if pods == nil { glog.Warningf("Pods list is nil. This should never happen...") // No object that's useable so drop it on the floor return false } controller.Status.Replicas = len(pods.Items) } return match }) }
// 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 := tools.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.Helper.Watch(key, version, filterFunc) } return e.Helper.WatchList(e.KeyRootFunc(ctx), version, filterFunc) }
// WatchControllers begins watching for new, changed, or deleted controllers. func (r *Registry) WatchControllers(ctx api.Context, resourceVersion string) (watch.Interface, error) { version, err := tools.ParseWatchResourceVersion(resourceVersion, "replicationControllers") if err != nil { return nil, err } key := makeControllerListKey(ctx) return r.WatchList(key, version, tools.Everything) }
// Watch starts a watch for the items that m matches. // TODO: Detect if m references a single object instead of a list. func (e *Etcd) Watch(ctx api.Context, m generic.Matcher, resourceVersion string) (watch.Interface, error) { version, err := tools.ParseWatchResourceVersion(resourceVersion, e.EndpointName) if err != nil { return nil, err } return e.Helper.WatchList(e.KeyRootFunc(ctx), version, func(obj runtime.Object) bool { matches, err := m.Matches(obj) return err == nil && matches }) }
func (r *Registry) WatchMinions(ctx api.Context, label labels.Selector, field fields.Selector, resourceVersion string) (watch.Interface, error) { version, err := tools.ParseWatchResourceVersion(resourceVersion, "node") if err != nil { return nil, err } key := makeNodeListKey() return r.WatchList(key, version, func(obj runtime.Object) bool { minionObj, ok := obj.(*api.Node) if !ok { // Must be an error: return true to propagate to upper level. return true } // TODO: Add support for filtering based on field, once NodeStatus is defined. return label.Matches(labels.Set(minionObj.Labels)) }) }
// WatchPods begins watching for new, changed, or deleted pods. func (r *Registry) WatchPods(ctx api.Context, label, field labels.Selector, resourceVersion string) (watch.Interface, error) { version, err := tools.ParseWatchResourceVersion(resourceVersion, "pod") if err != nil { return nil, err } key := makePodListKey(ctx) return r.WatchList(key, version, func(obj runtime.Object) bool { podObj, ok := obj.(*api.Pod) if !ok { // Must be an error: return true to propagate to upper level. return true } fields := pod.PodToSelectableFields(podObj) return label.Matches(labels.Set(podObj.Labels)) && field.Matches(fields) }) }
// WatchPods begins watching for new, changed, or deleted pods. func (r *Registry) WatchPods(ctx api.Context, resourceVersion string, filter func(*api.Pod) bool) (watch.Interface, error) { version, err := tools.ParseWatchResourceVersion(resourceVersion, "pod") if err != nil { return nil, err } key := makePodListKey(ctx) return r.WatchList(key, version, func(obj runtime.Object) bool { switch t := obj.(type) { case *api.Pod: return filter(t) default: // Must be an error return true } }) }
// WatchBuildConfigs begins watching for new, changed, or deleted BuildConfigs. func (r *Etcd) WatchBuildConfigs(ctx kapi.Context, label labels.Selector, field fields.Selector, resourceVersion string) (watch.Interface, error) { version, err := tools.ParseWatchResourceVersion(resourceVersion, "buildConfig") if err != nil { return nil, err } return r.WatchList(makeBuildConfigListKey(ctx), version, func(obj runtime.Object) bool { buildConfig, ok := obj.(*api.BuildConfig) if !ok { glog.Errorf("Unexpected object during %s/%s BuildConfig watch: %#v", buildConfig.Namespace, buildConfig.Name, obj) return false } fields := labels.Set{ "metadata.name": buildConfig.Name, } return label.Matches(labels.Set(buildConfig.Labels)) && field.Matches(fields) }) }
// WatchEndpoints begins watching for new, changed, or deleted endpoint configurations. func (r *Registry) WatchEndpoints(ctx api.Context, label labels.Selector, field fields.Selector, resourceVersion string) (watch.Interface, error) { version, err := tools.ParseWatchResourceVersion(resourceVersion, "endpoints") if err != nil { return nil, err } if !label.Empty() { return nil, fmt.Errorf("label selectors are not supported on endpoints") } if value, found := field.RequiresExactMatch("name"); found { key, err := makeServiceEndpointsKey(ctx, value) if err != nil { return nil, err } return r.Watch(key, version), nil } if field.Empty() { return r.WatchList(makeServiceEndpointsListKey(ctx), version, tools.Everything) } return nil, fmt.Errorf("only the 'ID' and default (everything) field selectors are supported") }
// WatchBuilds begins watching for new, changed, or deleted Builds. func (r *Etcd) WatchBuilds(ctx kapi.Context, label labels.Selector, field fields.Selector, resourceVersion string) (watch.Interface, error) { version, err := tools.ParseWatchResourceVersion(resourceVersion, "build") if err != nil { return nil, err } return r.WatchList(makeBuildListKey(ctx), version, func(obj runtime.Object) bool { build, ok := obj.(*api.Build) setDuration(build) if !ok { glog.Errorf("Unexpected object during build watch: %#v", obj) return false } fields := labels.Set{ "metadata.name": build.Name, "status": string(build.Status), "podName": buildutil.GetBuildPodName(build), } return label.Matches(labels.Set(build.Labels)) && field.Matches(fields) }) }
// WatchControllers begins watching for new, changed, or deleted controllers. func (r *Registry) WatchControllers(ctx api.Context, label, field labels.Selector, resourceVersion string) (watch.Interface, error) { if !field.Empty() { return nil, fmt.Errorf("field selectors are not supported on replication controllers") } version, err := tools.ParseWatchResourceVersion(resourceVersion, "replicationControllers") if err != nil { return nil, err } key := makeControllerListKey(ctx) return r.WatchList(key, version, func(obj runtime.Object) bool { controller, ok := obj.(*api.ReplicationController) if !ok { // Must be an error: return true to propagate to upper level. return true } match := label.Matches(labels.Set(controller.Labels)) if match { pods, _ := r.ListPods(ctx, labels.Set(controller.Spec.Selector).AsSelector()) controller.Status.Replicas = len(pods.Items) } return match }) }
// WatchRoutes begins watching for new, changed, or deleted route configurations. func (registry *Etcd) WatchRoutes(ctx kapi.Context, label labels.Selector, field fields.Selector, resourceVersion string) (watch.Interface, error) { if !label.Empty() { return nil, fmt.Errorf("label selectors are not supported on routes yet") } version, err := tools.ParseWatchResourceVersion(resourceVersion, "pod") if err != nil { return nil, err } if value, found := field.RequiresExactMatch("ID"); found { key, err := makeRouteKey(ctx, value) if err != nil { return nil, err } return registry.Watch(key, version, tools.Everything) } if field.Empty() { key := kubeetcd.MakeEtcdListKey(ctx, RoutePath) return registry.WatchList(key, version, tools.Everything) } return nil, fmt.Errorf("only the 'ID' and default (everything) field selectors are supported") }