Example #1
0
// Run runs the Queue component.
func (queue *Queue) Run() {
	l, err := pythia.Listen(pythia.QueueAddr)
	if err != nil {
		log.Fatal(err)
	}
	log.Println("Listening to", pythia.QueueAddr)
	closing := false
	master := make(chan queueMessage)
	queue.master = master
	go func() {
		<-queue.quit
		closing = true
		l.Close()
	}()
	queue.wg.Add(1)
	go queue.main(master)
	nextid := 0
	for {
		conn, err := l.Accept()
		if closing {
			break
		} else if err != nil {
			log.Print(err)
			continue
		}
		response := make(chan pythia.Message)
		client := &queueClient{
			Id:        nextid,
			Response:  response,
			Running:   make(map[string]*queueJob),
			Submitted: make(map[string]*queueJob),
		}
		master <- queueMessage{pythia.Message{Message: connectMsg}, client}
		queue.wg.Add(1)
		go queue.handle(conn, client, response)
		nextid++
	}
	master <- queueMessage{pythia.Message{Message: quitMsg}, nil}
	queue.wg.Wait()
}
Example #2
0
// Setup an environment for testing the Pool component.
// The pool capacity is configured with capacity. The test will fail if the pool
// does not register correctly.
func SetupPoolFixture(t *testing.T, capacity int) *PoolFixture {
	var err error
	f := new(PoolFixture)
	// Setup mock queue
	t.Log("Setup queue")
	addr, err := pythia.LocalAddr()
	if err != nil {
		t.Fatal(err)
	}
	pythia.QueueAddr = addr
	f.Queue, err = pythia.Listen(addr)
	if err != nil {
		t.Fatal(err)
	}
	// Setup pool
	t.Log("Setup pool")
	f.Pool = NewPool()
	f.Pool.Capacity = capacity
	f.Pool.UmlPath = pytest.UmlPath
	f.Pool.EnvDir = pytest.VmDir
	f.Pool.TasksDir = pytest.TasksDir
	go f.Pool.Run()
	// Establish connection
	t.Log("Establish connection")
	conn, err := f.Queue.Accept()
	if err != nil {
		f.Queue.Close()
		t.Fatal(err)
	}
	f.Conn = &pytest.Conn{t, conn}
	// Wait for register-pool message
	f.Conn.Expect(2, pythia.Message{
		Message:  pythia.RegisterPoolMsg,
		Capacity: capacity,
	})
	return f
}