Files
fx-serverless/handlers/init.go
Minghe 58f416b7b2 support custom cluster setup by k3s (#359)
* support custom cluster setup by k3s
* clean up
* fix lint issue
2019-11-17 10:50:55 +08:00

93 lines
2.2 KiB
Go

package handlers
import (
"fmt"
"os"
"strings"
"sync"
"github.com/apex/log"
"github.com/metrue/fx/context"
"github.com/metrue/fx/pkg/command"
"github.com/metrue/fx/pkg/spinner"
"github.com/metrue/fx/provision"
"github.com/pkg/errors"
)
func setup(host string, user string, script string) (err error) {
task := fmt.Sprintf("setup %s@%s", user, host)
spinner.Start(task)
defer func() {
spinner.Stop(task, err)
}()
runner := command.NewLocalRunner()
cmd := command.New(task,
script, // TODO install k3sup first
runner,
)
if output, err := cmd.Exec(); err != nil {
msg := fmt.Sprintf("%s: %s", task, string(output))
return errors.Wrapf(err, msg)
}
return nil
}
// Init start fx-agent
func Init() HandleFunc {
return func(ctx *context.Context) (err error) {
const task = "init"
spinner.Start(task)
defer func() {
spinner.Stop(task, err)
}()
cli := ctx.GetCliContext()
master := cli.String("master")
// TODO support different user on master and node
acount := cli.String("user")
agents := strings.Split(cli.String("agents"), ",")
if acount == "" {
acount = "root"
}
if master != "" {
// TODO install k3sup first
script := fmt.Sprintf("k3sup install --ip %s --user %s", master, acount)
if err := setup(master, acount, script); err != nil {
return err
}
}
if master != "" && len(agents) > 0 {
var wg sync.WaitGroup
for _, agent := range agents {
wg.Add(1)
go func(host string) {
script := fmt.Sprintf("k3sup join --ip %s --server-ip %s --user %s", host, master, acount)
if err := setup(host, acount, script); err != nil {
fmt.Println("setup agent error: ", err)
}
wg.Done()
}(agent) //nolint
}
wg.Wait()
}
host := os.Getenv("DOCKER_REMOTE_HOST_ADDR")
user := os.Getenv("DOCKER_REMOTE_HOST_USER")
passord := os.Getenv("DOCKER_REMOTE_HOST_PASSWORD")
if host == "" {
host = "127.0.0.1"
}
provisioner := provision.NewWithHost(host, user, passord)
if !provisioner.IsFxAgentRunning() {
if err := provisioner.StartFxAgent(); err != nil {
log.Fatalf("could not start fx agent on host: %s", err)
return err
}
log.Info("fx agent started")
}
log.Info("fx agent already started")
return nil
}
}