From ed07fb63e4832b7c7df13186ad75c8f82cd26ca6 Mon Sep 17 00:00:00 2001 From: mafro Date: Thu, 7 Aug 2014 15:07:27 +1000 Subject: [PATCH] salt provisioner: tidy up and refactor into functions --- provisioner/salt-masterless/provisioner.go | 103 ++++++++++++++------- 1 file changed, 67 insertions(+), 36 deletions(-) diff --git a/provisioner/salt-masterless/provisioner.go b/provisioner/salt-masterless/provisioner.go index 6a3c03203..5256a1c0e 100644 --- a/provisioner/salt-masterless/provisioner.go +++ b/provisioner/salt-masterless/provisioner.go @@ -8,6 +8,7 @@ import ( "github.com/mitchellh/packer/common" "github.com/mitchellh/packer/packer" "os" + "path/filepath" ) const DefaultTempConfigDir = "/tmp/salt" @@ -108,6 +109,7 @@ func (p *Provisioner) Prepare(raws ...interface{}) error { func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) error { var err error + var src, dst string ui.Say("Provisioning with Salt...") if !p.config.SkipBootstrap { @@ -121,68 +123,58 @@ func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) error { } ui.Message(fmt.Sprintf("Creating remote directory: %s", p.config.TempConfigDir)) - cmd := &packer.RemoteCmd{Command: fmt.Sprintf("mkdir -p %s", p.config.TempConfigDir)} - if err = cmd.StartWithUi(comm, ui); err != nil || cmd.ExitStatus != 0 { - if err == nil { - err = fmt.Errorf("Bad exit status: %d", cmd.ExitStatus) - } - + if err := p.createDir(ui, comm, p.config.TempConfigDir); err != nil { return fmt.Errorf("Error creating remote salt state directory: %s", err) } if p.config.MinionConfig != "" { ui.Message(fmt.Sprintf("Uploading minion config: %s", p.config.MinionConfig)) - if err = uploadMinionConfig(comm, fmt.Sprintf("%s/minion", p.config.TempConfigDir), p.config.MinionConfig); err != nil { + src = p.config.MinionConfig + dst = filepath.ToSlash(filepath.Join(p.config.TempConfigDir, "minion")) + if err = p.uploadFile(ui, comm, dst, src); err != nil { return fmt.Errorf("Error uploading local minion config file to remote: %s", err) } - ui.Message(fmt.Sprintf("Moving %s/minion to /etc/salt/minion", p.config.TempConfigDir)) - cmd = &packer.RemoteCmd{Command: fmt.Sprintf("sudo mv %s/minion /etc/salt/minion", p.config.TempConfigDir)} - if err = cmd.StartWithUi(comm, ui); err != nil || cmd.ExitStatus != 0 { - if err == nil { - err = fmt.Errorf("Bad exit status: %d", cmd.ExitStatus) - } - + // move minion config into /etc/salt + src = filepath.ToSlash(filepath.Join(p.config.TempConfigDir, "minion")) + dst = "/etc/salt/minion" + if err = p.moveFile(ui, comm, dst, src); err != nil { return fmt.Errorf("Unable to move %s/minion to /etc/salt/minion: %d", p.config.TempConfigDir, err) } } ui.Message(fmt.Sprintf("Uploading local state tree: %s", p.config.LocalStateTree)) - if err = comm.UploadDir(fmt.Sprintf("%s/states", p.config.TempConfigDir), - p.config.LocalStateTree, []string{".git"}); err != nil { + src = p.config.LocalStateTree + dst = filepath.ToSlash(filepath.Join(p.config.TempConfigDir, "states")) + if err = p.uploadDir(ui, comm, dst, src, []string{".git"}); err != nil { return fmt.Errorf("Error uploading local state tree to remote: %s", err) } - ui.Message(fmt.Sprintf("Moving %s/states to /srv/salt", p.config.TempConfigDir)) - cmd = &packer.RemoteCmd{Command: fmt.Sprintf("sudo mv %s/states /srv/salt", p.config.TempConfigDir)} - if err = cmd.StartWithUi(comm, ui); err != nil || cmd.ExitStatus != 0 { - if err == nil { - err = fmt.Errorf("Bad exit status: %d", cmd.ExitStatus) - } - + // move state tree into /srv/salt + src = filepath.ToSlash(filepath.Join(p.config.TempConfigDir, "states")) + dst = "/srv/salt" + if err = p.moveFile(ui, comm, dst, src); err != nil { return fmt.Errorf("Unable to move %s/states to /srv/salt: %d", p.config.TempConfigDir, err) } if p.config.LocalPillarRoots != "" { ui.Message(fmt.Sprintf("Uploading local pillar roots: %s", p.config.LocalPillarRoots)) - if err = comm.UploadDir(fmt.Sprintf("%s/pillar", p.config.TempConfigDir), - p.config.LocalPillarRoots, []string{".git"}); err != nil { + src = p.config.LocalPillarRoots + dst = filepath.ToSlash(filepath.Join(p.config.TempConfigDir, "pillar")) + if err = p.uploadDir(ui, comm, dst, src, []string{".git"}); err != nil { return fmt.Errorf("Error uploading local pillar roots to remote: %s", err) } - ui.Message(fmt.Sprintf("Moving %s/pillar to /srv/pillar", p.config.TempConfigDir)) - cmd = &packer.RemoteCmd{Command: fmt.Sprintf("sudo mv %s/pillar /srv/pillar", p.config.TempConfigDir)} - if err = cmd.StartWithUi(comm, ui); err != nil || cmd.ExitStatus != 0 { - if err == nil { - err = fmt.Errorf("Bad exit status: %d", cmd.ExitStatus) - } - + // move pillar tree into /srv/pillar + src = filepath.ToSlash(filepath.Join(p.config.TempConfigDir, "pillar")) + dst = "/srv/pillar" + if err = p.moveFile(ui, comm, dst, src); err != nil { return fmt.Errorf("Unable to move %s/pillar to /srv/pillar: %d", p.config.TempConfigDir, err) } } ui.Message("Running highstate") - cmd = &packer.RemoteCmd{Command: "sudo salt-call --local state.highstate -l info"} + cmd := &packer.RemoteCmd{Command: "sudo salt-call --local state.highstate -l info"} if err = cmd.StartWithUi(comm, ui); err != nil || cmd.ExitStatus != 0 { if err == nil { err = fmt.Errorf("Bad exit status: %d", cmd.ExitStatus) @@ -200,16 +192,55 @@ func (p *Provisioner) Cancel() { os.Exit(0) } -func uploadMinionConfig(comm packer.Communicator, dst string, src string) error { +func (p *Provisioner) uploadFile(ui packer.Ui, comm packer.Communicator, dst, src string) error { f, err := os.Open(src) if err != nil { - return fmt.Errorf("Error opening minion config: %s", err) + return fmt.Errorf("Error opening: %s", err) } defer f.Close() if err = comm.Upload(dst, f, nil); err != nil { - return fmt.Errorf("Error uploading minion config: %s", err) + return fmt.Errorf("Error uploading %s: %s", src, err) + } + return nil +} + +func (p *Provisioner) moveFile(ui packer.Ui, comm packer.Communicator, dst, src string) error { + ui.Message(fmt.Sprintf("Moving %s to %s", src, dst)) + cmd := &packer.RemoteCmd{Command: fmt.Sprintf("sudo mv %s %s", src, dst)} + if err := cmd.StartWithUi(comm, ui); err != nil || cmd.ExitStatus != 0 { + if err == nil { + err = fmt.Errorf("Bad exit status: %d", cmd.ExitStatus) + } + + return fmt.Errorf("Unable to move %s/minion to /etc/salt/minion: %d", p.config.TempConfigDir, err) } + return nil +} +func (p *Provisioner) createDir(ui packer.Ui, comm packer.Communicator, dir string) error { + ui.Message(fmt.Sprintf("Creating directory: %s", dir)) + cmd := &packer.RemoteCmd{ + Command: fmt.Sprintf("mkdir -p '%s'", dir), + } + if err := cmd.StartWithUi(comm, ui); err != nil { + return err + } + if cmd.ExitStatus != 0 { + return fmt.Errorf("Non-zero exit status.") + } return nil } + +func (p *Provisioner) uploadDir(ui packer.Ui, comm packer.Communicator, dst, src string, ignore []string) error { + if err := p.createDir(ui, comm, dst); err != nil { + return err + } + + // Make sure there is a trailing "/" so that the directory isn't + // created on the other side. + if src[len(src)-1] != '/' { + src = src + "/" + } + return comm.UploadDir(dst, src, ignore) +}