github.com/marksheahan/packer@v0.10.2-0.20160613200515-1acb2d6645a0/builder/qemu/builder_test.go (about) 1 package qemu 2 3 import ( 4 "github.com/mitchellh/packer/packer" 5 "io/ioutil" 6 "os" 7 "reflect" 8 "testing" 9 ) 10 11 var testPem = ` 12 -----BEGIN RSA PRIVATE KEY----- 13 MIIEpQIBAAKCAQEAxd4iamvrwRJvtNDGQSIbNvvIQN8imXTRWlRY62EvKov60vqu 14 hh+rDzFYAIIzlmrJopvOe0clqmi3mIP9dtkjPFrYflq52a2CF5q+BdwsJXuRHbJW 15 LmStZUwW1khSz93DhvhmK50nIaczW63u4EO/jJb3xj+wxR1Nkk9bxi3DDsYFt8SN 16 AzYx9kjlEYQ/+sI4/ATfmdV9h78SVotjScupd9KFzzi76gWq9gwyCBLRynTUWlyD 17 2UOfJRkOvhN6/jKzvYfVVwjPSfA9IMuooHdScmC4F6KBKJl/zf/zETM0XyzIDNmH 18 uOPbCiljq2WoRM+rY6ET84EO0kVXbfx8uxUsqQIDAQABAoIBAQCkPj9TF0IagbM3 19 5BSs/CKbAWS4dH/D4bPlxx4IRCNirc8GUg+MRb04Xz0tLuajdQDqeWpr6iLZ0RKV 20 BvreLF+TOdV7DNQ4XE4gSdJyCtCaTHeort/aordL3l0WgfI7mVk0L/yfN1PEG4YG 21 E9q1TYcyrB3/8d5JwIkjabxERLglCcP+geOEJp+QijbvFIaZR/n2irlKW4gSy6ko 22 9B0fgUnhkHysSg49ChHQBPQ+o5BbpuLrPDFMiTPTPhdfsvGGcyCGeqfBA56oHcSF 23 K02Fg8OM+Bd1lb48LAN9nWWY4WbwV+9bkN3Ym8hO4c3a/Dxf2N7LtAQqWZzFjvM3 24 /AaDvAgBAoGBAPLD+Xn1IYQPMB2XXCXfOuJewRY7RzoVWvMffJPDfm16O7wOiW5+ 25 2FmvxUDayk4PZy6wQMzGeGKnhcMMZTyaq2g/QtGfrvy7q1Lw2fB1VFlVblvqhoJa 26 nMJojjC4zgjBkXMHsRLeTmgUKyGs+fdFbfI6uejBnnf+eMVUMIdJ+6I9AoGBANCn 27 kWO9640dttyXURxNJ3lBr2H3dJOkmD6XS+u+LWqCSKQe691Y/fZ/ZL0Oc4Mhy7I6 28 hsy3kDQ5k2V0fkaNODQIFJvUqXw2pMewUk8hHc9403f4fe9cPrL12rQ8WlQw4yoC 29 v2B61vNczCCUDtGxlAaw8jzSRaSI5s6ax3K7enbdAoGBAJB1WYDfA2CoAQO6y9Sl 30 b07A/7kQ8SN5DbPaqrDrBdJziBQxukoMJQXJeGFNUFD/DXFU5Fp2R7C86vXT7HIR 31 v6m66zH+CYzOx/YE6EsUJms6UP9VIVF0Rg/RU7teXQwM01ZV32LQ8mswhTH20o/3 32 uqMHmxUMEhZpUMhrfq0isyApAoGAe1UxGTXfj9AqkIVYylPIq2HqGww7+jFmVEj1 33 9Wi6S6Sq72ffnzzFEPkIQL/UA4TsdHMnzsYKFPSbbXLIWUeMGyVTmTDA5c0e5XIR 34 lPhMOKCAzv8w4VUzMnEkTzkFY5JqFCD/ojW57KvDdNZPVB+VEcdxyAW6aKELXMAc 35 eHLc1nkCgYEApm/motCTPN32nINZ+Vvywbv64ZD+gtpeMNP3CLrbe1X9O+H52AXa 36 1jCoOldWR8i2bs2NVPcKZgdo6fFULqE4dBX7Te/uYEIuuZhYLNzRO1IKU/YaqsXG 37 3bfQ8hKYcSnTfE0gPtLDnqCIxTocaGLSHeG3TH9fTw+dA8FvWpUztI4= 38 -----END RSA PRIVATE KEY----- 39 ` 40 41 func testConfig() map[string]interface{} { 42 return map[string]interface{}{ 43 "iso_checksum": "foo", 44 "iso_checksum_type": "md5", 45 "iso_url": "http://www.google.com/", 46 "ssh_username": "foo", 47 packer.BuildNameConfigKey: "foo", 48 } 49 } 50 51 func TestBuilder_ImplementsBuilder(t *testing.T) { 52 var raw interface{} 53 raw = &Builder{} 54 if _, ok := raw.(packer.Builder); !ok { 55 t.Error("Builder must implement builder.") 56 } 57 } 58 59 func TestBuilderPrepare_Defaults(t *testing.T) { 60 var b Builder 61 config := testConfig() 62 warns, err := b.Prepare(config) 63 if len(warns) > 0 { 64 t.Fatalf("bad: %#v", warns) 65 } 66 if err != nil { 67 t.Fatalf("should not have error: %s", err) 68 } 69 70 if b.config.OutputDir != "output-foo" { 71 t.Errorf("bad output dir: %s", b.config.OutputDir) 72 } 73 74 if b.config.SSHHostPortMin != 2222 { 75 t.Errorf("bad min ssh host port: %d", b.config.SSHHostPortMin) 76 } 77 78 if b.config.SSHHostPortMax != 4444 { 79 t.Errorf("bad max ssh host port: %d", b.config.SSHHostPortMax) 80 } 81 82 if b.config.Comm.SSHPort != 22 { 83 t.Errorf("bad ssh port: %d", b.config.Comm.SSHPort) 84 } 85 86 if b.config.VMName != "packer-foo" { 87 t.Errorf("bad vm name: %s", b.config.VMName) 88 } 89 90 if b.config.Format != "qcow2" { 91 t.Errorf("bad format: %s", b.config.Format) 92 } 93 } 94 95 func TestBuilderPrepare_BootWait(t *testing.T) { 96 var b Builder 97 config := testConfig() 98 99 // Test a default boot_wait 100 delete(config, "boot_wait") 101 warns, err := b.Prepare(config) 102 if len(warns) > 0 { 103 t.Fatalf("bad: %#v", warns) 104 } 105 if err != nil { 106 t.Fatalf("err: %s", err) 107 } 108 109 if b.config.RawBootWait != "10s" { 110 t.Fatalf("bad value: %s", b.config.RawBootWait) 111 } 112 113 // Test with a bad boot_wait 114 config["boot_wait"] = "this is not good" 115 warns, err = b.Prepare(config) 116 if len(warns) > 0 { 117 t.Fatalf("bad: %#v", warns) 118 } 119 if err == nil { 120 t.Fatal("should have error") 121 } 122 123 // Test with a good one 124 config["boot_wait"] = "5s" 125 b = Builder{} 126 warns, err = b.Prepare(config) 127 if len(warns) > 0 { 128 t.Fatalf("bad: %#v", warns) 129 } 130 if err != nil { 131 t.Fatalf("should not have error: %s", err) 132 } 133 } 134 135 func TestBuilderPrepare_VNCBindAddress(t *testing.T) { 136 var b Builder 137 config := testConfig() 138 139 // Test a default boot_wait 140 delete(config, "vnc_bind_address") 141 warns, err := b.Prepare(config) 142 if len(warns) > 0 { 143 t.Fatalf("bad: %#v", warns) 144 } 145 if err != nil { 146 t.Fatalf("err: %s", err) 147 } 148 149 if b.config.VNCBindAddress != "127.0.0.1" { 150 t.Fatalf("bad value: %s", b.config.VNCBindAddress) 151 } 152 } 153 154 func TestBuilderPrepare_DiskCompaction(t *testing.T) { 155 var b Builder 156 config := testConfig() 157 158 // Bad 159 config["skip_compaction"] = false 160 config["disk_compression"] = true 161 config["format"] = "img" 162 warns, err := b.Prepare(config) 163 if len(warns) > 0 { 164 t.Fatalf("bad: %#v", warns) 165 } 166 if err == nil { 167 t.Fatal("should have error") 168 } 169 if b.config.SkipCompaction != true { 170 t.Fatalf("SkipCompaction should be true") 171 } 172 if b.config.DiskCompression != false { 173 t.Fatalf("DiskCompression should be false") 174 } 175 176 // Good 177 config["skip_compaction"] = false 178 config["disk_compression"] = true 179 config["format"] = "qcow2" 180 b = Builder{} 181 warns, err = b.Prepare(config) 182 if len(warns) > 0 { 183 t.Fatalf("bad: %#v", warns) 184 } 185 if err != nil { 186 t.Fatalf("should not have error: %s", err) 187 } 188 if b.config.SkipCompaction != false { 189 t.Fatalf("SkipCompaction should be false") 190 } 191 if b.config.DiskCompression != true { 192 t.Fatalf("DiskCompression should be true") 193 } 194 } 195 196 func TestBuilderPrepare_DiskSize(t *testing.T) { 197 var b Builder 198 config := testConfig() 199 200 delete(config, "disk_size") 201 warns, err := b.Prepare(config) 202 if len(warns) > 0 { 203 t.Fatalf("bad: %#v", warns) 204 } 205 if err != nil { 206 t.Fatalf("bad err: %s", err) 207 } 208 209 if b.config.DiskSize != 40000 { 210 t.Fatalf("bad size: %d", b.config.DiskSize) 211 } 212 213 config["disk_size"] = 60000 214 b = Builder{} 215 warns, err = b.Prepare(config) 216 if len(warns) > 0 { 217 t.Fatalf("bad: %#v", warns) 218 } 219 if err != nil { 220 t.Fatalf("should not have error: %s", err) 221 } 222 223 if b.config.DiskSize != 60000 { 224 t.Fatalf("bad size: %d", b.config.DiskSize) 225 } 226 } 227 228 func TestBuilderPrepare_Format(t *testing.T) { 229 var b Builder 230 config := testConfig() 231 232 // Bad 233 config["format"] = "illegal value" 234 warns, err := b.Prepare(config) 235 if len(warns) > 0 { 236 t.Fatalf("bad: %#v", warns) 237 } 238 if err == nil { 239 t.Fatal("should have error") 240 } 241 242 // Good 243 config["format"] = "qcow2" 244 b = Builder{} 245 warns, err = b.Prepare(config) 246 if len(warns) > 0 { 247 t.Fatalf("bad: %#v", warns) 248 } 249 if err != nil { 250 t.Fatalf("should not have error: %s", err) 251 } 252 253 // Good 254 config["format"] = "raw" 255 b = Builder{} 256 warns, err = b.Prepare(config) 257 if len(warns) > 0 { 258 t.Fatalf("bad: %#v", warns) 259 } 260 if err != nil { 261 t.Fatalf("should not have error: %s", err) 262 } 263 } 264 265 func TestBuilderPrepare_InvalidKey(t *testing.T) { 266 var b Builder 267 config := testConfig() 268 269 // Add a random key 270 config["i_should_not_be_valid"] = true 271 warns, err := b.Prepare(config) 272 if len(warns) > 0 { 273 t.Fatalf("bad: %#v", warns) 274 } 275 if err == nil { 276 t.Fatal("should have error") 277 } 278 } 279 280 func TestBuilderPrepare_OutputDir(t *testing.T) { 281 var b Builder 282 config := testConfig() 283 284 // Test with existing dir 285 dir, err := ioutil.TempDir("", "packer") 286 if err != nil { 287 t.Fatalf("err: %s", err) 288 } 289 defer os.RemoveAll(dir) 290 291 config["output_directory"] = dir 292 b = Builder{} 293 warns, err := b.Prepare(config) 294 if len(warns) > 0 { 295 t.Fatalf("bad: %#v", warns) 296 } 297 if err == nil { 298 t.Fatal("should have error") 299 } 300 301 // Test with a good one 302 config["output_directory"] = "i-hope-i-dont-exist" 303 b = Builder{} 304 warns, err = b.Prepare(config) 305 if len(warns) > 0 { 306 t.Fatalf("bad: %#v", warns) 307 } 308 if err != nil { 309 t.Fatalf("should not have error: %s", err) 310 } 311 } 312 313 func TestBuilderPrepare_ShutdownTimeout(t *testing.T) { 314 var b Builder 315 config := testConfig() 316 317 // Test with a bad value 318 config["shutdown_timeout"] = "this is not good" 319 warns, err := b.Prepare(config) 320 if len(warns) > 0 { 321 t.Fatalf("bad: %#v", warns) 322 } 323 if err == nil { 324 t.Fatal("should have error") 325 } 326 327 // Test with a good one 328 config["shutdown_timeout"] = "5s" 329 b = Builder{} 330 warns, err = b.Prepare(config) 331 if len(warns) > 0 { 332 t.Fatalf("bad: %#v", warns) 333 } 334 if err != nil { 335 t.Fatalf("should not have error: %s", err) 336 } 337 } 338 339 func TestBuilderPrepare_SSHHostPort(t *testing.T) { 340 var b Builder 341 config := testConfig() 342 343 // Bad 344 config["ssh_host_port_min"] = 1000 345 config["ssh_host_port_max"] = 500 346 b = Builder{} 347 warns, err := b.Prepare(config) 348 if len(warns) > 0 { 349 t.Fatalf("bad: %#v", warns) 350 } 351 if err == nil { 352 t.Fatal("should have error") 353 } 354 355 // Bad 356 config["ssh_host_port_min"] = -500 357 b = Builder{} 358 warns, err = b.Prepare(config) 359 if len(warns) > 0 { 360 t.Fatalf("bad: %#v", warns) 361 } 362 if err == nil { 363 t.Fatal("should have error") 364 } 365 366 // Good 367 config["ssh_host_port_min"] = 500 368 config["ssh_host_port_max"] = 1000 369 b = Builder{} 370 warns, err = b.Prepare(config) 371 if len(warns) > 0 { 372 t.Fatalf("bad: %#v", warns) 373 } 374 if err != nil { 375 t.Fatalf("should not have error: %s", err) 376 } 377 } 378 379 func TestBuilderPrepare_SSHPrivateKey(t *testing.T) { 380 var b Builder 381 config := testConfig() 382 383 config["ssh_private_key_file"] = "" 384 b = Builder{} 385 warns, err := b.Prepare(config) 386 if len(warns) > 0 { 387 t.Fatalf("bad: %#v", warns) 388 } 389 if err != nil { 390 t.Fatalf("should not have error: %s", err) 391 } 392 393 config["ssh_private_key_file"] = "/i/dont/exist" 394 b = Builder{} 395 warns, err = b.Prepare(config) 396 if len(warns) > 0 { 397 t.Fatalf("bad: %#v", warns) 398 } 399 if err == nil { 400 t.Fatal("should have error") 401 } 402 403 // Test bad contents 404 tf, err := ioutil.TempFile("", "packer") 405 if err != nil { 406 t.Fatalf("err: %s", err) 407 } 408 defer os.Remove(tf.Name()) 409 defer tf.Close() 410 411 if _, err := tf.Write([]byte("HELLO!")); err != nil { 412 t.Fatalf("err: %s", err) 413 } 414 415 config["ssh_private_key_file"] = tf.Name() 416 b = Builder{} 417 warns, err = b.Prepare(config) 418 if len(warns) > 0 { 419 t.Fatalf("bad: %#v", warns) 420 } 421 if err == nil { 422 t.Fatal("should have error") 423 } 424 425 // Test good contents 426 tf.Seek(0, 0) 427 tf.Truncate(0) 428 tf.Write([]byte(testPem)) 429 config["ssh_private_key_file"] = tf.Name() 430 b = Builder{} 431 warns, err = b.Prepare(config) 432 if len(warns) > 0 { 433 t.Fatalf("bad: %#v", warns) 434 } 435 if err != nil { 436 t.Fatalf("err: %s", err) 437 } 438 } 439 440 func TestBuilderPrepare_SSHUser(t *testing.T) { 441 var b Builder 442 config := testConfig() 443 444 config["ssh_username"] = "" 445 b = Builder{} 446 warns, err := b.Prepare(config) 447 if len(warns) > 0 { 448 t.Fatalf("bad: %#v", warns) 449 } 450 if err == nil { 451 t.Fatal("should have error") 452 } 453 454 config["ssh_username"] = "exists" 455 b = Builder{} 456 warns, err = b.Prepare(config) 457 if len(warns) > 0 { 458 t.Fatalf("bad: %#v", warns) 459 } 460 if err != nil { 461 t.Fatalf("should not have error: %s", err) 462 } 463 } 464 465 func TestBuilderPrepare_SSHWaitTimeout(t *testing.T) { 466 var b Builder 467 config := testConfig() 468 469 // Test a default boot_wait 470 delete(config, "ssh_wait_timeout") 471 warns, err := b.Prepare(config) 472 if len(warns) > 0 { 473 t.Fatalf("bad: %#v", warns) 474 } 475 if err != nil { 476 t.Fatalf("err: %s", err) 477 } 478 479 // Test with a bad value 480 config["ssh_wait_timeout"] = "this is not good" 481 b = Builder{} 482 warns, err = b.Prepare(config) 483 if len(warns) > 0 { 484 t.Fatalf("bad: %#v", warns) 485 } 486 if err == nil { 487 t.Fatal("should have error") 488 } 489 490 // Test with a good one 491 config["ssh_wait_timeout"] = "5s" 492 b = Builder{} 493 warns, err = b.Prepare(config) 494 if len(warns) > 0 { 495 t.Fatalf("bad: %#v", warns) 496 } 497 if err != nil { 498 t.Fatalf("should not have error: %s", err) 499 } 500 } 501 502 func TestBuilderPrepare_QemuArgs(t *testing.T) { 503 var b Builder 504 config := testConfig() 505 506 // Test with empty 507 delete(config, "qemuargs") 508 warns, err := b.Prepare(config) 509 if len(warns) > 0 { 510 t.Fatalf("bad: %#v", warns) 511 } 512 if err != nil { 513 t.Fatalf("err: %s", err) 514 } 515 516 if !reflect.DeepEqual(b.config.QemuArgs, [][]string{}) { 517 t.Fatalf("bad: %#v", b.config.QemuArgs) 518 } 519 520 // Test with a good one 521 config["qemuargs"] = [][]interface{}{ 522 []interface{}{"foo", "bar", "baz"}, 523 } 524 525 b = Builder{} 526 warns, err = b.Prepare(config) 527 if len(warns) > 0 { 528 t.Fatalf("bad: %#v", warns) 529 } 530 if err != nil { 531 t.Fatalf("should not have error: %s", err) 532 } 533 534 expected := [][]string{ 535 []string{"foo", "bar", "baz"}, 536 } 537 538 if !reflect.DeepEqual(b.config.QemuArgs, expected) { 539 t.Fatalf("bad: %#v", b.config.QemuArgs) 540 } 541 }