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  }