// Create creates a new ImageChangeController which is used to trigger builds when a new // image is available func (factory *ImageChangeControllerFactory) Create() controller.RunnableController { queue := cache.NewResyncableFIFO(cache.MetaNamespaceKeyFunc) cache.NewReflector(&imageStreamLW{factory.Client}, &imageapi.ImageStream{}, queue, 2*time.Minute).RunUntil(factory.Stop) store := cache.NewStore(cache.MetaNamespaceKeyFunc) cache.NewReflector(&buildConfigLW{client: factory.Client}, &buildapi.BuildConfig{}, store, 2*time.Minute).RunUntil(factory.Stop) imageChangeController := &buildcontroller.ImageChangeController{ BuildConfigStore: store, BuildConfigInstantiator: factory.BuildConfigInstantiator, } return &controller.RetryController{ Queue: queue, RetryManager: controller.NewQueueRetryManager( queue, cache.MetaNamespaceKeyFunc, retryFunc("ImageStream update", func(err error) bool { _, isFatal := err.(buildcontroller.ImageChangeControllerFatalError) return isFatal }), flowcontrol.NewTokenBucketRateLimiter(1, 10), ), Handle: func(obj interface{}) error { imageRepo := obj.(*imageapi.ImageStream) return imageChangeController.HandleImageRepo(imageRepo) }, } }
// NewClient returns a usable Client. Don't forget to Stop it. func NewClient(addr string, resyncPeriod time.Duration) (Client, error) { c, err := unversioned.New(&unversioned.Config{Host: addr}) if err != nil { return nil, err } podListWatch := cache.NewListWatchFromClient(c, "pods", api.NamespaceAll, fields.Everything()) podStore := cache.NewStore(cache.MetaNamespaceKeyFunc) podReflector := cache.NewReflector(podListWatch, &api.Pod{}, podStore, resyncPeriod) serviceListWatch := cache.NewListWatchFromClient(c, "services", api.NamespaceAll, fields.Everything()) serviceStore := cache.NewStore(cache.MetaNamespaceKeyFunc) serviceReflector := cache.NewReflector(serviceListWatch, &api.Service{}, serviceStore, resyncPeriod) quit := make(chan struct{}) podReflector.RunUntil(quit) serviceReflector.RunUntil(quit) return &client{ quit: quit, client: c, podReflector: podReflector, podStore: &cache.StoreToPodLister{Store: podStore}, serviceReflector: serviceReflector, serviceStore: &cache.StoreToServiceLister{Store: serviceStore}, }, nil }
// Create constructs a BuildPodController func (factory *BuildPodControllerFactory) Create() controller.RunnableController { factory.buildStore = cache.NewStore(cache.MetaNamespaceKeyFunc) cache.NewReflector(&buildLW{client: factory.OSClient}, &buildapi.Build{}, factory.buildStore, 2*time.Minute).RunUntil(factory.Stop) queue := cache.NewResyncableFIFO(cache.MetaNamespaceKeyFunc) cache.NewReflector(&podLW{client: factory.KubeClient}, &kapi.Pod{}, queue, 2*time.Minute).RunUntil(factory.Stop) client := ControllerClient{factory.KubeClient, factory.OSClient} buildPodController := &buildcontroller.BuildPodController{ BuildStore: factory.buildStore, BuildUpdater: factory.BuildUpdater, SecretClient: factory.KubeClient, PodManager: client, } return &controller.RetryController{ Queue: queue, RetryManager: controller.NewQueueRetryManager( queue, cache.MetaNamespaceKeyFunc, retryFunc("BuildPod", nil), flowcontrol.NewTokenBucketRateLimiter(1, 10)), Handle: func(obj interface{}) error { pod := obj.(*kapi.Pod) return buildPodController.HandlePod(pod) }, } }
// Create begins listing and watching against the API server for the desired route and endpoint // resources. It spawns child goroutines that cannot be terminated. func (factory *RouterControllerFactory) Create(plugin router.Plugin) *controller.RouterController { routeEventQueue := oscache.NewEventQueue(cache.MetaNamespaceKeyFunc) cache.NewReflector(&routeLW{ client: factory.OSClient, namespace: factory.Namespace, field: factory.Fields, label: factory.Labels, }, &routeapi.Route{}, routeEventQueue, factory.ResyncInterval).Run() endpointsEventQueue := oscache.NewEventQueue(cache.MetaNamespaceKeyFunc) cache.NewReflector(&endpointsLW{ client: factory.KClient, namespace: factory.Namespace, // we do not scope endpoints by labels or fields because the route labels != endpoints labels }, &kapi.Endpoints{}, endpointsEventQueue, factory.ResyncInterval).Run() return &controller.RouterController{ Plugin: plugin, NextEndpoints: func() (watch.EventType, *kapi.Endpoints, error) { eventType, obj, err := endpointsEventQueue.Pop() if err != nil { return watch.Error, nil, err } return eventType, obj.(*kapi.Endpoints), nil }, NextRoute: func() (watch.EventType, *routeapi.Route, error) { eventType, obj, err := routeEventQueue.Pop() if err != nil { return watch.Error, nil, err } return eventType, obj.(*routeapi.Route), nil }, } }
// NewSourceAPI creates config source that watches for changes to the services and endpoints. func NewSourceAPI(c cache.Getter, period time.Duration, servicesChan chan<- ServiceUpdate, endpointsChan chan<- EndpointsUpdate) { servicesLW := cache.NewListWatchFromClient(c, "services", api.NamespaceAll, fields.Everything()) cache.NewReflector(servicesLW, &api.Service{}, NewServiceStore(nil, servicesChan), period).Run() endpointsLW := cache.NewListWatchFromClient(c, "endpoints", api.NamespaceAll, fields.Everything()) cache.NewReflector(endpointsLW, &api.Endpoints{}, NewEndpointsStore(nil, endpointsChan), period).Run() }
func (f *ConfigFactory) Run() { // Watch and queue pods that need scheduling. cache.NewReflector(f.createUnassignedNonTerminatedPodLW(), &v1.Pod{}, f.PodQueue, 0).RunUntil(f.StopEverything) // Begin populating scheduled pods. go f.scheduledPodPopulator.Run(f.StopEverything) // Begin populating nodes. go f.nodePopulator.Run(f.StopEverything) // Begin populating pv & pvc go f.pvPopulator.Run(f.StopEverything) go f.pvcPopulator.Run(f.StopEverything) // Begin populating services go f.servicePopulator.Run(f.StopEverything) // Begin populating controllers go f.controllerPopulator.Run(f.StopEverything) // start informers... f.informerFactory.Start(f.StopEverything) // Watch and cache all ReplicaSet objects. Scheduler needs to find all pods // created by the same services or ReplicationControllers/ReplicaSets, so that it can spread them correctly. // Cache this locally. cache.NewReflector(f.createReplicaSetLW(), &extensions.ReplicaSet{}, f.ReplicaSetLister.Indexer, 0).RunUntil(f.StopEverything) }
func (factory *RouterControllerFactory) Create(plugin router.Plugin) *controller.RouterController { routeEventQueue := oscache.NewEventQueue(cache.MetaNamespaceKeyFunc) cache.NewReflector(&routeLW{factory.OSClient}, &routeapi.Route{}, routeEventQueue, 2*time.Minute).Run() endpointsEventQueue := oscache.NewEventQueue(cache.MetaNamespaceKeyFunc) cache.NewReflector(&endpointsLW{factory.KClient}, &kapi.Endpoints{}, endpointsEventQueue, 2*time.Minute).Run() return &controller.RouterController{ Plugin: plugin, NextEndpoints: func() (watch.EventType, *kapi.Endpoints, error) { eventType, obj, err := endpointsEventQueue.Pop() if err != nil { return watch.Error, nil, err } return eventType, obj.(*kapi.Endpoints), nil }, NextRoute: func() (watch.EventType, *routeapi.Route, error) { eventType, obj, err := routeEventQueue.Pop() if err != nil { return watch.Error, nil, err } return eventType, obj.(*routeapi.Route), nil }, } }
// Create creates an ImageChangeController. func (factory *ImageChangeControllerFactory) Create() controller.RunnableController { imageStreamLW := &cache.ListWatch{ ListFunc: func(options kapi.ListOptions) (runtime.Object, error) { return factory.Client.ImageStreams(kapi.NamespaceAll).List(options) }, WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) { return factory.Client.ImageStreams(kapi.NamespaceAll).Watch(options) }, } queue := cache.NewFIFO(cache.MetaNamespaceKeyFunc) cache.NewReflector(imageStreamLW, &imageapi.ImageStream{}, queue, 2*time.Minute).Run() deploymentConfigLW := &cache.ListWatch{ ListFunc: func(options kapi.ListOptions) (runtime.Object, error) { return factory.Client.DeploymentConfigs(kapi.NamespaceAll).List(options) }, WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) { return factory.Client.DeploymentConfigs(kapi.NamespaceAll).Watch(options) }, } store := cache.NewStore(cache.MetaNamespaceKeyFunc) cache.NewReflector(deploymentConfigLW, &deployapi.DeploymentConfig{}, store, 2*time.Minute).Run() changeController := &ImageChangeController{ listDeploymentConfigs: func() ([]*deployapi.DeploymentConfig, error) { configs := []*deployapi.DeploymentConfig{} objs := store.List() for _, obj := range objs { configs = append(configs, obj.(*deployapi.DeploymentConfig)) } return configs, nil }, client: factory.Client, } return &controller.RetryController{ Queue: queue, RetryManager: controller.NewQueueRetryManager( queue, cache.MetaNamespaceKeyFunc, func(obj interface{}, err error, retries controller.Retry) bool { utilruntime.HandleError(err) if _, isFatal := err.(fatalError); isFatal { return false } if retries.Count > 0 { return false } return true }, flowcontrol.NewTokenBucketRateLimiter(1, 10), ), Handle: func(obj interface{}) error { repo := obj.(*imageapi.ImageStream) return changeController.Handle(repo) }, } }
func TestReflectorForWatchCache(t *testing.T) { store := newWatchCache(5) { _, version := store.ListWithVersion() if version != 0 { t.Errorf("unexpected resource version: %d", version) } } lw := &testLW{ WatchFunc: func(rv string) (watch.Interface, error) { fw := watch.NewFake() go fw.Stop() return fw, nil }, ListFunc: func() (runtime.Object, error) { return &api.PodList{ListMeta: unversioned.ListMeta{ResourceVersion: "10"}}, nil }, } r := cache.NewReflector(lw, &api.Pod{}, store, 0) r.ListAndWatch(util.NeverStop) { _, version := store.ListWithVersion() if version != 10 { t.Errorf("unexpected resource version: %d", version) } } }
func NewKubeletProvider(uri *url.URL) (MetricsSourceProvider, error) { // create clients kubeConfig, kubeletConfig, err := GetKubeConfigs(uri) if err != nil { return nil, err } kubeClient := kube_client.NewOrDie(kubeConfig) kubeletClient, err := NewKubeletClient(kubeletConfig) if err != nil { return nil, err } // Get nodes to test if the client is configured well. Watch gives less error information. if _, err := kubeClient.Nodes().List(kube_api.ListOptions{ LabelSelector: labels.Everything(), FieldSelector: fields.Everything()}); err != nil { glog.Errorf("Failed to load nodes: %v", err) } // watch nodes lw := cache.NewListWatchFromClient(kubeClient, "nodes", kube_api.NamespaceAll, fields.Everything()) nodeLister := &cache.StoreToNodeLister{Store: cache.NewStore(cache.MetaNamespaceKeyFunc)} reflector := cache.NewReflector(lw, &kube_api.Node{}, nodeLister.Store, time.Hour) reflector.Run() return &kubeletProvider{ nodeLister: nodeLister, reflector: reflector, kubeletClient: kubeletClient, }, nil }
// Mesos spawns a new pod source that watches API server for changes and collaborates with // executor.Registry to generate api.Pod objects in a fashion that's very Mesos-aware. func Mesos( stop <-chan struct{}, out chan<- interface{}, podWatch *cache.ListWatch, registry executor.Registry, options ...Option, ) { source := &Source{ stop: stop, out: out, filters: []Filter{ FilterFunc(filterMirrorPod), ®isteredPodFilter{registry: registry}, }, } // note: any filters added by options should be applied after the defaults for _, opt := range options { opt(source) } // reflect changes from the watch into a chan, filtered to include only mirror pods // (have an ConfigMirrorAnnotationKey attr) cache.NewReflector( podWatch, &api.Pod{}, cache.NewUndeltaStore(source.send, cache.MetaNamespaceKeyFunc), 0, ).RunUntil(stop) }
func (oi *OsdnRegistryInterface) WatchNetNamespaces(receiver chan *osdnapi.NetNamespaceEvent, stop chan bool) error { netNsEventQueue := oscache.NewEventQueue(cache.MetaNamespaceKeyFunc) listWatch := &cache.ListWatch{ ListFunc: func() (runtime.Object, error) { return oi.oClient.NetNamespaces().List() }, WatchFunc: func(resourceVersion string) (watch.Interface, error) { return oi.oClient.NetNamespaces().Watch(resourceVersion) }, } cache.NewReflector(listWatch, &api.NetNamespace{}, netNsEventQueue, 4*time.Minute).Run() for { eventType, obj, err := netNsEventQueue.Pop() if err != nil { return err } switch eventType { case watch.Added: // we should ignore the modified event because status updates cause unnecessary noise // the only time we would care about modified would be if the node changes its IP address // and hence all nodes need to update their vtep entries for the respective subnet // create nodeEvent netns := obj.(*api.NetNamespace) receiver <- &osdnapi.NetNamespaceEvent{Type: osdnapi.Added, Name: netns.NetName, NetID: netns.NetID} case watch.Deleted: // TODO: There is a chance that a Delete event will not get triggered. // Need to use a periodic sync loop that lists and compares. netns := obj.(*api.NetNamespace) receiver <- &osdnapi.NetNamespaceEvent{Type: osdnapi.Deleted, Name: netns.NetName} } } }
// Create constructs a BuildController func (factory *BuildControllerFactory) Create() controller.RunnableController { queue := cache.NewFIFO(cache.MetaNamespaceKeyFunc) cache.NewReflector(&buildLW{client: factory.OSClient}, &buildapi.Build{}, queue, 2*time.Minute).Run() eventBroadcaster := record.NewBroadcaster() eventBroadcaster.StartRecordingToSink(factory.KubeClient.Events("")) client := ControllerClient{factory.KubeClient, factory.OSClient} buildController := &buildcontroller.BuildController{ BuildUpdater: factory.BuildUpdater, ImageStreamClient: client, PodManager: client, BuildStrategy: &typeBasedFactoryStrategy{ DockerBuildStrategy: factory.DockerBuildStrategy, SourceBuildStrategy: factory.SourceBuildStrategy, CustomBuildStrategy: factory.CustomBuildStrategy, }, Recorder: eventBroadcaster.NewRecorder(kapi.EventSource{Component: "build-controller"}), } return &controller.RetryController{ Queue: queue, RetryManager: controller.NewQueueRetryManager( queue, cache.MetaNamespaceKeyFunc, limitedLogAndRetry(factory.BuildUpdater, 30*time.Minute), kutil.NewTokenBucketRateLimiter(1, 10)), Handle: func(obj interface{}) error { build := obj.(*buildapi.Build) return buildController.HandleBuild(build) }, } }
// Create a new Cacher responsible from service WATCH and LIST requests from its // internal cache and updating its cache in the background based on the given // configuration. func NewCacher(config CacherConfig) *Cacher { watchCache := cache.NewWatchCache(config.CacheCapacity) listerWatcher := newCacherListerWatcher(config.Storage, config.ResourcePrefix, config.NewListFunc) cacher := &Cacher{ initialized: sync.WaitGroup{}, watchCache: watchCache, reflector: cache.NewReflector(listerWatcher, config.Type, watchCache, 0), watcherIdx: 0, watchers: make(map[int]*cacheWatcher), versioner: config.Versioner, keyFunc: config.KeyFunc, } cacher.initialized.Add(1) // See startCaching method for why explanation on it. watchCache.SetOnReplace(func() { cacher.initOnce.Do(func() { cacher.initialized.Done() }) cacher.Unlock() }) watchCache.SetOnEvent(cacher.processEvent) stopCh := config.StopChannel go util.Until(func() { cacher.startCaching(stopCh) }, 0, stopCh) cacher.initialized.Wait() return cacher }
// Create creates a new ImageChangeController which is used to trigger builds when a new // image is available func (factory *ImageChangeControllerFactory) Create() controller.RunnableController { queue := cache.NewResyncableFIFO(cache.MetaNamespaceKeyFunc) cache.NewReflector(&imageStreamLW{factory.Client}, &imageapi.ImageStream{}, queue, 2*time.Minute).RunUntil(factory.Stop) imageChangeController := &buildcontroller.ImageChangeController{ BuildConfigIndex: factory.BuildConfigIndex, BuildConfigInstantiator: factory.BuildConfigInstantiator, } // Wait for the bc store to sync before starting any work in this controller. factory.waitForSyncedStores() return &controller.RetryController{ Queue: queue, RetryManager: controller.NewQueueRetryManager( queue, cache.MetaNamespaceKeyFunc, retryFunc("ImageStream update", nil), flowcontrol.NewTokenBucketRateLimiter(1, 10), ), Handle: func(obj interface{}) error { imageRepo := obj.(*imageapi.ImageStream) return imageChangeController.HandleImageStream(imageRepo) }, } }
// CreateDeleteController constructs a BuildDeleteController func (factory *BuildControllerFactory) CreateDeleteController() controller.RunnableController { client := ControllerClient{factory.KubeClient, factory.OSClient} queue := cache.NewDeltaFIFO(cache.MetaNamespaceKeyFunc, nil, keyListerGetter{}) cache.NewReflector(&buildDeleteLW{client, queue}, &buildapi.Build{}, queue, 5*time.Minute).RunUntil(factory.Stop) buildDeleteController := &buildcontroller.BuildDeleteController{ PodManager: client, } return &controller.RetryController{ Queue: queue, RetryManager: controller.NewQueueRetryManager( queue, queue.KeyOf, controller.RetryNever, flowcontrol.NewTokenBucketRateLimiter(1, 10)), Handle: func(obj interface{}) error { deltas := obj.(cache.Deltas) for _, delta := range deltas { if delta.Type == cache.Deleted { return buildDeleteController.HandleBuildDeletion(delta.Object.(*buildapi.Build)) } } return nil }, } }
func newPodsApi(client *kclient.Client) podsApi { // Extend the selector to include specific nodes to monitor // or provide an API to update the nodes to monitor. selector, err := kSelector.ParseSelector("spec.nodeName!=") if err != nil { panic(err) } lw := kcache.NewListWatchFromClient(client, "pods", kapi.NamespaceAll, selector) podLister := &kcache.StoreToPodLister{Store: kcache.NewStore(kcache.MetaNamespaceKeyFunc)} // Watch and cache all running pods. reflector := kcache.NewReflector(lw, &kapi.Pod{}, podLister.Store, 0) stopChan := make(chan struct{}) reflector.RunUntil(stopChan) nStore, nController := kframework.NewInformer( createNamespaceLW(client), &kapi.Namespace{}, resyncPeriod, kframework.ResourceEventHandlerFuncs{}) go nController.Run(util.NeverStop) podsApi := &realPodsApi{ client: client, podLister: podLister, stopChan: stopChan, reflector: reflector, namespaceStore: nStore, } return podsApi }
func (oi *OsdnRegistryInterface) WatchSubnets(receiver chan *osdnapi.SubnetEvent, stop chan bool) error { subnetEventQueue := oscache.NewEventQueue(cache.MetaNamespaceKeyFunc) listWatch := &cache.ListWatch{ ListFunc: func() (runtime.Object, error) { return oi.oClient.HostSubnets().List() }, WatchFunc: func(resourceVersion string) (watch.Interface, error) { return oi.oClient.HostSubnets().Watch(resourceVersion) }, } cache.NewReflector(listWatch, &api.HostSubnet{}, subnetEventQueue, 4*time.Minute).Run() for { eventType, obj, err := subnetEventQueue.Pop() if err != nil { return err } switch eventType { case watch.Added, watch.Modified: // create SubnetEvent hs := obj.(*api.HostSubnet) receiver <- &osdnapi.SubnetEvent{Type: osdnapi.Added, Node: hs.Host, Sub: osdnapi.Subnet{NodeIP: hs.HostIP, Sub: hs.Subnet}} case watch.Deleted: // TODO: There is a chance that a Delete event will not get triggered. // Need to use a periodic sync loop that lists and compares. hs := obj.(*api.HostSubnet) receiver <- &osdnapi.SubnetEvent{Type: osdnapi.Deleted, Node: hs.Host, Sub: osdnapi.Subnet{NodeIP: hs.HostIP, Sub: hs.Subnet}} } } }
// Run event queue for the given resource func (registry *Registry) runEventQueue(resourceName string) (*oscache.EventQueue, *cache.Reflector) { eventQueue := oscache.NewEventQueue(cache.MetaNamespaceKeyFunc) lw := &cache.ListWatch{} var expectedType interface{} switch strings.ToLower(resourceName) { case "hostsubnet": expectedType = &originapi.HostSubnet{} lw.ListFunc = func(options kapi.ListOptions) (runtime.Object, error) { return registry.oClient.HostSubnets().List(options) } lw.WatchFunc = func(options kapi.ListOptions) (watch.Interface, error) { return registry.oClient.HostSubnets().Watch(options) } case "node": expectedType = &kapi.Node{} lw.ListFunc = func(options kapi.ListOptions) (runtime.Object, error) { return registry.kClient.Nodes().List(options) } lw.WatchFunc = func(options kapi.ListOptions) (watch.Interface, error) { return registry.kClient.Nodes().Watch(options) } case "namespace": expectedType = &kapi.Namespace{} lw.ListFunc = func(options kapi.ListOptions) (runtime.Object, error) { return registry.kClient.Namespaces().List(options) } lw.WatchFunc = func(options kapi.ListOptions) (watch.Interface, error) { return registry.kClient.Namespaces().Watch(options) } case "netnamespace": expectedType = &originapi.NetNamespace{} lw.ListFunc = func(options kapi.ListOptions) (runtime.Object, error) { return registry.oClient.NetNamespaces().List(options) } lw.WatchFunc = func(options kapi.ListOptions) (watch.Interface, error) { return registry.oClient.NetNamespaces().Watch(options) } case "service": expectedType = &kapi.Service{} lw.ListFunc = func(options kapi.ListOptions) (runtime.Object, error) { return registry.kClient.Services(kapi.NamespaceAll).List(options) } lw.WatchFunc = func(options kapi.ListOptions) (watch.Interface, error) { return registry.kClient.Services(kapi.NamespaceAll).Watch(options) } case "pod": expectedType = &kapi.Pod{} lw.ListFunc = func(options kapi.ListOptions) (runtime.Object, error) { return registry.kClient.Pods(kapi.NamespaceAll).List(options) } lw.WatchFunc = func(options kapi.ListOptions) (watch.Interface, error) { return registry.kClient.Pods(kapi.NamespaceAll).Watch(options) } default: log.Fatalf("Unknown resource %s during initialization of event queue", resourceName) } reflector := cache.NewReflector(lw, expectedType, eventQueue, 4*time.Minute) reflector.Run() return eventQueue, reflector }
// Create creates an ImportController. func (f *ImportControllerFactory) Create() controller.RunnableController { lw := &cache.ListWatch{ ListFunc: func() (runtime.Object, error) { return f.Client.ImageStreams(kapi.NamespaceAll).List(labels.Everything(), fields.Everything()) }, WatchFunc: func(resourceVersion string) (watch.Interface, error) { return f.Client.ImageStreams(kapi.NamespaceAll).Watch(labels.Everything(), fields.Everything(), resourceVersion) }, } q := cache.NewFIFO(cache.MetaNamespaceKeyFunc) cache.NewReflector(lw, &api.ImageStream{}, q, 2*time.Minute).Run() c := &ImportController{ streams: f.Client, mappings: f.Client, } return &controller.RetryController{ Queue: q, RetryManager: controller.NewQueueRetryManager( q, cache.MetaNamespaceKeyFunc, func(obj interface{}, err error, retries controller.Retry) bool { util.HandleError(err) return retries.Count < 5 }, kutil.NewTokenBucketRateLimiter(1, 10), ), Handle: func(obj interface{}) error { r := obj.(*api.ImageStream) return c.Next(r) }, } }
// CreateDeleteController constructs a BuildPodDeleteController func (factory *BuildPodControllerFactory) CreateDeleteController() controller.RunnableController { client := ControllerClient{factory.KubeClient, factory.OSClient} queue := cache.NewDeltaFIFO(cache.MetaNamespaceKeyFunc, nil, nil) cache.NewReflector(&buildPodDeleteLW{client, queue}, &kapi.Pod{}, queue, 5*time.Minute).Run() buildPodDeleteController := &buildcontroller.BuildPodDeleteController{ BuildStore: factory.buildStore, BuildUpdater: factory.BuildUpdater, } return &controller.RetryController{ Queue: queue, RetryManager: controller.NewQueueRetryManager( queue, cache.MetaNamespaceKeyFunc, controller.RetryNever, kutil.NewTokenBucketRateLimiter(1, 10)), Handle: func(obj interface{}) error { deltas := obj.(cache.Deltas) for _, delta := range deltas { if delta.Type == cache.Deleted { return buildPodDeleteController.HandleBuildPodDeletion(delta.Object.(*kapi.Pod)) } } return nil }, } }
// Run event queue for the given resource func (registry *Registry) RunEventQueue(resourceName ResourceName) *oscache.EventQueue { var client cache.Getter var expectedType interface{} switch resourceName { case HostSubnets: expectedType = &osapi.HostSubnet{} client = registry.oClient case NetNamespaces: expectedType = &osapi.NetNamespace{} client = registry.oClient case Nodes: expectedType = &kapi.Node{} client = registry.kClient case Namespaces: expectedType = &kapi.Namespace{} client = registry.kClient case Services: expectedType = &kapi.Service{} client = registry.kClient case Pods: expectedType = &kapi.Pod{} client = registry.kClient default: log.Fatalf("Unknown resource %s during initialization of event queue", resourceName) } lw := cache.NewListWatchFromClient(client, strings.ToLower(string(resourceName)), kapi.NamespaceAll, fields.Everything()) eventQueue := oscache.NewEventQueue(cache.MetaNamespaceKeyFunc) // Repopulate event queue every 30 mins // Existing items in the event queue will have watch.Modified event type cache.NewReflector(lw, expectedType, eventQueue, 30*time.Minute).Run() return eventQueue }
func NewReadOnlyClusterPolicyBindingCache(registry clusterbindingregistry.WatchingRegistry) *readOnlyClusterPolicyBindingCache { ctx := kapi.WithNamespace(kapi.NewContext(), kapi.NamespaceAll) indexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{"namespace": cache.MetaNamespaceIndexFunc}) reflector := cache.NewReflector( &cache.ListWatch{ ListFunc: func() (runtime.Object, error) { return registry.ListClusterPolicyBindings(ctx, labels.Everything(), fields.Everything()) }, WatchFunc: func(resourceVersion string) (watch.Interface, error) { return registry.WatchClusterPolicyBindings(ctx, labels.Everything(), fields.Everything(), resourceVersion) }, }, &authorizationapi.ClusterPolicyBinding{}, indexer, 2*time.Minute, ) return &readOnlyClusterPolicyBindingCache{ registry: registry, indexer: indexer, reflector: reflector, keyFunc: cache.MetaNamespaceKeyFunc, } }
func NewGroupCache(groupRegistry groupregistry.Registry) *GroupCache { allNamespaceContext := kapi.WithNamespace(kapi.NewContext(), kapi.NamespaceAll) indexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{byUserIndexName: ByUserIndexKeys}) reflector := cache.NewReflector( &cache.ListWatch{ ListFunc: func(options kapi.ListOptions) (runtime.Object, error) { opts := &unversioned.ListOptions{ LabelSelector: unversioned.LabelSelector{Selector: options.LabelSelector}, FieldSelector: unversioned.FieldSelector{Selector: options.FieldSelector}, ResourceVersion: options.ResourceVersion, } return groupRegistry.ListGroups(allNamespaceContext, opts) }, WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) { opts := &unversioned.ListOptions{ LabelSelector: unversioned.LabelSelector{Selector: options.LabelSelector}, FieldSelector: unversioned.FieldSelector{Selector: options.FieldSelector}, ResourceVersion: options.ResourceVersion, } return groupRegistry.WatchGroups(allNamespaceContext, opts) }, }, &userapi.Group{}, indexer, // TODO this was chosen via copy/paste. If or when we choose to standardize these in some way, be sure to update this. 2*time.Minute, ) return &GroupCache{ indexer: indexer, reflector: reflector, } }
func RunProjectCache(c client.Interface, defaultNodeSelector string) { if pcache != nil { return } store := cache.NewStore(cache.MetaNamespaceKeyFunc) reflector := cache.NewReflector( &cache.ListWatch{ ListFunc: func() (runtime.Object, error) { return c.Namespaces().List(labels.Everything(), fields.Everything()) }, WatchFunc: func(resourceVersion string) (watch.Interface, error) { return c.Namespaces().Watch(labels.Everything(), fields.Everything(), resourceVersion) }, }, &kapi.Namespace{}, store, 0, ) reflector.Run() pcache = &ProjectCache{ Client: c, Store: store, DefaultNodeSelector: defaultNodeSelector, } }
func NewReadOnlyClusterPolicyCache(registry clusterpolicyregistry.WatchingRegistry) *readOnlyClusterPolicyCache { ctx := kapi.WithNamespace(kapi.NewContext(), kapi.NamespaceAll) indexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{"namespace": cache.MetaNamespaceIndexFunc}) reflector := cache.NewReflector( &cache.ListWatch{ ListFunc: func(options kapi.ListOptions) (runtime.Object, error) { return registry.ListClusterPolicies(ctx, &options) }, WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) { return registry.WatchClusterPolicies(ctx, &options) }, }, &authorizationapi.ClusterPolicy{}, indexer, 2*time.Minute, ) return &readOnlyClusterPolicyCache{ registry: registry, indexer: indexer, reflector: reflector, keyFunc: cache.MetaNamespaceKeyFunc, } }
// NewAcceptNewlyObservedReadyPods makes a new AcceptNewlyObservedReadyPods // from a real client. func NewAcceptNewlyObservedReadyPods( out io.Writer, kclient kcoreclient.PodsGetter, timeout time.Duration, interval time.Duration, minReadySeconds int32, ) *AcceptNewlyObservedReadyPods { return &AcceptNewlyObservedReadyPods{ out: out, timeout: timeout, interval: interval, minReadySeconds: minReadySeconds, acceptedPods: sets.NewString(), getDeploymentPodStore: func(deployment *kapi.ReplicationController) (cache.Store, chan struct{}) { selector := labels.Set(deployment.Spec.Selector).AsSelector() store := cache.NewStore(cache.MetaNamespaceKeyFunc) lw := &cache.ListWatch{ ListFunc: func(options kapi.ListOptions) (runtime.Object, error) { options.LabelSelector = selector return kclient.Pods(deployment.Namespace).List(options) }, WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) { options.LabelSelector = selector return kclient.Pods(deployment.Namespace).Watch(options) }, } stop := make(chan struct{}) cache.NewReflector(lw, &kapi.Pod{}, store, 10*time.Second).RunUntil(stop) return store, stop }, } }
func getNodeLister(kubeClient *kube_client.Client) (*cache.StoreToNodeLister, error) { lw := cache.NewListWatchFromClient(kubeClient, "nodes", kube_api.NamespaceAll, fields.Everything()) nodeLister := &cache.StoreToNodeLister{Store: cache.NewStore(cache.MetaNamespaceKeyFunc)} reflector := cache.NewReflector(lw, &kube_api.Node{}, nodeLister.Store, time.Hour) reflector.Run() return nodeLister, nil }
// NewPlugin creates a new PSP admission plugin. func NewPlugin(kclient clientset.Interface, strategyFactory psp.StrategyFactory, pspMatcher PSPMatchFn, failOnNoPolicies bool) *podSecurityPolicyPlugin { store := cache.NewStore(cache.MetaNamespaceKeyFunc) reflector := cache.NewReflector( &cache.ListWatch{ ListFunc: func(options api.ListOptions) (runtime.Object, error) { return kclient.Extensions().PodSecurityPolicies().List(options) }, WatchFunc: func(options api.ListOptions) (watch.Interface, error) { return kclient.Extensions().PodSecurityPolicies().Watch(options) }, }, &extensions.PodSecurityPolicy{}, store, 0, ) return &podSecurityPolicyPlugin{ Handler: admission.NewHandler(admission.Create, admission.Update), client: kclient, strategyFactory: strategyFactory, pspMatcher: pspMatcher, failOnNoPolicies: failOnNoPolicies, store: store, reflector: reflector, } }
// Create creates a new ConfigChangeController which is used to trigger builds on creation func (factory *BuildConfigControllerFactory) Create() controller.RunnableController { queue := cache.NewResyncableFIFO(cache.MetaNamespaceKeyFunc) cache.NewReflector(&buildConfigLW{client: factory.Client}, &buildapi.BuildConfig{}, queue, 2*time.Minute).RunUntil(factory.Stop) eventBroadcaster := record.NewBroadcaster() eventBroadcaster.StartRecordingToSink(factory.KubeClient.Events("")) bcController := &buildcontroller.BuildConfigController{ BuildConfigInstantiator: factory.BuildConfigInstantiator, Recorder: eventBroadcaster.NewRecorder(kapi.EventSource{Component: "build-config-controller"}), } return &controller.RetryController{ Queue: queue, RetryManager: controller.NewQueueRetryManager( queue, cache.MetaNamespaceKeyFunc, retryFunc("BuildConfig", buildcontroller.IsFatal), flowcontrol.NewTokenBucketRateLimiter(1, 10)), Handle: func(obj interface{}) error { bc := obj.(*buildapi.BuildConfig) return bcController.HandleBuildConfig(bc) }, } }