func TestHTTPconfig(t *testing.T) { lopts := nsqlookupd.NewOptions() lopts.Logger = newTestLogger(t) nsqlookupd.SetLogger(lopts) _, _, lookupd1 := mustStartNSQLookupd(lopts) defer lookupd1.Exit() _, _, lookupd2 := mustStartNSQLookupd(lopts) defer lookupd2.Exit() opts := nsqd.NewOptions() opts.Logger = newTestLogger(t) _, httpAddr, _, nsqdServer := mustStartNSQD(opts) defer os.RemoveAll(opts.DataPath) defer nsqdServer.Exit() url := fmt.Sprintf("http://%s/config/nsqlookupd_tcp_addresses", httpAddr) resp, err := http.Get(url) test.Equal(t, err, nil) defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) test.Equal(t, resp.StatusCode, 200) test.Equal(t, string(body), "[]") client := http.Client{} addrs := fmt.Sprintf(`["%s","%s"]`, lookupd1.RealTCPAddr().String(), lookupd2.RealTCPAddr().String()) url = fmt.Sprintf("http://%s/config/nsqlookupd_tcp_addresses", httpAddr) req, err := http.NewRequest("PUT", url, bytes.NewBuffer([]byte(addrs))) test.Equal(t, err, nil) resp, err = client.Do(req) test.Equal(t, err, nil) defer resp.Body.Close() body, _ = ioutil.ReadAll(resp.Body) test.Equal(t, resp.StatusCode, 200) test.Equal(t, string(body), addrs) }
func (p *program) Start() error { glog.InitWithFlag(flagSet) flagSet.Parse(os.Args[1:]) if *showVersion { fmt.Println(version.String("nsqlookupd")) os.Exit(0) } var cfg map[string]interface{} if *config != "" { _, err := toml.DecodeFile(*config, &cfg) if err != nil { log.Fatalf("ERROR: failed to load config file %s - %s", *config, err.Error()) } } opts := nsqlookupd.NewOptions() options.Resolve(opts, flagSet, cfg) if opts.LogDir != "" { glog.SetGLogDir(opts.LogDir) } nsqlookupd.SetLogger(opts) glog.StartWorker(time.Second * 2) daemon := nsqlookupd.New(opts) daemon.Main() p.nsqlookupd = daemon return nil }
func TestReconfigure(t *testing.T) { lopts := nsqlookupd.NewOptions() lopts.Logger = newTestLogger(t) nsqlookupd.SetLogger(lopts) _, _, lookupd1 := mustStartNSQLookupd(lopts) defer lookupd1.Exit() _, _, lookupd2 := mustStartNSQLookupd(lopts) defer lookupd2.Exit() _, _, lookupd3 := mustStartNSQLookupd(lopts) defer lookupd3.Exit() opts := nsqdNs.NewOptions() opts.Logger = newTestLogger(t) _, _, nsqd, nsqdServer := mustStartNSQD(opts) defer os.RemoveAll(opts.DataPath) defer nsqdServer.Exit() time.Sleep(50 * time.Millisecond) newOpts := *opts newOpts.NSQLookupdTCPAddresses = []string{lookupd1.RealTCPAddr().String()} nsqd.SwapOpts(&newOpts) nsqd.TriggerOptsNotification() test.Equal(t, len(nsqd.GetOpts().NSQLookupdTCPAddresses), 1) time.Sleep(50 * time.Millisecond) numLookupPeers := len(nsqdServer.lookupPeers.Load().([]*clusterinfo.LookupPeer)) test.Equal(t, numLookupPeers, 1) newOpts = *opts newOpts.NSQLookupdTCPAddresses = []string{lookupd2.RealTCPAddr().String(), lookupd3.RealTCPAddr().String()} nsqd.SwapOpts(&newOpts) nsqd.TriggerOptsNotification() test.Equal(t, len(nsqd.GetOpts().NSQLookupdTCPAddresses), 2) time.Sleep(50 * time.Millisecond) var lookupPeers []string for _, lp := range nsqdServer.lookupPeers.Load().([]*clusterinfo.LookupPeer) { lookupPeers = append(lookupPeers, lp.String()) } test.Equal(t, len(lookupPeers), 2) test.Equal(t, lookupPeers, newOpts.NSQLookupdTCPAddresses) }
func bootstrapNSQCluster(t *testing.T) (string, []*nsqd.NSQD, []*nsqdserver.NsqdServer, []*nsqlookupd.NSQLookupd, *NSQAdmin) { lgr := newTestLogger(t) nsqlookupdOpts := nsqlookupd.NewOptions() nsqlookupdOpts.TCPAddress = "127.0.0.1:0" nsqlookupdOpts.HTTPAddress = "127.0.0.1:0" nsqlookupdOpts.BroadcastAddress = "127.0.0.1" nsqlookupdOpts.Logger = lgr nsqlookupd.SetLogger(nsqlookupdOpts) nsqlookupd1 := nsqlookupd.New(nsqlookupdOpts) go nsqlookupd1.Main() // wait http server time.Sleep(time.Second) if nsqlookupd1.RealHTTPAddr().String() == "" { t.Fatal("lookupd should not empty") } nsqdOpts := nsqd.NewOptions() nsqdOpts.TCPAddress = "127.0.0.1:0" nsqdOpts.HTTPAddress = "127.0.0.1:0" nsqdOpts.BroadcastAddress = "127.0.0.1" nsqdOpts.NSQLookupdTCPAddresses = []string{nsqlookupd1.RealTCPAddr().String()} nsqdOpts.Logger = lgr tmpDir, err := ioutil.TempDir("", fmt.Sprintf("nsq-test-%d", time.Now().UnixNano())) if err != nil { panic(err) } nsqdOpts.DataPath = tmpDir nsqd1, nsqd1Server := nsqdserver.NewNsqdServer(nsqdOpts) go nsqd1Server.Main() t.Log("nsqd started") nsqadminOpts := NewOptions() nsqadminOpts.HTTPAddress = "127.0.0.1:0" nsqadminOpts.NSQLookupdHTTPAddresses = []string{nsqlookupd1.RealHTTPAddr().String()} nsqadminOpts.Logger = lgr nsqadmin1 := New(nsqadminOpts) go nsqadmin1.Main() time.Sleep(100 * time.Millisecond) return tmpDir, []*nsqd.NSQD{nsqd1}, []*nsqdserver.NsqdServer{nsqd1Server}, []*nsqlookupd.NSQLookupd{nsqlookupd1}, nsqadmin1 }
func TestCluster(t *testing.T) { lopts := nsqlookupd.NewOptions() lopts.Logger = newTestLogger(t) lopts.BroadcastAddress = "127.0.0.1" nsqlookupd.SetLogger(lopts) _, _, lookupd := mustStartNSQLookupd(lopts) opts := nsqdNs.NewOptions() opts.Logger = newTestLogger(t) opts.NSQLookupdTCPAddresses = []string{lookupd.RealTCPAddr().String()} opts.BroadcastAddress = "127.0.0.1" tcpAddr, httpAddr, nsqd, nsqdServer := mustStartNSQD(opts) defer os.RemoveAll(opts.DataPath) defer nsqdServer.Exit() topicName := "cluster_test" + strconv.Itoa(int(time.Now().Unix())) partitionStr := "0" hostname, err := os.Hostname() test.Equal(t, err, nil) nsqd.GetTopicIgnPart(topicName) url := fmt.Sprintf("http://%s/channel/create?topic=%s&channel=ch", httpAddr, topicName) _, err = http_api.NewClient(nil).POSTV1(url) test.Equal(t, err, nil) // allow some time for nsqd to push info to nsqlookupd time.Sleep(350 * time.Millisecond) endpoint := fmt.Sprintf("http://%s/debug", lookupd.RealHTTPAddr()) data, err := API(endpoint) test.Equal(t, err, nil) t.Logf("debug data: %v", data) topicData := data.Get("topic:" + topicName) producers, _ := topicData.Array() test.Equal(t, len(producers), 1) producer := topicData.GetIndex(0) test.Equal(t, producer.Get("hostname").MustString(), hostname) test.Equal(t, producer.Get("broadcast_address").MustString(), "127.0.0.1") test.Equal(t, producer.Get("tcp_port").MustInt(), tcpAddr.Port) test.Equal(t, producer.Get("tombstoned").MustBool(), false) channelData := data.Get("channel:" + topicName + ":" + partitionStr) producers, _ = channelData.Array() test.Equal(t, len(producers), 1) producer = topicData.GetIndex(0) test.Equal(t, producer.Get("hostname").MustString(), hostname) test.Equal(t, producer.Get("broadcast_address").MustString(), "127.0.0.1") test.Equal(t, producer.Get("tcp_port").MustInt(), tcpAddr.Port) test.Equal(t, producer.Get("tombstoned").MustBool(), false) endpoint = fmt.Sprintf("http://%s/lookup?topic=%s", lookupd.RealHTTPAddr(), topicName) data, err = API(endpoint) producers, _ = data.Get("producers").Array() test.Equal(t, len(producers), 1) producer = data.Get("producers").GetIndex(0) test.Equal(t, producer.Get("hostname").MustString(), hostname) test.Equal(t, producer.Get("broadcast_address").MustString(), "127.0.0.1") test.Equal(t, producer.Get("tcp_port").MustInt(), tcpAddr.Port) channels, _ := data.Get("channels").Array() test.Equal(t, len(channels), 1) channel := channels[0].(string) test.Equal(t, channel, "ch") nsqd.DeleteExistingTopic(topicName, 0) // allow some time for nsqd to push info to nsqlookupd time.Sleep(350 * time.Millisecond) endpoint = fmt.Sprintf("http://%s/lookup?topic=%s", lookupd.RealHTTPAddr(), topicName) data, err = API(endpoint) test.Equal(t, err, nil) producers, _ = data.Get("producers").Array() test.Equal(t, len(producers), 0) endpoint = fmt.Sprintf("http://%s/debug", lookupd.RealHTTPAddr()) data, err = API(endpoint) test.Equal(t, err, nil) producers, _ = data.Get("topic:" + topicName).Array() test.Equal(t, len(producers), 0) producers, _ = data.Get("channel:" + topicName + ":" + partitionStr).Array() test.Equal(t, len(producers), 0) }