mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-09-10 21:50:05 +00:00
Move watch filter into storage level
This commit is contained in:
@@ -18,13 +18,14 @@ package controller
|
||||
|
||||
import (
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/watch"
|
||||
)
|
||||
|
||||
// Registry is an interface for things that know how to store ReplicationControllers.
|
||||
type Registry interface {
|
||||
ListControllers(ctx api.Context) (*api.ReplicationControllerList, error)
|
||||
WatchControllers(ctx api.Context, resourceVersion string) (watch.Interface, error)
|
||||
WatchControllers(ctx api.Context, label, field labels.Selector, resourceVersion string) (watch.Interface, error)
|
||||
GetController(ctx api.Context, controllerID string) (*api.ReplicationController, error)
|
||||
CreateController(ctx api.Context, controller *api.ReplicationController) error
|
||||
UpdateController(ctx api.Context, controller *api.ReplicationController) error
|
||||
|
@@ -146,41 +146,7 @@ func (rs *REST) Update(ctx api.Context, obj runtime.Object) (<-chan apiserver.RE
|
||||
// Watch returns ReplicationController events via a watch.Interface.
|
||||
// It implements apiserver.ResourceWatcher.
|
||||
func (rs *REST) Watch(ctx api.Context, label, field labels.Selector, resourceVersion string) (watch.Interface, error) {
|
||||
if !field.Empty() {
|
||||
return nil, fmt.Errorf("no field selector implemented for controllers")
|
||||
}
|
||||
incoming, err := rs.registry.WatchControllers(ctx, resourceVersion)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// TODO(lavalamp): remove watch.Filter, which is broken. Implement consistent way of filtering.
|
||||
// TODO(lavalamp): this watch method needs a test.
|
||||
return watch.Filter(incoming, func(e watch.Event) (watch.Event, bool) {
|
||||
controller, ok := e.Object.(*api.ReplicationController)
|
||||
if !ok {
|
||||
// must be an error event-- pass it on
|
||||
return e, true
|
||||
}
|
||||
match := label.Matches(labels.Set(controller.Labels))
|
||||
if match {
|
||||
rs.fillCurrentState(ctx, controller)
|
||||
}
|
||||
return e, match
|
||||
}), nil
|
||||
}
|
||||
|
||||
func (rs *REST) waitForController(ctx api.Context, controller *api.ReplicationController) (runtime.Object, error) {
|
||||
for {
|
||||
pods, err := rs.podLister.ListPods(ctx, labels.Set(controller.Spec.Selector).AsSelector())
|
||||
if err != nil {
|
||||
return controller, err
|
||||
}
|
||||
if len(pods.Items) == controller.Spec.Replicas {
|
||||
break
|
||||
}
|
||||
time.Sleep(rs.pollPeriod)
|
||||
}
|
||||
return controller, nil
|
||||
return rs.registry.WatchControllers(ctx, label, field, resourceVersion)
|
||||
}
|
||||
|
||||
func (rs *REST) fillCurrentState(ctx api.Context, controller *api.ReplicationController) error {
|
||||
|
Reference in New Issue
Block a user