diff --git a/cmd/control/bootstrap.go b/cmd/control/bootstrap.go index 7d322567..35f0405f 100644 --- a/cmd/control/bootstrap.go +++ b/cmd/control/bootstrap.go @@ -15,12 +15,15 @@ import ( ) func bootstrapAction(c *cli.Context) error { + log.Debugf("bootstrapAction") if err := UdevSettle(); err != nil { log.Errorf("Failed to run udev settle: %v", err) } + log.Debugf("bootstrapAction: loadingConfig") cfg := config.LoadConfig() + log.Debugf("bootstrapAction: MdadmScan(%v)", cfg.Rancher.State.MdadmScan) if cfg.Rancher.State.MdadmScan { if err := mdadmScan(); err != nil { log.Errorf("Failed to run mdadm scan: %v", err) @@ -28,12 +31,14 @@ func bootstrapAction(c *cli.Context) error { } stateScript := cfg.Rancher.State.Script + log.Debugf("bootstrapAction: stateScript(%v)", stateScript) if stateScript != "" { if err := runStateScript(stateScript); err != nil { log.Errorf("Failed to run state script: %v", err) } } + log.Debugf("bootstrapAction: RunCommandSequence(%v)", cfg.Bootcmd) util.RunCommandSequence(cfg.Bootcmd) if cfg.Rancher.State.Dev != "" && cfg.Rancher.State.Wait { @@ -41,12 +46,14 @@ func bootstrapAction(c *cli.Context) error { } autoformatDevices := cfg.Rancher.State.Autoformat + log.Debugf("bootstrapAction: Autoformat(%v)", cfg.Rancher.State.Autoformat) if len(autoformatDevices) > 0 { if err := autoformat(autoformatDevices); err != nil { log.Errorf("Failed to run autoformat: %v", err) } } + log.Debugf("bootstrapAction: udev settle2") if err := UdevSettle(); err != nil { log.Errorf("Failed to run udev settle: %v", err) } diff --git a/config/disk.go b/config/disk.go index c5a9ebf2..a1de8b36 100644 --- a/config/disk.go +++ b/config/disk.go @@ -4,6 +4,7 @@ import ( "io/ioutil" "os" "path" + "path/filepath" "sort" "strings" @@ -171,7 +172,7 @@ func readCmdline() map[interface{}]interface{} { return nil } - log.Debugf("Config cmdline %s", cmdLine) + //log.Debugf("Config cmdline %s", cmdLine) cmdLineObj := parseCmdline(strings.TrimSpace(util.UnescapeKernelParams(string(cmdLine)))) @@ -219,6 +220,10 @@ func WriteToFile(data interface{}, filename string) error { return err } + if err := os.MkdirAll(filepath.Dir(filename), os.ModeDir|0755); err != nil { + return err + } + return util.WriteFileAtomic(filename, content, 400) } diff --git a/init/bootstrap.go b/init/bootstrap.go index 1c5a0e4a..a171cc0b 100644 --- a/init/bootstrap.go +++ b/init/bootstrap.go @@ -12,6 +12,8 @@ import ( func bootstrapServices(cfg *config.CloudConfig) (*config.CloudConfig, error) { if util.ResolveDevice(cfg.Rancher.State.Dev) != "" && len(cfg.Bootcmd) == 0 { + log.Info("NOT Running Bootstrap") + return cfg, nil } log.Info("Running Bootstrap") @@ -56,6 +58,8 @@ func stopDocker(c chan interface{}) error { func bootstrap(cfg *config.CloudConfig) error { log.Info("Launching Bootstrap Docker") + log.Infof("bootstrap container: Autoformat(%v)", cfg.Rancher.State.Autoformat) + c, err := startDocker(cfg) if err != nil { return err diff --git a/init/init.go b/init/init.go index 4888713e..23bd27b4 100644 --- a/init/init.go +++ b/init/init.go @@ -267,7 +267,17 @@ func RunInit() error { } } - return cfg, nil + // save here so the bootstrap service can see it (when booting from iso, its very early) + if boot2DockerEnvironment { + if err := config.Set("rancher.state.dev", cfg.Rancher.State.Dev); err != nil { + log.Errorf("Failed to update rancher.state.dev: %v", err) + } + if err := config.Set("rancher.state.autoformat", cfg.Rancher.State.Autoformat); err != nil { + log.Errorf("Failed to update rancher.state.autoformat: %v", err) + } + } + + return config.LoadConfig(), nil }, func(cfg *config.CloudConfig) (*config.CloudConfig, error) { var err error @@ -278,9 +288,6 @@ func RunInit() error { return cfg, nil }, func(cfg *config.CloudConfig) (*config.CloudConfig, error) { - if err := os.MkdirAll(config.CloudConfigDir, os.ModeDir|0755); err != nil { - log.Error(err) - } cfg.Rancher.CloudInit.Datasources = config.LoadConfigWithPrefix(state).Rancher.CloudInit.Datasources if err := config.Set("rancher.cloud_init.datasources", cfg.Rancher.CloudInit.Datasources); err != nil { diff --git a/os-config.tpl.yml b/os-config.tpl.yml index 16229f20..e0f4fc7f 100644 --- a/os-config.tpl.yml +++ b/os-config.tpl.yml @@ -32,6 +32,7 @@ rancher: - /lib/firmware:/lib/firmware - /usr/bin/ros:/usr/bin/ros:ro - /usr/share/ros:/usr/share/ros:ro + - /var/lib/rancher:/var/lib/rancher:ro cloud_init_services: cloud-init: image: {{.OS_REPO}}/os-base:{{.VERSION}}{{.SUFFIX}} diff --git a/tests/boot2docker_autoformat_test.go b/tests/boot2docker_autoformat_test.go index 9fc35cb7..8cb904e9 100755 --- a/tests/boot2docker_autoformat_test.go +++ b/tests/boot2docker_autoformat_test.go @@ -2,6 +2,8 @@ package integration import . "gopkg.in/check.v1" +// NOTE: the boot2docker magic string/tar file is also used by Docker-machine + func (s *QemuSuite) TestBoot2DockerState(c *C) { s.RunQemu(c, "--fresh", "--b2d") s.CheckCall(c, "blkid | grep B2D_STATE") @@ -12,6 +14,8 @@ func (s *QemuSuite) TestBoot2DockerState(c *C) { func (s *QemuSuite) TestIsoBoot2DockerState(c *C) { s.RunQemu(c, "--fresh", "--b2d", "--iso") s.CheckCall(c, "blkid | grep B2D_STATE") + s.CheckCall(c, "sudo ros config get rancher.state.dev | grep LABEL=B2D_STATE") + s.CheckCall(c, "sudo ros config get rancher.state.autoformat | grep vda") // And once I make run create a tar file, check that its untarred in the docker user's home dir // And confirm if it should add to the dir, or replace, i can't remember }