Commit 8beaae0d authored by Jan Brauer's avatar Jan Brauer

#450 - allow configuration of manifest dir

parent 30ba7307
...@@ -31,6 +31,9 @@ type Config struct { ...@@ -31,6 +31,9 @@ type Config struct {
// The main manifest file to apply to kick off the entire thing. // The main manifest file to apply to kick off the entire thing.
ManifestFile string `mapstructure:"manifest_file"` ManifestFile string `mapstructure:"manifest_file"`
// The manifest dir, e.g. for includes
ManifestDir string `mapstructure:"manifest_dir"`
// If true, `sudo` will NOT be used to execute Puppet. // If true, `sudo` will NOT be used to execute Puppet.
PreventSudo bool `mapstructure:"prevent_sudo"` PreventSudo bool `mapstructure:"prevent_sudo"`
...@@ -49,6 +52,8 @@ type ExecuteTemplate struct { ...@@ -49,6 +52,8 @@ type ExecuteTemplate struct {
HieraConfigPath string HieraConfigPath string
ModulePath string ModulePath string
ManifestFile string ManifestFile string
HasManifestDir bool
ManifestDir string
Sudo bool Sudo bool
} }
...@@ -72,6 +77,7 @@ func (p *Provisioner) Prepare(raws ...interface{}) error { ...@@ -72,6 +77,7 @@ func (p *Provisioner) Prepare(raws ...interface{}) error {
p.config.ExecuteCommand = "{{.FacterVars}} {{if .Sudo}} sudo -E {{end}}" + p.config.ExecuteCommand = "{{.FacterVars}} {{if .Sudo}} sudo -E {{end}}" +
"puppet apply --verbose --modulepath='{{.ModulePath}}' " + "puppet apply --verbose --modulepath='{{.ModulePath}}' " +
"{{if .HasHieraConfigPath}}--hiera_config='{{.HieraConfigPath}}' {{end}}" + "{{if .HasHieraConfigPath}}--hiera_config='{{.HieraConfigPath}}' {{end}}" +
"{{if .HasManifestDir}}--manifestdir='{{.ManifestDir}}' {{end}}" +
"--detailed-exitcodes " + "--detailed-exitcodes " +
"{{.ManifestFile}}" "{{.ManifestFile}}"
} }
...@@ -84,6 +90,7 @@ func (p *Provisioner) Prepare(raws ...interface{}) error { ...@@ -84,6 +90,7 @@ func (p *Provisioner) Prepare(raws ...interface{}) error {
templates := map[string]*string{ templates := map[string]*string{
"hiera_config_path": &p.config.HieraConfigPath, "hiera_config_path": &p.config.HieraConfigPath,
"manifest_file": &p.config.ManifestFile, "manifest_file": &p.config.ManifestFile,
"manifest_dir": &p.config.ManifestDir,
"staging_dir": &p.config.StagingDir, "staging_dir": &p.config.StagingDir,
} }
...@@ -204,6 +211,16 @@ func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) error { ...@@ -204,6 +211,16 @@ func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) error {
} }
} }
// Upload manifest dir if set
remoteManifestDir := ""
if p.config.ManifestDir != "" {
var err error
remoteManifestDir, err = p.uploadManifestDir(ui, comm)
if err != nil {
return fmt.Errorf("Error uploading manifest dir: %s", err)
}
}
// Upload all modules // Upload all modules
modulePaths := make([]string, 0, len(p.config.ModulePaths)) modulePaths := make([]string, 0, len(p.config.ModulePaths))
for i, path := range p.config.ModulePaths { for i, path := range p.config.ModulePaths {
...@@ -233,6 +250,8 @@ func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) error { ...@@ -233,6 +250,8 @@ func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) error {
FacterVars: strings.Join(facterVars, " "), FacterVars: strings.Join(facterVars, " "),
HasHieraConfigPath: remoteHieraConfigPath != "", HasHieraConfigPath: remoteHieraConfigPath != "",
HieraConfigPath: remoteHieraConfigPath, HieraConfigPath: remoteHieraConfigPath,
HasManifestDir: remoteManifestDir != "",
ManifestDir: remoteManifestDir,
ManifestFile: remoteManifestFile, ManifestFile: remoteManifestFile,
ModulePath: strings.Join(modulePaths, ":"), ModulePath: strings.Join(modulePaths, ":"),
Sudo: !p.config.PreventSudo, Sudo: !p.config.PreventSudo,
...@@ -279,6 +298,22 @@ func (p *Provisioner) uploadHieraConfig(ui packer.Ui, comm packer.Communicator) ...@@ -279,6 +298,22 @@ func (p *Provisioner) uploadHieraConfig(ui packer.Ui, comm packer.Communicator)
return path, nil return path, nil
} }
func (p *Provisioner) uploadManifestDir(ui packer.Ui, comm packer.Communicator) (string, error) {
ui.Message("Uploading manifest dir...")
path, err := os.Open(p.config.ManifestDir)
if err != nil {
return "", err
}
defer path.Close()
targetPath := fmt.Sprintf("%s/manifests", p.config.StagingDir)
if err := p.uploadDirectory(ui, comm, targetPath, p.config.ManifestDir); err != nil {
return "", fmt.Errorf("Error uploading manifest dir: %s", err)
}
return p.config.ManifestDir, nil
}
func (p *Provisioner) uploadManifests(ui packer.Ui, comm packer.Communicator) (string, error) { func (p *Provisioner) uploadManifests(ui packer.Ui, comm packer.Communicator) (string, error) {
// Create the remote manifests directory... // Create the remote manifests directory...
ui.Message("Uploading manifests...") ui.Message("Uploading manifests...")
......
...@@ -76,6 +76,31 @@ func TestProvisionerPrepare_manifestFile(t *testing.T) { ...@@ -76,6 +76,31 @@ func TestProvisionerPrepare_manifestFile(t *testing.T) {
} }
} }
func TestProvisionerPrepare_manifestDir(t *testing.T) {
config := testConfig()
delete(config, "manifestdir")
p := new(Provisioner)
err := p.Prepare(config)
if err != nil {
t.Fatalf("err: %s", err)
}
// Test with a good one
tf, err := ioutil.TempFile("", "packer")
if err != nil {
t.Fatalf("error tempfile: %s", err)
}
defer os.Remove(tf.Name())
config["manifest_dir"] = tf.Name()
p = new(Provisioner)
err = p.Prepare(config)
if err != nil {
t.Fatalf("err: %s", err)
}
}
func TestProvisionerPrepare_modulePaths(t *testing.T) { func TestProvisionerPrepare_modulePaths(t *testing.T) {
config := testConfig() config := testConfig()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment