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  }