// getRunWait returns either the command-line value or the value from the runconfig // file func getRunWait(rc platform.RunConfig) int { rcWait, err := rc.GetInt("runwait") if err == nil { return rcWait } return runWait }
// RunTest a single test - takes a test-file as a string that will be copied // to the deterlab-server func RunTest(rc platform.RunConfig) (*monitor.Stats, error) { done := make(chan struct{}) CheckHosts(rc) rc.Delete("simulation") rs := monitor.NewStats(rc.Map(), "hosts", "bf") monitor := monitor.NewMonitor(rs) if err := deployP.Deploy(rc); err != nil { log.Error(err) return rs, err } monitor.SinkPort = monitorPort if err := deployP.Cleanup(); err != nil { log.Error(err) return rs, err } monitor.SinkPort = monitorPort go func() { if err := monitor.Listen(); err != nil { log.Fatal("Could not monitor.Listen():", err) } }() // Start monitor before so ssh tunnel can connect to the monitor // in case of deterlab. err := deployP.Start() if err != nil { log.Error(err) return rs, err } go func() { var err error if err = deployP.Wait(); err != nil { log.Lvl3("Test failed:", err) if err := deployP.Cleanup(); err != nil { log.Lvl3("Couldn't cleanup platform:", err) } done <- struct{}{} } log.Lvl3("Test complete:", rs) done <- struct{}{} }() timeOut := getRunWait(rc) // can timeout the command if it takes too long select { case <-done: monitor.Stop() return rs, nil case <-time.After(time.Second * time.Duration(timeOut)): monitor.Stop() return rs, errors.New("Simulation timeout") } }
// CheckHosts verifies that there is either a 'Hosts' or a 'Depth/BF' // -parameter in the Runconfig func CheckHosts(rc platform.RunConfig) { hosts, _ := rc.GetInt("hosts") bf, _ := rc.GetInt("bf") depth, _ := rc.GetInt("depth") if hosts == 0 { if depth == 0 || bf == 0 { log.Fatal("No Hosts and no Depth or BF given - stopping") } hosts = calcHosts(bf, depth) rc.Put("hosts", strconv.Itoa(hosts)) } if bf == 0 { if depth == 0 || hosts == 0 { log.Fatal("No BF and no Depth or hosts given - stopping") } bf = 2 for calcHosts(bf, depth) < hosts { bf++ } rc.Put("bf", strconv.Itoa(bf)) } if depth == 0 { depth = 1 for calcHosts(bf, depth) < hosts { depth++ } rc.Put("depth", strconv.Itoa(depth)) } }