func TestExecutorDriverError(t *testing.T) { setTestEnv(t) ch := make(chan bool, 2) // Mock Slave process to respond to registration event. server := testutil.NewMockSlaveHttpServer(t, func(rsp http.ResponseWriter, req *http.Request) { reqPath, err := url.QueryUnescape(req.URL.String()) assert.NoError(t, err) log.Infoln("RCVD request", reqPath) rsp.WriteHeader(http.StatusAccepted) }) exec := newTestExecutor(t) exec.ch = ch exec.t = t driver := newIntegrationTestDriver(t, exec) server.Close() // will cause error // Run() cause async message processing to start // Therefore, error-handling will be done via Executor.Error callaback. stat, err := driver.Run() assert.NoError(t, err) assert.Equal(t, mesos.Status_DRIVER_STOPPED, stat) select { case <-ch: case <-time.After(time.Second * 1): log.Errorf("Tired of waiting...") } }
func TestExecutorDriverRunTaskEvent(t *testing.T) { setTestEnv(t) ch := make(chan bool, 2) // Mock Slave process to respond to registration event. server := testutil.NewMockSlaveHttpServer(t, func(rsp http.ResponseWriter, req *http.Request) { reqPath, err := url.QueryUnescape(req.URL.String()) assert.NoError(t, err) log.Infoln("RCVD request", reqPath) rsp.WriteHeader(http.StatusAccepted) }) defer server.Close() exec := newTestExecutor(t) exec.ch = ch exec.t = t // start driver := newIntegrationTestDriver(t, exec) stat, err := driver.Start() assert.NoError(t, err) assert.Equal(t, mesos.Status_DRIVER_RUNNING, stat) driver.setConnected(true) defer driver.Stop() // send runtask event to driver pbMsg := &mesos.RunTaskMessage{ FrameworkId: util.NewFrameworkID(frameworkID), Framework: util.NewFrameworkInfo( "test", "test-framework-001", util.NewFrameworkID(frameworkID), ), Pid: proto.String(server.PID.String()), Task: util.NewTaskInfo( "test-task", util.NewTaskID("test-task-001"), util.NewSlaveID(slaveID), []*mesos.Resource{ util.NewScalarResource("mem", 112), util.NewScalarResource("cpus", 2), }, ), } c := testutil.NewMockMesosClient(t, server.PID) c.SendMessage(driver.self, pbMsg) select { case <-ch: case <-time.After(time.Second * 2): log.Errorf("Tired of waiting...") } }
func TestExecutorDriverReconnectEvent(t *testing.T) { setTestEnv(t) ch := make(chan bool, 2) // Mock Slave process to respond to registration event. server := testutil.NewMockSlaveHttpServer(t, func(rsp http.ResponseWriter, req *http.Request) { reqPath, err := url.QueryUnescape(req.URL.String()) assert.NoError(t, err) log.Infoln("RCVD request", reqPath) // exec registration request if strings.Contains(reqPath, "RegisterExecutorMessage") { log.Infoln("Got Executor registration request") } if strings.Contains(reqPath, "ReregisterExecutorMessage") { log.Infoln("Got Executor Re-registration request") ch <- true } rsp.WriteHeader(http.StatusAccepted) }) defer server.Close() exec := newTestExecutor(t) exec.t = t // start driver := newIntegrationTestDriver(t, exec) stat, err := driver.Start() assert.NoError(t, err) assert.Equal(t, mesos.Status_DRIVER_RUNNING, stat) driver.setConnected(true) defer driver.Stop() // send "reconnect" event to driver pbMsg := &mesos.ReconnectExecutorMessage{ SlaveId: util.NewSlaveID(slaveID), } c := testutil.NewMockMesosClient(t, server.PID) c.SendMessage(driver.self, pbMsg) select { case <-ch: case <-time.After(time.Second * 2): log.Errorf("Tired of waiting...") } }
func TestExecutorDriverRegisterExecutorMessage(t *testing.T) { setTestEnv(t) ch := make(chan bool, 2) server := testutil.NewMockSlaveHttpServer(t, func(rsp http.ResponseWriter, req *http.Request) { reqPath, err := url.QueryUnescape(req.URL.String()) assert.NoError(t, err) log.Infoln("RCVD request", reqPath) data, err := ioutil.ReadAll(req.Body) if err != nil { t.Fatalf("Missing RegisteredExecutor data from scheduler.") } defer req.Body.Close() message := new(mesos.RegisterExecutorMessage) err = proto.Unmarshal(data, message) assert.NoError(t, err) assert.Equal(t, frameworkID, message.GetFrameworkId().GetValue()) assert.Equal(t, executorID, message.GetExecutorId().GetValue()) ch <- true rsp.WriteHeader(http.StatusAccepted) }) defer server.Close() exec := newTestExecutor(t) exec.ch = ch driver := newIntegrationTestDriver(t, exec) assert.False(t, driver.Running()) stat, err := driver.Start() assert.NoError(t, err) assert.True(t, driver.Running()) assert.Equal(t, mesos.Status_DRIVER_RUNNING, stat) select { case <-ch: case <-time.After(time.Second * 1): log.Errorf("Tired of waiting...") } }
func TestExecutorDriverFrameworkToExecutorMessageEvent(t *testing.T) { setTestEnv(t) ch := make(chan bool, 2) // Mock Slave process to respond to registration event. server := testutil.NewMockSlaveHttpServer(t, func(rsp http.ResponseWriter, req *http.Request) { reqPath, err := url.QueryUnescape(req.URL.String()) assert.NoError(t, err) log.Infoln("RCVD request", reqPath) rsp.WriteHeader(http.StatusAccepted) }) defer server.Close() exec := newTestExecutor(t) exec.ch = ch exec.t = t // start driver := newIntegrationTestDriver(t, exec) stat, err := driver.Start() assert.NoError(t, err) assert.Equal(t, mesos.Status_DRIVER_RUNNING, stat) driver.setConnected(true) defer driver.Stop() // send runtask event to driver pbMsg := &mesos.FrameworkToExecutorMessage{ SlaveId: util.NewSlaveID(slaveID), ExecutorId: util.NewExecutorID(executorID), FrameworkId: util.NewFrameworkID(frameworkID), Data: []byte("Hello-Test"), } c := testutil.NewMockMesosClient(t, server.PID) c.SendMessage(driver.self, pbMsg) select { case <-ch: case <-time.After(time.Second * 1): log.Errorf("Tired of waiting...") } }
func TestExecutorDriverExecutorRegisteredEvent(t *testing.T) { setTestEnv(t) ch := make(chan bool, 2) // Mock Slave process to respond to registration event. server := testutil.NewMockSlaveHttpServer(t, func(rsp http.ResponseWriter, req *http.Request) { reqPath, err := url.QueryUnescape(req.URL.String()) assert.NoError(t, err) log.Infoln("RCVD request", reqPath) rsp.WriteHeader(http.StatusAccepted) }) defer server.Close() exec := newTestExecutor(t) exec.ch = ch exec.t = t // start driver := newIntegrationTestDriver(t, exec) stat, err := driver.Start() assert.NoError(t, err) assert.Equal(t, mesos.Status_DRIVER_RUNNING, stat) defer driver.Stop() //simulate sending ExecutorRegisteredMessage from server to exec pid. pbMsg := &mesos.ExecutorRegisteredMessage{ ExecutorInfo: util.NewExecutorInfo(util.NewExecutorID(executorID), util.NewCommandInfo("ls -l")), FrameworkId: util.NewFrameworkID(frameworkID), FrameworkInfo: util.NewFrameworkInfo("test", "test-framework", util.NewFrameworkID(frameworkID)), SlaveId: util.NewSlaveID(slaveID), SlaveInfo: &mesos.SlaveInfo{Hostname: proto.String("localhost")}, } c := testutil.NewMockMesosClient(t, server.PID) connected := driver.connectionListener() c.SendMessage(driver.self, pbMsg) select { case <-connected: case <-time.After(time.Second * 1): log.Errorf("Tired of waiting...") } }
func TestExecutorDriverShutdownEvent(t *testing.T) { setTestEnv(t) ch := make(chan bool, 2) // Mock Slave process to respond to registration event. server := testutil.NewMockSlaveHttpServer(t, func(rsp http.ResponseWriter, req *http.Request) { reqPath, err := url.QueryUnescape(req.URL.String()) assert.NoError(t, err) log.Infoln("RCVD request", reqPath) rsp.WriteHeader(http.StatusAccepted) }) defer server.Close() exec := newTestExecutor(t) exec.ch = ch exec.t = t // start driver := newIntegrationTestDriver(t, exec) stat, err := driver.Start() assert.NoError(t, err) assert.Equal(t, mesos.Status_DRIVER_RUNNING, stat) driver.setConnected(true) // send runtask event to driver pbMsg := &mesos.ShutdownExecutorMessage{} c := testutil.NewMockMesosClient(t, server.PID) c.SendMessage(driver.self, pbMsg) select { case <-ch: case <-time.After(time.Second * 5): log.Errorf("Tired of waiting...") } <-time.After(time.Second * 1) // wait for shutdown to finish. assert.Equal(t, mesos.Status_DRIVER_STOPPED, driver.Status()) }
func TestExecutorDriverStatusUpdateAcknowledgement(t *testing.T) { setTestEnv(t) ch := make(chan bool, 2) // Mock Slave process to respond to registration event. server := testutil.NewMockSlaveHttpServer(t, func(rsp http.ResponseWriter, req *http.Request) { reqPath, err := url.QueryUnescape(req.URL.String()) assert.NoError(t, err) log.Infoln("RCVD request", reqPath) rsp.WriteHeader(http.StatusAccepted) }) defer server.Close() exec := newTestExecutor(t) exec.ch = ch exec.t = t // start driver := newIntegrationTestDriver(t, exec) stat, err := driver.Start() assert.NoError(t, err) assert.Equal(t, mesos.Status_DRIVER_RUNNING, stat) driver.setConnected(true) defer driver.Stop() // send ACK from server pbMsg := &mesos.StatusUpdateAcknowledgementMessage{ SlaveId: util.NewSlaveID(slaveID), FrameworkId: util.NewFrameworkID(frameworkID), TaskId: util.NewTaskID("test-task-001"), Uuid: []byte(uuid.NewRandom().String()), } c := testutil.NewMockMesosClient(t, server.PID) c.SendMessage(driver.self, pbMsg) <-time.After(time.Second * 1) }