Exemplo n.º 1
0
func RunTentacularOnDroplets(master *godo.Droplet, slaves []godo.Droplet,
	runMaster, runSlaves bool, args string) (err error) {

	nodeCount := 0
	if runMaster {
		nodeCount++
	}
	if runSlaves {
		nodeCount += len(slaves)
	}
	doneChan := make(chan error, nodeCount)

	if runMaster {
		go func() {
			err = RunTentacularMaster(master, args)
			doneChan <- err
		}()
	}

	if runSlaves {
		if len(slaves) == 0 {
			return errors.New("No slave nodes available.")
		}

		masterPrivAddr, err := master.PrivateIPv4()
		if err != nil {
			err = errors.Wrap(err, "")
			return err
		}

		slaveCommand := fmt.Sprintf(RUN_PROXY_SLAVE, masterPrivAddr)

		log.Print("Running command on slaves: " + slaveCommand)

		for _, slave := range slaves {

			slaveAddr, err := slave.PublicIPv4()
			if err != nil {
				fmt.Errorf("slave address could not be obtained. ignoring")
				continue
			}

			go func() {
				log.Println("running slave proxy at " + slaveAddr)
				reString, err := RunRemoteCommand(slaveAddr, setupCmd(slaveCommand, args))
				log.Println("slave terminated with output " + reString)
				if err != nil {
					log.Println("slave terminated with error.")
					log.Println(err)
				}
				doneChan <- err
			}()
		}
	}

	log.Println("waiting for procs to finish..")
	for i := 0; i < nodeCount; i++ {
		<-doneChan
	}

	return nil
}