func testWatchServices(s store.Store, t *testing.T) { check := func(opts store.QueryServiceOptions, body func(w *watcher), changes ...data.ServiceChange) { w := newWatcher(s, opts) body(w) // Yuck. There's a race between making a change in // etcd, and hearing about it via the watch, and I // haven't found a nicer way to avoid it. time.Sleep(100 * time.Millisecond) w.stop() require.Equal(t, changes, w.changes) require.Nil(t, s.RemoveAllServices()) } check(store.QueryServiceOptions{}, func(w *watcher) { require.Nil(t, s.AddService("svc", testService)) }, data.ServiceChange{"svc", false}) require.Nil(t, s.AddService("svc", testService)) check(store.QueryServiceOptions{}, func(w *watcher) { require.Nil(t, s.RemoveAllServices()) require.Nil(t, s.AddService("svc", testService)) require.Nil(t, s.RemoveService("svc")) }, data.ServiceChange{"svc", true}, data.ServiceChange{"svc", false}, data.ServiceChange{"svc", true}) // WithInstances false, so adding an instance should not // cause an event require.Nil(t, s.AddService("svc", testService)) check(store.QueryServiceOptions{}, func(w *watcher) { require.Nil(t, s.AddInstance("svc", "inst", testInst)) }) // WithInstances true, so instance changes should // cause events require.Nil(t, s.AddService("svc", testService)) check(store.QueryServiceOptions{WithInstances: true}, func(w *watcher) { require.Nil(t, s.AddInstance("svc", "inst", testInst)) require.Nil(t, s.RemoveInstance("svc", "inst")) }, data.ServiceChange{"svc", false}, data.ServiceChange{"svc", false}) // WithContainerRules false, so adding a rule should not // cause an event require.Nil(t, s.AddService("svc", testService)) check(store.QueryServiceOptions{}, func(w *watcher) { require.Nil(t, s.SetContainerRule("svc", "group", testRule)) }) // WithContainerRules true, so instance changes should // cause events require.Nil(t, s.AddService("svc", testService)) check(store.QueryServiceOptions{WithContainerRules: true}, func(w *watcher) { require.Nil(t, s.SetContainerRule("svc", "group", testRule)) require.Nil(t, s.RemoveContainerRule("svc", "group")) }, data.ServiceChange{"svc", false}, data.ServiceChange{"svc", false}) }
func testRules(s store.Store, t *testing.T) { require.Nil(t, s.AddService("svc", testService)) require.Nil(t, s.SetContainerRule("svc", "group", testRule)) svc, err := s.GetService("svc", store.QueryServiceOptions{WithContainerRules: true}) require.Nil(t, err) require.Equal(t, []store.ContainerRuleInfo{ store.ContainerRuleInfo{ Name: "group", ContainerRule: testRule, }, }, svc.ContainerRules) require.Nil(t, s.RemoveContainerRule("svc", "group")) svc, err = s.GetService("svc", store.QueryServiceOptions{WithContainerRules: true}) require.Nil(t, err) require.Empty(t, svc.ContainerRules) }