From bafcf7dfb1ab8e4e694c3e6d4b8eef138b8a2e9c Mon Sep 17 00:00:00 2001 From: Matthew Hooker Date: Tue, 3 Oct 2017 11:39:33 -0700 Subject: [PATCH] test, document, cleanup puppet guest codde --- provisioner/puppet-masterless/provisioner.go | 23 ++-- .../puppet-masterless/provisioner_test.go | 129 ++++++++++++++++++ .../provisioners/puppet-masterless.html.md | 15 +- 3 files changed, 151 insertions(+), 16 deletions(-) diff --git a/provisioner/puppet-masterless/provisioner.go b/provisioner/puppet-masterless/provisioner.go index 2ed0db1c7..4b01c84d3 100644 --- a/provisioner/puppet-masterless/provisioner.go +++ b/provisioner/puppet-masterless/provisioner.go @@ -79,12 +79,14 @@ var guestOSTypeConfigs = map[string]guestOSTypeConfig{ provisioner.UnixOSType: { stagingDir: "/tmp/packer-puppet-masterless", executeCommand: "cd {{.WorkingDir}} && " + - "{{.FacterVars}} {{if .Sudo}} sudo -E {{end}}" + - "{{if ne .PuppetBinDir \"\"}}{{.PuppetBinDir}}/{{end}}puppet apply --verbose --modulepath='{{.ModulePath}}' " + - "{{if ne .HieraConfigPath \"\"}}--hiera_config='{{.HieraConfigPath}}' {{end}}" + - "{{if ne .ManifestDir \"\"}}--manifestdir='{{.ManifestDir}}' {{end}}" + + `{{if ne .FacterVars ""}}{{.FacterVars}} {{end}}` + + "{{if .Sudo}}sudo -E {{end}}" + + `{{if ne .PuppetBinDir ""}}{{.PuppetBinDir}}/{{end}}` + + `puppet apply --verbose --modulepath='{{.ModulePath}}' ` + + `{{if ne .HieraConfigPath ""}}--hiera_config='{{.HieraConfigPath}}' {{end}}` + + `{{if ne .ManifestDir ""}}--manifestdir='{{.ManifestDir}}' {{end}}` + "--detailed-exitcodes " + - "{{if ne .ExtraArguments \"\"}}{{.ExtraArguments}} {{end}}" + + `{{if ne .ExtraArguments ""}}{{.ExtraArguments}} {{end}}` + "{{.ManifestFile}}", facterVarsFmt: "FACTER_%s='%s'", facterVarsJoiner: " ", @@ -94,13 +96,14 @@ var guestOSTypeConfigs = map[string]guestOSTypeConfig{ stagingDir: "C:/Windows/Temp/packer-puppet-masterless", executeCommand: "cd {{.WorkingDir}} && " + "{{.FacterVars}} && " + - "{{if ne .PuppetBinDir \"\"}}{{.PuppetBinDir}}/{{end}}puppet apply --verbose --modulepath='{{.ModulePath}}' " + - "{{if ne .HieraConfigPath \"\"}}--hiera_config='{{.HieraConfigPath}}' {{end}}" + - "{{if ne .ManifestDir \"\"}}--manifestdir='{{.ManifestDir}}' {{end}}" + + `{{if ne .PuppetBinDir ""}}{{.PuppetBinDir}}/{{end}}` + + `puppet apply --verbose --modulepath='{{.ModulePath}}' ` + + `{{if ne .HieraConfigPath ""}}--hiera_config='{{.HieraConfigPath}}' {{end}}` + + `{{if ne .ManifestDir ""}}--manifestdir='{{.ManifestDir}}' {{end}}` + "--detailed-exitcodes " + - "{{if ne .ExtraArguments \"\"}}{{.ExtraArguments}} {{end}}" + + `{{if ne .ExtraArguments ""}}{{.ExtraArguments}} {{end}}` + "{{.ManifestFile}}", - facterVarsFmt: "SET \"FACTER_%s=%s\"", + facterVarsFmt: `SET "FACTER_%s=%s"`, facterVarsJoiner: " & ", modulePathJoiner: ";", }, diff --git a/provisioner/puppet-masterless/provisioner_test.go b/provisioner/puppet-masterless/provisioner_test.go index 84defbef9..dd6725768 100644 --- a/provisioner/puppet-masterless/provisioner_test.go +++ b/provisioner/puppet-masterless/provisioner_test.go @@ -1,12 +1,16 @@ package puppetmasterless import ( + "fmt" "io/ioutil" + "log" "os" "strings" "testing" "github.com/hashicorp/packer/packer" + "github.com/hashicorp/packer/template/interpolate" + "github.com/stretchr/testify/assert" ) func testConfig() map[string]interface{} { @@ -28,6 +32,131 @@ func TestProvisioner_Impl(t *testing.T) { } } +func TestGuestOSConfig_empty_unix(t *testing.T) { + config := testConfig() + p := new(Provisioner) + err := p.Prepare(config) + if err != nil { + t.Fatalf("err: %s", err) + } + // Execute Puppet + p.config.ctx.Data = &ExecuteTemplate{ + ManifestFile: "/r/m/f", + PuppetBinDir: p.config.PuppetBinDir, + Sudo: !p.config.PreventSudo, + WorkingDir: p.config.WorkingDir, + } + log.Println(p.config.ExecuteCommand) + command, err := interpolate.Render(p.config.ExecuteCommand, &p.config.ctx) + if err != nil { + t.Fatalf("err: %s", err) + } + + expected := "cd /tmp/packer-puppet-masterless && " + + "sudo -E puppet apply --verbose --modulepath='' --detailed-exitcodes /r/m/f" + assert.Equal(t, expected, command) +} + +func TestGuestOSConfig_full_unix(t *testing.T) { + config := testConfig() + p := new(Provisioner) + err := p.Prepare(config) + if err != nil { + t.Fatalf("err: %s", err) + } + + facterVars := []string{ + fmt.Sprintf(p.guestOSTypeConfig.facterVarsFmt, "lhs", "rhs"), + fmt.Sprintf(p.guestOSTypeConfig.facterVarsFmt, "foo", "bar"), + } + modulePaths := []string{"/m/p", "/a/b"} + // Execute Puppet + p.config.ctx.Data = &ExecuteTemplate{ + FacterVars: strings.Join(facterVars, p.guestOSTypeConfig.facterVarsJoiner), + HieraConfigPath: "/h/c/p", + ManifestDir: "/r/m/d", + ManifestFile: "/r/m/f", + ModulePath: strings.Join(modulePaths, p.guestOSTypeConfig.modulePathJoiner), + PuppetBinDir: p.config.PuppetBinDir, + Sudo: !p.config.PreventSudo, + WorkingDir: p.config.WorkingDir, + ExtraArguments: strings.Join(p.config.ExtraArguments, " "), + } + command, err := interpolate.Render(p.config.ExecuteCommand, &p.config.ctx) + if err != nil { + t.Fatalf("err: %s", err) + } + + expected := "cd /tmp/packer-puppet-masterless && FACTER_lhs='rhs' FACTER_foo='bar' " + + "sudo -E puppet apply " + + "--verbose --modulepath='/m/p:/a/b' --hiera_config='/h/c/p' " + + "--manifestdir='/r/m/d' --detailed-exitcodes /r/m/f" + assert.Equal(t, expected, command) +} + +func TestGuestOSConfig_empty_windows(t *testing.T) { + config := testConfig() + config["guest_os_type"] = "windows" + p := new(Provisioner) + err := p.Prepare(config) + if err != nil { + t.Fatalf("err: %s", err) + } + // Execute Puppet + p.config.ctx.Data = &ExecuteTemplate{ + ManifestFile: "/r/m/f", + PuppetBinDir: p.config.PuppetBinDir, + Sudo: !p.config.PreventSudo, + WorkingDir: p.config.WorkingDir, + } + log.Println(p.config.ExecuteCommand) + command, err := interpolate.Render(p.config.ExecuteCommand, &p.config.ctx) + if err != nil { + t.Fatalf("err: %s", err) + } + + expected := "cd C:/Windows/Temp/packer-puppet-masterless && && puppet apply --verbose --modulepath='' --detailed-exitcodes /r/m/f" + assert.Equal(t, expected, command) +} + +func TestGuestOSConfig_full_windows(t *testing.T) { + config := testConfig() + config["guest_os_type"] = "windows" + p := new(Provisioner) + err := p.Prepare(config) + if err != nil { + t.Fatalf("err: %s", err) + } + + facterVars := []string{ + fmt.Sprintf(p.guestOSTypeConfig.facterVarsFmt, "lhs", "rhs"), + fmt.Sprintf(p.guestOSTypeConfig.facterVarsFmt, "foo", "bar"), + } + modulePaths := []string{"/m/p", "/a/b"} + // Execute Puppet + p.config.ctx.Data = &ExecuteTemplate{ + FacterVars: strings.Join(facterVars, p.guestOSTypeConfig.facterVarsJoiner), + HieraConfigPath: "/h/c/p", + ManifestDir: "/r/m/d", + ManifestFile: "/r/m/f", + ModulePath: strings.Join(modulePaths, p.guestOSTypeConfig.modulePathJoiner), + PuppetBinDir: p.config.PuppetBinDir, + Sudo: !p.config.PreventSudo, + WorkingDir: p.config.WorkingDir, + ExtraArguments: strings.Join(p.config.ExtraArguments, " "), + } + command, err := interpolate.Render(p.config.ExecuteCommand, &p.config.ctx) + if err != nil { + t.Fatalf("err: %s", err) + } + + expected := "cd C:/Windows/Temp/packer-puppet-masterless && " + + "SET \"FACTER_lhs=rhs\" & SET \"FACTER_foo=bar\" && " + + "puppet apply --verbose --modulepath='/m/p;/a/b' --hiera_config='/h/c/p' " + + "--manifestdir='/r/m/d' --detailed-exitcodes /r/m/f" + assert.Equal(t, expected, command) +} + func TestProvisionerPrepare_puppetBinDir(t *testing.T) { config := testConfig() diff --git a/website/source/docs/provisioners/puppet-masterless.html.md b/website/source/docs/provisioners/puppet-masterless.html.md index b58d78251..63bc76576 100644 --- a/website/source/docs/provisioners/puppet-masterless.html.md +++ b/website/source/docs/provisioners/puppet-masterless.html.md @@ -124,12 +124,14 @@ readability) to execute Puppet: ``` cd {{.WorkingDir}} && -{{.FacterVars}} {{if .Sudo}} sudo -E {{end}} + {{if ne .FacterVars ""}}{{.FacterVars}} {{end}} +{{if .Sudo}}sudo -E {{end}} +{{if ne .PuppetBinDir ""}}{{.PuppetBinDir}}/{{end}} puppet apply --verbose --modulepath='{{.ModulePath}}' -{{if ne .HieraConfigPath ""}}--hiera_config='{{.HieraConfigPath}}' {{end}} + {{if ne .HieraConfigPath ""}}--hiera_config='{{.HieraConfigPath}}' {{end}} {{if ne .ManifestDir ""}}--manifestdir='{{.ManifestDir}}' {{end}} --detailed-exitcodes -{{if ne .ExtraArguments ""}}{{.ExtraArguments}} {{end}} + {{if ne .ExtraArguments ""}}{{.ExtraArguments}} {{end}} {{.ManifestFile}} ``` @@ -137,12 +139,13 @@ The following command is used if guest OS type is windows: ``` cd {{.WorkingDir}} && -{{.FacterVars}} && + {{.FacterVars}} && + {{if ne .PuppetBinDir ""}}{{.PuppetBinDir}}/{{end}} puppet apply --verbose --modulepath='{{.ModulePath}}' -{{if ne .HieraConfigPath ""}}--hiera_config='{{.HieraConfigPath}}' {{end}} + {{if ne .HieraConfigPath ""}}--hiera_config='{{.HieraConfigPath}}' {{end}} {{if ne .ManifestDir ""}}--manifestdir='{{.ManifestDir}}' {{end}} --detailed-exitcodes -{{if ne .ExtraArguments ""}}{{.ExtraArguments}} {{end}} + {{if ne .ExtraArguments ""}}{{.ExtraArguments}} {{end}} {{.ManifestFile}} ```