2015-03-18 13:21:32 +00:00
|
|
|
package init
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
"syscall"
|
|
|
|
|
2015-07-21 15:43:20 +00:00
|
|
|
"fmt"
|
2015-07-29 07:51:49 +00:00
|
|
|
"strings"
|
|
|
|
|
2015-03-18 13:21:32 +00:00
|
|
|
log "github.com/Sirupsen/logrus"
|
2015-07-29 07:51:49 +00:00
|
|
|
"github.com/rancher/docker-from-scratch"
|
2015-03-18 13:21:32 +00:00
|
|
|
"github.com/rancherio/os/config"
|
2015-04-16 05:57:59 +00:00
|
|
|
"github.com/rancherio/os/docker"
|
2015-03-18 13:21:32 +00:00
|
|
|
"github.com/rancherio/os/util"
|
2015-05-05 20:36:52 +00:00
|
|
|
"github.com/rancherio/rancher-compose/librcompose/project"
|
2015-03-18 13:21:32 +00:00
|
|
|
)
|
|
|
|
|
2015-07-29 06:52:15 +00:00
|
|
|
func autoformat(cfg *config.CloudConfig) error {
|
|
|
|
if len(cfg.Rancher.State.Autoformat) == 0 || util.ResolveDevice(cfg.Rancher.State.Dev) != "" {
|
2015-03-18 13:21:32 +00:00
|
|
|
return nil
|
|
|
|
}
|
2015-07-29 06:52:15 +00:00
|
|
|
AUTOFORMAT := "AUTOFORMAT=" + strings.Join(cfg.Rancher.State.Autoformat, " ")
|
|
|
|
FORMATZERO := "FORMATZERO=" + fmt.Sprint(cfg.Rancher.State.FormatZero)
|
|
|
|
cfg.Rancher.Autoformat["autoformat"].Environment = project.NewMaporEqualSlice([]string{AUTOFORMAT, FORMATZERO})
|
2015-07-22 14:18:43 +00:00
|
|
|
log.Info("Running Autoformat services")
|
2015-07-29 06:52:15 +00:00
|
|
|
err := docker.RunServices("autoformat", cfg, cfg.Rancher.Autoformat)
|
2015-07-21 15:43:20 +00:00
|
|
|
return err
|
2015-03-18 13:21:32 +00:00
|
|
|
}
|
|
|
|
|
2015-07-29 06:52:15 +00:00
|
|
|
func runBootstrapContainers(cfg *config.CloudConfig) error {
|
2015-07-22 14:18:43 +00:00
|
|
|
log.Info("Running Bootstrap services")
|
2015-07-29 06:52:15 +00:00
|
|
|
return docker.RunServices("bootstrap", cfg, cfg.Rancher.BootstrapContainers)
|
2015-03-18 13:21:32 +00:00
|
|
|
}
|
|
|
|
|
2015-07-29 07:51:49 +00:00
|
|
|
func startDocker(cfg *config.Config) (chan interface{}, error) {
|
2015-03-18 13:21:32 +00:00
|
|
|
|
2015-07-29 07:51:49 +00:00
|
|
|
launchConfig, args := getLaunchConfig(cfg, &cfg.Rancher.BootstrapDocker)
|
|
|
|
launchConfig.Fork = true
|
|
|
|
launchConfig.LogFile = ""
|
|
|
|
launchConfig.NoLog = true
|
|
|
|
|
|
|
|
cmd, err := dockerlaunch.LaunchDocker(launchConfig, config.DOCKER_BIN, args...)
|
2015-03-18 13:21:32 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
c := make(chan interface{})
|
|
|
|
go func() {
|
|
|
|
<-c
|
|
|
|
cmd.Process.Signal(syscall.SIGTERM)
|
|
|
|
cmd.Wait()
|
|
|
|
c <- struct{}{}
|
|
|
|
}()
|
|
|
|
|
|
|
|
return c, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func stopDocker(c chan interface{}) error {
|
|
|
|
c <- struct{}{}
|
|
|
|
<-c
|
|
|
|
|
|
|
|
return os.RemoveAll(config.DOCKER_SYSTEM_HOME)
|
|
|
|
}
|
|
|
|
|
2015-07-29 06:52:15 +00:00
|
|
|
func bootstrap(cfg *config.CloudConfig) error {
|
2015-07-22 14:18:43 +00:00
|
|
|
log.Info("Launching Bootstrap Docker")
|
2015-03-18 13:21:32 +00:00
|
|
|
c, err := startDocker(cfg)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
initFuncs := []config.InitFunc{
|
|
|
|
loadImages,
|
|
|
|
runBootstrapContainers,
|
|
|
|
autoformat,
|
|
|
|
}
|
|
|
|
|
|
|
|
defer stopDocker(c)
|
|
|
|
|
|
|
|
return config.RunInitFuncs(cfg, initFuncs)
|
|
|
|
}
|