func taskURI(host string, t core.Task) string { return fmt.Sprintf("%s://%s/v1/tasks/%s", protocolPrefix, host, t.ID()) }
func AddSchedulerTaskFromTask(t core.Task) *AddScheduledTask { st := &AddScheduledTask{ ID: t.ID(), Name: t.GetName(), Deadline: t.DeadlineDuration().String(), CreationTimestamp: t.CreationTime().Unix(), LastRunTimestamp: t.LastRunTime().Unix(), HitCount: int(t.HitCount()), MissCount: int(t.MissedCount()), FailedCount: int(t.FailedCount()), LastFailureMessage: t.LastFailureMessage(), State: t.State().String(), Workflow: t.WMap(), } assertSchedule(t.Schedule(), st) if st.LastRunTimestamp < 0 { st.LastRunTimestamp = -1 } return st }
func TestDistributedWorkflow(t *testing.T) { Convey("Create a scheduler with 2 controls and load plugins", t, func() { l, _ := net.Listen("tcp", ":0") l.Close() cfg := control.GetDefaultConfig() cfg.ListenPort = l.Addr().(*net.TCPAddr).Port c1 := control.New(cfg) c1.Start() m, _ := net.Listen("tcp", ":0") m.Close() cfg.ListenPort = m.Addr().(*net.TCPAddr).Port port1 := cfg.ListenPort c2 := control.New(cfg) schcfg := GetDefaultConfig() sch := New(schcfg) c2.Start() sch.SetMetricManager(c1) err := sch.Start() So(err, ShouldBeNil) // Load appropriate plugins into each control. mock2Path := path.Join(PluginPath, "snap-collector-mock2") passthruPath := path.Join(PluginPath, "snap-processor-passthru") filePath := path.Join(PluginPath, "snap-publisher-file") // mock2 and file onto c1 rp, err := core.NewRequestedPlugin(mock2Path) So(err, ShouldBeNil) _, err = c1.Load(rp) So(err, ShouldBeNil) rp, err = core.NewRequestedPlugin(filePath) So(err, ShouldBeNil) _, err = c1.Load(rp) So(err, ShouldBeNil) // passthru on c2 rp, err = core.NewRequestedPlugin(passthruPath) So(err, ShouldBeNil) passthru, err := c2.Load(rp) So(err, ShouldBeNil) Convey("Test task with one local and one remote node", func() { //Create a task //Create a workflowmap wf := dsWFMap(port1) t, errs := sch.CreateTask(schedule.NewSimpleSchedule(time.Second), wf, true) So(len(errs.Errors()), ShouldEqual, 0) So(t, ShouldNotBeNil) }) Convey("Test task with invalid remote port", func() { wf := dsWFMap(0) controlproxy.MAX_CONNECTION_TIMEOUT = 1 * time.Second t, errs := sch.CreateTask(schedule.NewSimpleSchedule(time.Second), wf, true) So(len(errs.Errors()), ShouldEqual, 1) So(t, ShouldBeNil) }) Convey("Test task without remote plugin", func() { _, err := c2.Unload(passthru) So(err, ShouldBeNil) wf := dsWFMap(port1) t, errs := sch.CreateTask(schedule.NewSimpleSchedule(time.Second), wf, true) So(len(errs.Errors()), ShouldEqual, 1) So(t, ShouldBeNil) }) Convey("Test task failing when control is stopped while task is running", func() { wf := dsWFMap(port1) controlproxy.MAX_CONNECTION_TIMEOUT = 10 * time.Second interval := time.Millisecond * 100 t, errs := sch.CreateTask(schedule.NewSimpleSchedule(interval), wf, true) So(len(errs.Errors()), ShouldEqual, 0) So(t, ShouldNotBeNil) c2.Stop() // Give task time to fail time.Sleep(time.Second) tasks := sch.GetTasks() var task core.Task for _, v := range tasks { task = v } So(task.State(), ShouldEqual, core.TaskDisabled) }) }) }