func (s *Discovery) fetch() (discovery.Entries, error) { fileContent, err := ioutil.ReadFile(s.path) if err != nil { return nil, fmt.Errorf("failed to read '%s': %v", s.path, err) } return discovery.CreateEntries(parseFileContent(fileContent)) }
// Watch the store until either there's a store error or we receive a stop request. // Returns false if we shouldn't attempt watching the store anymore (stop request received). func (s *Discovery) watchOnce(stopCh <-chan struct{}, watchCh <-chan []*store.KVPair, discoveryCh chan discovery.Entries, errCh chan error) bool { for { select { case pairs := <-watchCh: if pairs == nil { return true } logrus.WithField("discovery", s.backend).Debugf("Watch triggered with %d nodes", len(pairs)) // Convert `KVPair` into `discovery.Entry`. addrs := make([]string, len(pairs)) for _, pair := range pairs { addrs = append(addrs, string(pair.Value)) } entries, err := discovery.CreateEntries(addrs) if err != nil { errCh <- err } else { discoveryCh <- entries } case <-stopCh: // We were requested to stop watching. return false } } }
// Fetch returns the list of entries for the discovery service at the specified endpoint func (s *Discovery) fetch() (discovery.Entries, error) { resp, err := http.Get(fmt.Sprintf("%s/%s/%s", s.url, "clusters", s.token)) if err != nil { return nil, err } defer resp.Body.Close() var addrs []string if resp.StatusCode == http.StatusOK { if err := json.NewDecoder(resp.Body).Decode(&addrs); err != nil { return nil, fmt.Errorf("Failed to decode response: %v", err) } } else { return nil, fmt.Errorf("Failed to fetch entries, Discovery service returned %d HTTP status code", resp.StatusCode) } return discovery.CreateEntries(addrs) }
func TestRegister(t *testing.T) { d := &Discovery{token: "TEST_TOKEN", url: discoveryURL, heartbeat: 1} expected := "127.0.0.1:2675" expectedEntries, err := discovery.CreateEntries([]string{expected}) assert.NoError(t, err) // Register assert.NoError(t, d.Register(expected)) // Watch ch, errCh := d.Watch(nil) select { case entries := <-ch: assert.True(t, entries.Equals(expectedEntries)) case err := <-errCh: t.Fatal(err) case <-time.After(5 * time.Second): t.Fatal("Timed out") } assert.NoError(t, d.Register(expected)) }