// RegisterFakeWatch adds a new fake watcher for the specified resource in the given fake client. // All subsequent requests for a watch on the client will result in returning this fake watcher. func RegisterFakeWatch(resource string, client *core.Fake) *WatcherDispatcher { dispatcher := &WatcherDispatcher{ watchers: make([]*watch.RaceFreeFakeWatcher, 0), eventsSoFar: make([]*watch.Event, 0), orderExecution: make(chan func(), 100), stopChan: make(chan struct{}), } go func() { for { select { case fun := <-dispatcher.orderExecution: fun() case <-dispatcher.stopChan: return } } }() client.AddWatchReactor(resource, func(action core.Action) (bool, watch.Interface, error) { watcher := watch.NewRaceFreeFake() dispatcher.register(watcher) return true, watcher, nil }) return dispatcher }
// RegisterFakeCopyOnUpdate registers a reactor in the given fake client that passes // all updated objects to the given watcher and also copies them to a channel for // in-test inspection. func RegisterFakeCopyOnUpdate(resource string, client *core.Fake, watcher *WatcherDispatcher) chan runtime.Object { objChan := make(chan runtime.Object, 100) client.AddReactor("update", resource, func(action core.Action) (bool, runtime.Object, error) { updateAction := action.(core.UpdateAction) originalObj := updateAction.GetObject() glog.V(7).Infof("Updating %s: %v", resource, updateAction.GetObject()) // Create a copy of the object here to prevent data races while reading the object in go routine. obj := copy(originalObj) operation := func() { glog.V(4).Infof("Object updated. Writing to channel: %v", obj) watcher.Modify(obj) objChan <- obj } select { case watcher.orderExecution <- operation: break case <-time.After(pushTimeout): glog.Errorf("Fake client execution channel blocked") glog.Errorf("Tried to push %v", updateAction) } return true, originalObj, nil }) return objChan }
func RegisterDeleteCollection(client *core.Fake, resource string) chan string { deleteChan := make(chan string, 100) client.AddReactor("delete-collection", resource, func(action core.Action) (bool, runtime.Object, error) { deleteChan <- "all" return true, nil, nil }) return deleteChan }
func RegisterDelete(client *core.Fake, resource string) chan string { deleteChan := make(chan string, 100) client.AddReactor("delete", resource, func(action core.Action) (bool, runtime.Object, error) { deleteAction := action.(core.DeleteAction) deleteChan <- deleteAction.GetName() return true, nil, nil }) return deleteChan }
func RegisterCopyOnUpdate(resource string, client *core.Fake, watcher *watch.FakeWatcher) chan runtime.Object { objChan := make(chan runtime.Object, 100) client.AddReactor("update", resource, func(action core.Action) (bool, runtime.Object, error) { updateAction := action.(core.UpdateAction) obj := updateAction.GetObject() go func() { watcher.Modify(obj) objChan <- obj }() return true, obj, nil }) return objChan }
// RegisterFakeCopyOnCreate registers a reactor in the given fake client that passes // all created objects to the given watcher and also copies them to a channel for // in-test inspection. func RegisterFakeCopyOnCreate(resource string, client *core.Fake, watcher *WatcherDispatcher) chan runtime.Object { objChan := make(chan runtime.Object, 100) client.AddReactor("create", resource, func(action core.Action) (bool, runtime.Object, error) { createAction := action.(core.CreateAction) obj := createAction.GetObject() go func() { watcher.Add(obj) objChan <- copy(obj) }() return true, obj, nil }) return objChan }
// RegisterFakeWatch adds a new fake watcher for the specified resource in the given fake client. // All subsequent requests for a watch on the client will result in returning this fake watcher. func RegisterFakeWatch(resource string, client *core.Fake) *WatcherDispatcher { dispatcher := &WatcherDispatcher{ watchers: make([]*watch.RaceFreeFakeWatcher, 0), eventsSoFar: make([]*watch.Event, 0), } client.AddWatchReactor(resource, func(action core.Action) (bool, watch.Interface, error) { watcher := watch.NewRaceFreeFake() dispatcher.register(watcher) return true, watcher, nil }) return dispatcher }
// RegisterFakeCopyOnCreate registers a reactor in the given fake client that passes // all updated objects to the given watcher and also copies them to a channel for // in-test inspection. func RegisterFakeCopyOnUpdate(resource string, client *core.Fake, watcher *WatcherDispatcher) chan runtime.Object { objChan := make(chan runtime.Object, 100) client.AddReactor("update", resource, func(action core.Action) (bool, runtime.Object, error) { updateAction := action.(core.UpdateAction) obj := updateAction.GetObject() go func() { glog.V(4).Infof("Object updated. Writing to channel: %v", obj) watcher.Modify(obj) objChan <- copy(obj) }() return true, obj, nil }) return objChan }
// NewSimpleClientset returns a clientset that will respond with the provided objects. // It's backed by a very simple object tracker that processes creates, updates and deletions as-is, // without applying any validations and/or defaults. It shouldn't be considered a replacement // for a real clientset and is mostly useful in simple unit tests. func NewSimpleClientset(objects ...runtime.Object) *Clientset { o := core.NewObjectTracker(api.Scheme, api.Codecs.UniversalDecoder()) for _, obj := range objects { if err := o.Add(obj); err != nil { panic(err) } } fakePtr := core.Fake{} fakePtr.AddReactor("*", "*", core.ObjectReaction(o, api.Registry.RESTMapper())) fakePtr.AddWatchReactor("*", core.DefaultWatchReactor(watch.NewFake(), nil)) return &Clientset{fakePtr} }
// RegisterFakeCopyOnCreate registers a reactor in the given fake client that passes // all created objects to the given watcher and also copies them to a channel for // in-test inspection. func RegisterFakeCopyOnCreate(resource string, client *core.Fake, watcher *WatcherDispatcher) chan runtime.Object { objChan := make(chan runtime.Object, 100) client.AddReactor("create", resource, func(action core.Action) (bool, runtime.Object, error) { createAction := action.(core.CreateAction) originalObj := createAction.GetObject() // Create a copy of the object here to prevent data races while reading the object in go routine. obj := copy(originalObj) watcher.orderExecution <- func() { glog.V(4).Infof("Object created. Writing to channel: %v", obj) watcher.Add(obj) objChan <- obj } return true, originalObj, nil }) return objChan }
// RegisterFakeList registers a list response for the specified resource inside the given fake client. // The passed value will be returned with every list call. func RegisterFakeList(resource string, client *core.Fake, obj runtime.Object) { client.AddReactor("list", resource, func(action core.Action) (bool, runtime.Object, error) { return true, obj, nil }) }
func RegisterWatch(resource string, client *core.Fake) *watch.FakeWatcher { watcher := watch.NewFake() client.AddWatchReactor(resource, func(action core.Action) (bool, watch.Interface, error) { return true, watcher, nil }) return watcher }