github.com/dacamp/packer@v0.10.2/provisioner/puppet-masterless/provisioner_test.go (about) 1 package puppetmasterless 2 3 import ( 4 "io/ioutil" 5 "os" 6 "strings" 7 "testing" 8 9 "github.com/mitchellh/packer/packer" 10 ) 11 12 func testConfig() map[string]interface{} { 13 tf, err := ioutil.TempFile("", "packer") 14 if err != nil { 15 panic(err) 16 } 17 18 return map[string]interface{}{ 19 "manifest_file": tf.Name(), 20 } 21 } 22 23 func TestProvisioner_Impl(t *testing.T) { 24 var raw interface{} 25 raw = &Provisioner{} 26 if _, ok := raw.(packer.Provisioner); !ok { 27 t.Fatalf("must be a Provisioner") 28 } 29 } 30 31 func TestProvisionerPrepare_hieraConfigPath(t *testing.T) { 32 config := testConfig() 33 34 delete(config, "hiera_config_path") 35 p := new(Provisioner) 36 err := p.Prepare(config) 37 if err != nil { 38 t.Fatalf("err: %s", err) 39 } 40 41 // Test with a good one 42 tf, err := ioutil.TempFile("", "packer") 43 if err != nil { 44 t.Fatalf("error tempfile: %s", err) 45 } 46 defer os.Remove(tf.Name()) 47 48 config["hiera_config_path"] = tf.Name() 49 p = new(Provisioner) 50 err = p.Prepare(config) 51 if err != nil { 52 t.Fatalf("err: %s", err) 53 } 54 } 55 56 func TestProvisionerPrepare_manifestFile(t *testing.T) { 57 config := testConfig() 58 59 delete(config, "manifest_file") 60 p := new(Provisioner) 61 err := p.Prepare(config) 62 if err == nil { 63 t.Fatal("should be an error") 64 } 65 66 // Test with a good one 67 tf, err := ioutil.TempFile("", "packer") 68 if err != nil { 69 t.Fatalf("error tempfile: %s", err) 70 } 71 defer os.Remove(tf.Name()) 72 73 config["manifest_file"] = tf.Name() 74 p = new(Provisioner) 75 err = p.Prepare(config) 76 if err != nil { 77 t.Fatalf("err: %s", err) 78 } 79 } 80 81 func TestProvisionerPrepare_manifestDir(t *testing.T) { 82 config := testConfig() 83 84 delete(config, "manifestdir") 85 p := new(Provisioner) 86 err := p.Prepare(config) 87 if err != nil { 88 t.Fatalf("err: %s", err) 89 } 90 91 // Test with a good one 92 td, err := ioutil.TempDir("", "packer") 93 if err != nil { 94 t.Fatalf("error: %s", err) 95 } 96 defer os.RemoveAll(td) 97 98 config["manifest_dir"] = td 99 p = new(Provisioner) 100 err = p.Prepare(config) 101 if err != nil { 102 t.Fatalf("err: %s", err) 103 } 104 } 105 106 func TestProvisionerPrepare_modulePaths(t *testing.T) { 107 config := testConfig() 108 109 delete(config, "module_paths") 110 p := new(Provisioner) 111 err := p.Prepare(config) 112 if err != nil { 113 t.Fatalf("err: %s", err) 114 } 115 116 // Test with bad paths 117 config["module_paths"] = []string{"i-should-not-exist"} 118 p = new(Provisioner) 119 err = p.Prepare(config) 120 if err == nil { 121 t.Fatal("should be an error") 122 } 123 124 // Test with a good one 125 td, err := ioutil.TempDir("", "packer") 126 if err != nil { 127 t.Fatalf("error: %s", err) 128 } 129 defer os.RemoveAll(td) 130 131 config["module_paths"] = []string{td} 132 p = new(Provisioner) 133 err = p.Prepare(config) 134 if err != nil { 135 t.Fatalf("err: %s", err) 136 } 137 } 138 139 func TestProvisionerPrepare_facterFacts(t *testing.T) { 140 config := testConfig() 141 142 delete(config, "facter") 143 p := new(Provisioner) 144 err := p.Prepare(config) 145 if err != nil { 146 t.Fatalf("err: %s", err) 147 } 148 149 // Test with malformed fact 150 config["facter"] = "fact=stringified" 151 p = new(Provisioner) 152 err = p.Prepare(config) 153 if err == nil { 154 t.Fatal("should be an error") 155 } 156 157 // Test with a good one 158 td, err := ioutil.TempDir("", "packer") 159 if err != nil { 160 t.Fatalf("error: %s", err) 161 } 162 defer os.RemoveAll(td) 163 164 facts := make(map[string]string) 165 facts["fact_name"] = "fact_value" 166 config["facter"] = facts 167 168 p = new(Provisioner) 169 err = p.Prepare(config) 170 if err != nil { 171 t.Fatalf("err: %s", err) 172 } 173 174 // Make sure the default facts are present 175 delete(config, "facter") 176 p = new(Provisioner) 177 err = p.Prepare(config) 178 if p.config.Facter == nil { 179 t.Fatalf("err: Default facts are not set in the Puppet provisioner!") 180 } 181 } 182 183 func TestProvisionerPrepare_extraArguments(t *testing.T) { 184 config := testConfig() 185 186 // Test with missing parameter 187 delete(config, "extra_arguments") 188 p := new(Provisioner) 189 err := p.Prepare(config) 190 if err != nil { 191 t.Fatalf("err: %s", err) 192 } 193 194 // Test with malformed value 195 config["extra_arguments"] = "{{}}" 196 p = new(Provisioner) 197 err = p.Prepare(config) 198 if err == nil { 199 t.Fatal("should be an error") 200 } 201 202 // Test with valid values 203 config["extra_arguments"] = []string{ 204 "arg", 205 } 206 207 p = new(Provisioner) 208 err = p.Prepare(config) 209 if err != nil { 210 t.Fatalf("err: %s", err) 211 } 212 } 213 214 func TestProvisionerProvision_extraArguments(t *testing.T) { 215 config := testConfig() 216 ui := &packer.MachineReadableUi{ 217 Writer: ioutil.Discard, 218 } 219 comm := new(packer.MockCommunicator) 220 221 extraArguments := []string{ 222 "--some-arg=yup", 223 "--some-other-arg", 224 } 225 config["extra_arguments"] = extraArguments 226 227 // Test with valid values 228 p := new(Provisioner) 229 err := p.Prepare(config) 230 if err != nil { 231 t.Fatalf("err: %s", err) 232 } 233 234 err = p.Provision(ui, comm) 235 if err != nil { 236 t.Fatalf("err: %s", err) 237 } 238 239 expectedArgs := strings.Join(extraArguments, " ") 240 241 if !strings.Contains(comm.StartCmd.Command, expectedArgs) { 242 t.Fatalf("Command %q doesn't contain the expected arguments %q", comm.StartCmd.Command, expectedArgs) 243 } 244 245 // Test with missing parameter 246 delete(config, "extra_arguments") 247 248 p = new(Provisioner) 249 err = p.Prepare(config) 250 if err != nil { 251 t.Fatalf("err: %s", err) 252 } 253 254 err = p.Provision(ui, comm) 255 if err != nil { 256 t.Fatalf("err: %s", err) 257 } 258 259 // Check the expected `extra_arguments` position for an empty value 260 splitCommand := strings.Split(comm.StartCmd.Command, " ") 261 if "" == splitCommand[len(splitCommand)-2] { 262 t.Fatalf("Command %q contains an extra-space which may cause arg parsing issues", comm.StartCmd.Command) 263 } 264 }