コード例 #1
0
ファイル: crosscheck_test.go プロジェクト: daemonl/informer
func TestCrosscheck(t *testing.T) {

	r := reporter.GetRoot("Test")

	ports := []string{"55550", "55551", "55553"}

	allRemotes := make([]string, len(ports), len(ports))

	for i, port := range ports {
		allRemotes[i] = "http://localhost:" + port
	}

	// Should all succeed, with one elected host
	anyGotElected := false
	w := sync.WaitGroup{}
	for _, port := range ports {
		w.Add(1)
		go func(port string) {
			elected := Crosscheck(&CXConfig{
				Bind:    ":" + port,
				Remotes: allRemotes,
			}, "asdf", r.Spawn("Child %s", port))
			if elected {
				anyGotElected = true
			}
			w.Done()
		}(port)
	}
	w.Wait()
	if !anyGotElected {
		t.Log("No host was elected")
		t.Fail()
	}
	r.DumpReport()

	allRemotes = append(allRemotes, "http://10.10.10.10:5000")
	w = sync.WaitGroup{}
	for _, port := range ports {
		w.Add(1)
		go func(port string) {
			elected := Crosscheck(&CXConfig{
				Bind:     ":" + port,
				Remotes:  allRemotes,
				MaxTries: 1,
			}, "asdf", r.Spawn("Child %s", port))
			if !elected {
				t.Log("Host not elected on fail")
				t.Fail()
			}
			w.Done()
		}(port)
	}
	w.Wait()
	r.DumpReport()
}
コード例 #2
0
ファイル: informer.go プロジェクト: daemonl/informer
func main() {
	flag.Parse()

	core, err := loadConfig(configDir)
	if err != nil {
		fmt.Fprintln(os.Stderr, err.Error())
		os.Exit(1)
		return
	}

	if !solo && core.Crosscheck != nil {

		configHash, err := crosscheck.XmlHash(core)
		if err != nil {
			log.Printf("Couldn't encode config: %s\n", err.Error())
		}
		log.Printf("Config %s\n", configHash)
		r := reporter.GetRoot("Crosscheck")
		elected := crosscheck.Crosscheck(core.Crosscheck, configHash, r)
		r.DumpReport()
		if !dryRun {
			core.DoWarnings(r, &core.Admins)
		}
		if !elected {
			return
		}
	}

	list := map[string][]objects.Group{}

	for _, group := range core.Groups {
		// Matches "", which is 'unspecified'
		if runGroup == "all" || runGroup == group.RunGroup {
			_, ok := list[group.SyncGroup]
			if !ok {
				list[group.SyncGroup] = []objects.Group{}
			}
			list[group.SyncGroup] = append(list[group.SyncGroup], group)
		}
	}

	times := map[string]int64{}
	wg := sync.WaitGroup{}
	for name, sg := range list {
		//fmt.Printf("Run sync %s - %d groups\n", name, len(sg))
		wg.Add(1)
		go func(name string, sg []objects.Group) {
			defer wg.Done()
			start := time.Now().Unix()
			defer func() { times[name] = time.Now().Unix() - start }()
			for _, group := range sg {
				r := reporter.GetRoot(group.Name)
				r.ID = group.GetHash()
				for _, check := range group.Checks {
					err := check.RunCheck(r)
					if err != nil {
						r.AddError(err)
					}
				}
				r.DumpReport()
				if !dryRun {
					core.DoWarnings(r, &group.Informants)
				}
			}

		}(name, sg)
	}
	wg.Wait()

	for name, seconds := range times {
		fmt.Printf("%s took %d seconds\n", name, seconds)
	}

}