Merge branch 'configure-manifest-dir' of https://github.com/Jimdo/packer into Jimdo-configure-manifest-dir

pull/702/head
Mitchell Hashimoto 13 years ago
commit 1ecdd43eca

@ -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 {
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 {
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 {
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 {
} }
} }
// 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 {
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)
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 targetPath, 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) {
} }
} }
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()

@ -62,6 +62,9 @@ Optional parameters:
directories on your local filesystem. These will be uploaded to the remote directories on your local filesystem. These will be uploaded to the remote
machine. By default, this is empty. machine. By default, this is empty.
* `manifest_dir` (string) - The path to a local directory with
manifests to be uploaded to the remote machine.
* `prevent_sudo` (boolean) - By default, the configured commands that are * `prevent_sudo` (boolean) - By default, the configured commands that are
executed to run Puppet are executed with `sudo`. If this is true, executed to run Puppet are executed with `sudo`. If this is true,
then the sudo will be omitted. then the sudo will be omitted.
@ -83,6 +86,7 @@ for readability) to execute Puppet:
--verbose \ --verbose \
--modulepath='{{.ModulePath}}' \ --modulepath='{{.ModulePath}}' \
{{if .HasHieraConfigPath}}--hiera_config='{{.HieraConfigPath}}' {{end}} \ {{if .HasHieraConfigPath}}--hiera_config='{{.HieraConfigPath}}' {{end}} \
{{if .HasManifestDir}}--manifestdir='{{.ManifestDir}}' {{end}} \
{{.ManifestFile}} {{.ManifestFile}}
``` ```

Loading…
Cancel
Save