github.com/StackPointCloud/packer@v0.10.2-0.20180716202532-b28098e0f79b/provisioner/ansible/provisioner_test.go (about)

     1  package ansible
     2  
     3  import (
     4  	"bytes"
     5  	"crypto/rand"
     6  	"fmt"
     7  	"io"
     8  	"io/ioutil"
     9  	"os"
    10  	"path"
    11  	"strings"
    12  	"testing"
    13  
    14  	"github.com/hashicorp/packer/packer"
    15  )
    16  
    17  // Be sure to remove the Ansible stub file in each test with:
    18  //   defer os.Remove(config["command"].(string))
    19  func testConfig(t *testing.T) map[string]interface{} {
    20  	m := make(map[string]interface{})
    21  	wd, err := os.Getwd()
    22  	if err != nil {
    23  		t.Fatalf("err: %s", err)
    24  	}
    25  	ansible_stub := path.Join(wd, "packer-ansible-stub.sh")
    26  
    27  	err = ioutil.WriteFile(ansible_stub, []byte("#!/usr/bin/env bash\necho ansible 1.6.0"), 0777)
    28  	if err != nil {
    29  		t.Fatalf("err: %s", err)
    30  	}
    31  	m["command"] = ansible_stub
    32  
    33  	return m
    34  }
    35  
    36  func TestProvisioner_Impl(t *testing.T) {
    37  	var raw interface{}
    38  	raw = &Provisioner{}
    39  	if _, ok := raw.(packer.Provisioner); !ok {
    40  		t.Fatalf("must be a Provisioner")
    41  	}
    42  }
    43  
    44  func TestProvisionerPrepare_Defaults(t *testing.T) {
    45  	var p Provisioner
    46  	config := testConfig(t)
    47  	defer os.Remove(config["command"].(string))
    48  
    49  	err := p.Prepare(config)
    50  	if err == nil {
    51  		t.Fatalf("should have error")
    52  	}
    53  
    54  	hostkey_file, err := ioutil.TempFile("", "hostkey")
    55  	if err != nil {
    56  		t.Fatalf("err: %s", err)
    57  	}
    58  	defer os.Remove(hostkey_file.Name())
    59  
    60  	publickey_file, err := ioutil.TempFile("", "publickey")
    61  	if err != nil {
    62  		t.Fatalf("err: %s", err)
    63  	}
    64  	defer os.Remove(publickey_file.Name())
    65  
    66  	playbook_file, err := ioutil.TempFile("", "playbook")
    67  	if err != nil {
    68  		t.Fatalf("err: %s", err)
    69  	}
    70  	defer os.Remove(playbook_file.Name())
    71  
    72  	config["ssh_host_key_file"] = hostkey_file.Name()
    73  	config["ssh_authorized_key_file"] = publickey_file.Name()
    74  	config["playbook_file"] = playbook_file.Name()
    75  	err = p.Prepare(config)
    76  	if err != nil {
    77  		t.Fatalf("err: %s", err)
    78  	}
    79  	defer os.Remove(playbook_file.Name())
    80  
    81  	err = os.Unsetenv("USER")
    82  	if err != nil {
    83  		t.Fatalf("err: %s", err)
    84  	}
    85  	err = p.Prepare(config)
    86  	if err != nil {
    87  		t.Fatalf("err: %s", err)
    88  	}
    89  }
    90  
    91  func TestProvisionerPrepare_PlaybookFile(t *testing.T) {
    92  	var p Provisioner
    93  	config := testConfig(t)
    94  	defer os.Remove(config["command"].(string))
    95  
    96  	hostkey_file, err := ioutil.TempFile("", "hostkey")
    97  	if err != nil {
    98  		t.Fatalf("err: %s", err)
    99  	}
   100  	defer os.Remove(hostkey_file.Name())
   101  
   102  	publickey_file, err := ioutil.TempFile("", "publickey")
   103  	if err != nil {
   104  		t.Fatalf("err: %s", err)
   105  	}
   106  	defer os.Remove(publickey_file.Name())
   107  
   108  	config["ssh_host_key_file"] = hostkey_file.Name()
   109  	config["ssh_authorized_key_file"] = publickey_file.Name()
   110  
   111  	err = p.Prepare(config)
   112  	if err == nil {
   113  		t.Fatal("should have error")
   114  	}
   115  
   116  	playbook_file, err := ioutil.TempFile("", "playbook")
   117  	if err != nil {
   118  		t.Fatalf("err: %s", err)
   119  	}
   120  	defer os.Remove(playbook_file.Name())
   121  
   122  	config["playbook_file"] = playbook_file.Name()
   123  	err = p.Prepare(config)
   124  	if err != nil {
   125  		t.Fatalf("err: %s", err)
   126  	}
   127  }
   128  
   129  func TestProvisionerPrepare_HostKeyFile(t *testing.T) {
   130  	var p Provisioner
   131  	config := testConfig(t)
   132  	defer os.Remove(config["command"].(string))
   133  
   134  	publickey_file, err := ioutil.TempFile("", "publickey")
   135  	if err != nil {
   136  		t.Fatalf("err: %s", err)
   137  	}
   138  	defer os.Remove(publickey_file.Name())
   139  
   140  	playbook_file, err := ioutil.TempFile("", "playbook")
   141  	if err != nil {
   142  		t.Fatalf("err: %s", err)
   143  	}
   144  	defer os.Remove(playbook_file.Name())
   145  
   146  	filename := make([]byte, 10)
   147  	n, err := io.ReadFull(rand.Reader, filename)
   148  	if n != len(filename) || err != nil {
   149  		t.Fatal("could not create random file name")
   150  	}
   151  
   152  	config["ssh_host_key_file"] = fmt.Sprintf("%x", filename)
   153  	config["ssh_authorized_key_file"] = publickey_file.Name()
   154  	config["playbook_file"] = playbook_file.Name()
   155  
   156  	err = p.Prepare(config)
   157  	if err == nil {
   158  		t.Fatal("should error if ssh_host_key_file does not exist")
   159  	}
   160  
   161  	hostkey_file, err := ioutil.TempFile("", "hostkey")
   162  	if err != nil {
   163  		t.Fatalf("err: %s", err)
   164  	}
   165  	defer os.Remove(hostkey_file.Name())
   166  
   167  	config["ssh_host_key_file"] = hostkey_file.Name()
   168  	err = p.Prepare(config)
   169  	if err != nil {
   170  		t.Fatalf("err: %s", err)
   171  	}
   172  }
   173  
   174  func TestProvisionerPrepare_AuthorizedKeyFile(t *testing.T) {
   175  	var p Provisioner
   176  	config := testConfig(t)
   177  	defer os.Remove(config["command"].(string))
   178  
   179  	hostkey_file, err := ioutil.TempFile("", "hostkey")
   180  	if err != nil {
   181  		t.Fatalf("err: %s", err)
   182  	}
   183  	defer os.Remove(hostkey_file.Name())
   184  
   185  	playbook_file, err := ioutil.TempFile("", "playbook")
   186  	if err != nil {
   187  		t.Fatalf("err: %s", err)
   188  	}
   189  	defer os.Remove(playbook_file.Name())
   190  
   191  	filename := make([]byte, 10)
   192  	n, err := io.ReadFull(rand.Reader, filename)
   193  	if n != len(filename) || err != nil {
   194  		t.Fatal("could not create random file name")
   195  	}
   196  
   197  	config["ssh_host_key_file"] = hostkey_file.Name()
   198  	config["playbook_file"] = playbook_file.Name()
   199  	config["ssh_authorized_key_file"] = fmt.Sprintf("%x", filename)
   200  
   201  	err = p.Prepare(config)
   202  	if err == nil {
   203  		t.Errorf("should error if ssh_authorized_key_file does not exist")
   204  	}
   205  
   206  	publickey_file, err := ioutil.TempFile("", "publickey")
   207  	if err != nil {
   208  		t.Fatalf("err: %s", err)
   209  	}
   210  	defer os.Remove(publickey_file.Name())
   211  
   212  	config["ssh_authorized_key_file"] = publickey_file.Name()
   213  	err = p.Prepare(config)
   214  	if err != nil {
   215  		t.Errorf("err: %s", err)
   216  	}
   217  }
   218  
   219  func TestProvisionerPrepare_LocalPort(t *testing.T) {
   220  	var p Provisioner
   221  	config := testConfig(t)
   222  	defer os.Remove(config["command"].(string))
   223  
   224  	hostkey_file, err := ioutil.TempFile("", "hostkey")
   225  	if err != nil {
   226  		t.Fatalf("err: %s", err)
   227  	}
   228  	defer os.Remove(hostkey_file.Name())
   229  
   230  	publickey_file, err := ioutil.TempFile("", "publickey")
   231  	if err != nil {
   232  		t.Fatalf("err: %s", err)
   233  	}
   234  	defer os.Remove(publickey_file.Name())
   235  
   236  	playbook_file, err := ioutil.TempFile("", "playbook")
   237  	if err != nil {
   238  		t.Fatalf("err: %s", err)
   239  	}
   240  	defer os.Remove(playbook_file.Name())
   241  
   242  	config["ssh_host_key_file"] = hostkey_file.Name()
   243  	config["ssh_authorized_key_file"] = publickey_file.Name()
   244  	config["playbook_file"] = playbook_file.Name()
   245  
   246  	config["local_port"] = "65537"
   247  	err = p.Prepare(config)
   248  	if err == nil {
   249  		t.Fatal("should have error")
   250  	}
   251  
   252  	config["local_port"] = "22222"
   253  	err = p.Prepare(config)
   254  	if err != nil {
   255  		t.Fatalf("err: %s", err)
   256  	}
   257  }
   258  
   259  func TestProvisionerPrepare_InventoryDirectory(t *testing.T) {
   260  	var p Provisioner
   261  	config := testConfig(t)
   262  	defer os.Remove(config["command"].(string))
   263  
   264  	hostkey_file, err := ioutil.TempFile("", "hostkey")
   265  	if err != nil {
   266  		t.Fatalf("err: %s", err)
   267  	}
   268  	defer os.Remove(hostkey_file.Name())
   269  
   270  	publickey_file, err := ioutil.TempFile("", "publickey")
   271  	if err != nil {
   272  		t.Fatalf("err: %s", err)
   273  	}
   274  	defer os.Remove(publickey_file.Name())
   275  
   276  	playbook_file, err := ioutil.TempFile("", "playbook")
   277  	if err != nil {
   278  		t.Fatalf("err: %s", err)
   279  	}
   280  	defer os.Remove(playbook_file.Name())
   281  
   282  	config["ssh_host_key_file"] = hostkey_file.Name()
   283  	config["ssh_authorized_key_file"] = publickey_file.Name()
   284  	config["playbook_file"] = playbook_file.Name()
   285  
   286  	config["inventory_directory"] = "doesnotexist"
   287  	err = p.Prepare(config)
   288  	if err == nil {
   289  		t.Errorf("should error if inventory_directory does not exist")
   290  	}
   291  
   292  	inventoryDirectory, err := ioutil.TempDir("", "some_inventory_dir")
   293  	if err != nil {
   294  		t.Fatalf("err: %s", err)
   295  	}
   296  	defer os.Remove(inventoryDirectory)
   297  
   298  	config["inventory_directory"] = inventoryDirectory
   299  	err = p.Prepare(config)
   300  	if err != nil {
   301  		t.Fatalf("err: %s", err)
   302  	}
   303  }
   304  
   305  func TestAnsibleGetVersion(t *testing.T) {
   306  	if os.Getenv("PACKER_ACC") == "" {
   307  		t.Skip("This test is only run with PACKER_ACC=1 and it requires Ansible to be installed")
   308  	}
   309  
   310  	var p Provisioner
   311  	p.config.Command = "ansible-playbook"
   312  	err := p.getVersion()
   313  	if err != nil {
   314  		t.Fatalf("err: %s", err)
   315  	}
   316  }
   317  
   318  func TestAnsibleGetVersionError(t *testing.T) {
   319  	var p Provisioner
   320  	p.config.Command = "./test-fixtures/exit1"
   321  	err := p.getVersion()
   322  	if err == nil {
   323  		t.Fatal("Should return error")
   324  	}
   325  	if !strings.Contains(err.Error(), "./test-fixtures/exit1 --version") {
   326  		t.Fatal("Error message should include command name")
   327  	}
   328  }
   329  
   330  func TestAnsibleLongMessages(t *testing.T) {
   331  	if os.Getenv("PACKER_ACC") == "" {
   332  		t.Skip("This test is only run with PACKER_ACC=1 and it requires Ansible to be installed")
   333  	}
   334  
   335  	var p Provisioner
   336  	p.config.Command = "ansible-playbook"
   337  	p.config.PlaybookFile = "./test-fixtures/long-debug-message.yml"
   338  	err := p.Prepare()
   339  	if err != nil {
   340  		t.Fatalf("err: %s", err)
   341  	}
   342  
   343  	comm := &packer.MockCommunicator{}
   344  	ui := &packer.BasicUi{
   345  		Reader: new(bytes.Buffer),
   346  		Writer: new(bytes.Buffer),
   347  	}
   348  
   349  	err = p.Provision(ui, comm)
   350  	if err != nil {
   351  		t.Fatalf("err: %s", err)
   352  	}
   353  }