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 addGroup(st store.Store, serviceName string, addr *data.AddressSpec, labels ...string) { if len(labels)%2 != 0 { panic("Expected key value ... as arguments") } sel := make(map[string]string) for i := 0; i < len(labels); i += 2 { sel[labels[i]] = labels[i+1] } if addr == nil { addr = &data.AddressSpec{"fixed", 80} } st.SetContainerRule(serviceName, GROUP, data.ContainerRule{*addr, sel}) }
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) }