github.com/rahart/packer@v0.12.2-0.20161229105310-282bb6ad370f/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_puppetBinDir(t *testing.T) { 32 config := testConfig() 33 34 delete(config, "puppet_bin_dir") 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["puppet_bin_dir"] = 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_hieraConfigPath(t *testing.T) { 57 config := testConfig() 58 59 delete(config, "hiera_config_path") 60 p := new(Provisioner) 61 err := p.Prepare(config) 62 if err != nil { 63 t.Fatalf("err: %s", err) 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["hiera_config_path"] = 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_manifestFile(t *testing.T) { 82 config := testConfig() 83 84 delete(config, "manifest_file") 85 p := new(Provisioner) 86 err := p.Prepare(config) 87 if err == nil { 88 t.Fatal("should be an error") 89 } 90 91 // Test with a good one 92 tf, err := ioutil.TempFile("", "packer") 93 if err != nil { 94 t.Fatalf("error tempfile: %s", err) 95 } 96 defer os.Remove(tf.Name()) 97 98 config["manifest_file"] = tf.Name() 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_manifestDir(t *testing.T) { 107 config := testConfig() 108 109 delete(config, "manifestdir") 110 p := new(Provisioner) 111 err := p.Prepare(config) 112 if err != nil { 113 t.Fatalf("err: %s", err) 114 } 115 116 // Test with a good one 117 td, err := ioutil.TempDir("", "packer") 118 if err != nil { 119 t.Fatalf("error: %s", err) 120 } 121 defer os.RemoveAll(td) 122 123 config["manifest_dir"] = td 124 p = new(Provisioner) 125 err = p.Prepare(config) 126 if err != nil { 127 t.Fatalf("err: %s", err) 128 } 129 } 130 131 func TestProvisionerPrepare_modulePaths(t *testing.T) { 132 config := testConfig() 133 134 delete(config, "module_paths") 135 p := new(Provisioner) 136 err := p.Prepare(config) 137 if err != nil { 138 t.Fatalf("err: %s", err) 139 } 140 141 // Test with bad paths 142 config["module_paths"] = []string{"i-should-not-exist"} 143 p = new(Provisioner) 144 err = p.Prepare(config) 145 if err == nil { 146 t.Fatal("should be an error") 147 } 148 149 // Test with a good one 150 td, err := ioutil.TempDir("", "packer") 151 if err != nil { 152 t.Fatalf("error: %s", err) 153 } 154 defer os.RemoveAll(td) 155 156 config["module_paths"] = []string{td} 157 p = new(Provisioner) 158 err = p.Prepare(config) 159 if err != nil { 160 t.Fatalf("err: %s", err) 161 } 162 } 163 164 func TestProvisionerPrepare_facterFacts(t *testing.T) { 165 config := testConfig() 166 167 delete(config, "facter") 168 p := new(Provisioner) 169 err := p.Prepare(config) 170 if err != nil { 171 t.Fatalf("err: %s", err) 172 } 173 174 // Test with malformed fact 175 config["facter"] = "fact=stringified" 176 p = new(Provisioner) 177 err = p.Prepare(config) 178 if err == nil { 179 t.Fatal("should be an error") 180 } 181 182 // Test with a good one 183 td, err := ioutil.TempDir("", "packer") 184 if err != nil { 185 t.Fatalf("error: %s", err) 186 } 187 defer os.RemoveAll(td) 188 189 facts := make(map[string]string) 190 facts["fact_name"] = "fact_value" 191 config["facter"] = facts 192 193 p = new(Provisioner) 194 err = p.Prepare(config) 195 if err != nil { 196 t.Fatalf("err: %s", err) 197 } 198 199 // Make sure the default facts are present 200 delete(config, "facter") 201 p = new(Provisioner) 202 err = p.Prepare(config) 203 if p.config.Facter == nil { 204 t.Fatalf("err: Default facts are not set in the Puppet provisioner!") 205 } 206 207 if _, ok := p.config.Facter["packer_build_name"]; !ok { 208 t.Fatalf("err: packer_build_name fact not set in the Puppet provisioner!") 209 } 210 211 if _, ok := p.config.Facter["packer_builder_type"]; !ok { 212 t.Fatalf("err: packer_builder_type fact not set in the Puppet provisioner!") 213 } 214 } 215 216 func TestProvisionerPrepare_extraArguments(t *testing.T) { 217 config := testConfig() 218 219 // Test with missing parameter 220 delete(config, "extra_arguments") 221 p := new(Provisioner) 222 err := p.Prepare(config) 223 if err != nil { 224 t.Fatalf("err: %s", err) 225 } 226 227 // Test with malformed value 228 config["extra_arguments"] = "{{}}" 229 p = new(Provisioner) 230 err = p.Prepare(config) 231 if err == nil { 232 t.Fatal("should be an error") 233 } 234 235 // Test with valid values 236 config["extra_arguments"] = []string{ 237 "arg", 238 } 239 240 p = new(Provisioner) 241 err = p.Prepare(config) 242 if err != nil { 243 t.Fatalf("err: %s", err) 244 } 245 } 246 247 func TestProvisionerPrepare_stagingDir(t *testing.T) { 248 config := testConfig() 249 250 delete(config, "staging_directory") 251 p := new(Provisioner) 252 err := p.Prepare(config) 253 if err != nil { 254 t.Fatalf("err: %s", err) 255 } 256 257 // Make sure the default staging directory is correct 258 if p.config.StagingDir != "/tmp/packer-puppet-masterless" { 259 t.Fatalf("err: Default staging_directory is not set in the Puppet provisioner!") 260 } 261 262 // Make sure default staging directory can be overridden 263 config["staging_directory"] = "/tmp/override" 264 p = new(Provisioner) 265 err = p.Prepare(config) 266 if err != nil { 267 t.Fatalf("err: %s", err) 268 } 269 270 if p.config.StagingDir != "/tmp/override" { 271 t.Fatalf("err: Overridden staging_directory is not set correctly in the Puppet provisioner!") 272 } 273 } 274 275 func TestProvisionerPrepare_workingDir(t *testing.T) { 276 config := testConfig() 277 278 delete(config, "working_directory") 279 p := new(Provisioner) 280 err := p.Prepare(config) 281 if err != nil { 282 t.Fatalf("err: %s", err) 283 } 284 285 // Make sure default working dir and staging dir are the same 286 if p.config.WorkingDir != p.config.StagingDir { 287 t.Fatalf("err: Default working_directory is not set to the same value as default staging_directory in the Puppet provisioner!") 288 } 289 290 // Make sure the default working directory is correct 291 if p.config.WorkingDir != "/tmp/packer-puppet-masterless" { 292 t.Fatalf("err: Default working_directory is not set in the Puppet provisioner!") 293 } 294 295 // Make sure default working directory can be overridden 296 config["working_directory"] = "/tmp/override" 297 p = new(Provisioner) 298 err = p.Prepare(config) 299 if err != nil { 300 t.Fatalf("err: %s", err) 301 } 302 303 if p.config.WorkingDir != "/tmp/override" { 304 t.Fatalf("err: Overridden working_directory is not set correctly in the Puppet provisioner!") 305 } 306 } 307 308 func TestProvisionerProvision_extraArguments(t *testing.T) { 309 config := testConfig() 310 ui := &packer.MachineReadableUi{ 311 Writer: ioutil.Discard, 312 } 313 comm := new(packer.MockCommunicator) 314 315 extraArguments := []string{ 316 "--some-arg=yup", 317 "--some-other-arg", 318 } 319 config["extra_arguments"] = extraArguments 320 321 // Test with valid values 322 p := new(Provisioner) 323 err := p.Prepare(config) 324 if err != nil { 325 t.Fatalf("err: %s", err) 326 } 327 328 err = p.Provision(ui, comm) 329 if err != nil { 330 t.Fatalf("err: %s", err) 331 } 332 333 expectedArgs := strings.Join(extraArguments, " ") 334 335 if !strings.Contains(comm.StartCmd.Command, expectedArgs) { 336 t.Fatalf("Command %q doesn't contain the expected arguments %q", comm.StartCmd.Command, expectedArgs) 337 } 338 339 // Test with missing parameter 340 delete(config, "extra_arguments") 341 342 p = new(Provisioner) 343 err = p.Prepare(config) 344 if err != nil { 345 t.Fatalf("err: %s", err) 346 } 347 348 err = p.Provision(ui, comm) 349 if err != nil { 350 t.Fatalf("err: %s", err) 351 } 352 353 // Check the expected `extra_arguments` position for an empty value 354 splitCommand := strings.Split(comm.StartCmd.Command, " ") 355 if "" == splitCommand[len(splitCommand)-2] { 356 t.Fatalf("Command %q contains an extra-space which may cause arg parsing issues", comm.StartCmd.Command) 357 } 358 }