github.com/mmcquillan/packer@v1.1.1-0.20171009221028-c85cf0483a5d/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  }
    80  
    81  func TestProvisionerPrepare_PlaybookFile(t *testing.T) {
    82  	var p Provisioner
    83  	config := testConfig(t)
    84  	defer os.Remove(config["command"].(string))
    85  
    86  	hostkey_file, err := ioutil.TempFile("", "hostkey")
    87  	if err != nil {
    88  		t.Fatalf("err: %s", err)
    89  	}
    90  	defer os.Remove(hostkey_file.Name())
    91  
    92  	publickey_file, err := ioutil.TempFile("", "publickey")
    93  	if err != nil {
    94  		t.Fatalf("err: %s", err)
    95  	}
    96  	defer os.Remove(publickey_file.Name())
    97  
    98  	config["ssh_host_key_file"] = hostkey_file.Name()
    99  	config["ssh_authorized_key_file"] = publickey_file.Name()
   100  
   101  	err = p.Prepare(config)
   102  	if err == nil {
   103  		t.Fatal("should have error")
   104  	}
   105  
   106  	playbook_file, err := ioutil.TempFile("", "playbook")
   107  	if err != nil {
   108  		t.Fatalf("err: %s", err)
   109  	}
   110  	defer os.Remove(playbook_file.Name())
   111  
   112  	config["playbook_file"] = playbook_file.Name()
   113  	err = p.Prepare(config)
   114  	if err != nil {
   115  		t.Fatalf("err: %s", err)
   116  	}
   117  }
   118  
   119  func TestProvisionerPrepare_HostKeyFile(t *testing.T) {
   120  	var p Provisioner
   121  	config := testConfig(t)
   122  	defer os.Remove(config["command"].(string))
   123  
   124  	publickey_file, err := ioutil.TempFile("", "publickey")
   125  	if err != nil {
   126  		t.Fatalf("err: %s", err)
   127  	}
   128  	defer os.Remove(publickey_file.Name())
   129  
   130  	playbook_file, err := ioutil.TempFile("", "playbook")
   131  	if err != nil {
   132  		t.Fatalf("err: %s", err)
   133  	}
   134  	defer os.Remove(playbook_file.Name())
   135  
   136  	filename := make([]byte, 10)
   137  	n, err := io.ReadFull(rand.Reader, filename)
   138  	if n != len(filename) || err != nil {
   139  		t.Fatal("could not create random file name")
   140  	}
   141  
   142  	config["ssh_host_key_file"] = fmt.Sprintf("%x", filename)
   143  	config["ssh_authorized_key_file"] = publickey_file.Name()
   144  	config["playbook_file"] = playbook_file.Name()
   145  
   146  	err = p.Prepare(config)
   147  	if err == nil {
   148  		t.Fatal("should error if ssh_host_key_file does not exist")
   149  	}
   150  
   151  	hostkey_file, err := ioutil.TempFile("", "hostkey")
   152  	if err != nil {
   153  		t.Fatalf("err: %s", err)
   154  	}
   155  	defer os.Remove(hostkey_file.Name())
   156  
   157  	config["ssh_host_key_file"] = hostkey_file.Name()
   158  	err = p.Prepare(config)
   159  	if err != nil {
   160  		t.Fatalf("err: %s", err)
   161  	}
   162  }
   163  
   164  func TestProvisionerPrepare_AuthorizedKeyFile(t *testing.T) {
   165  	var p Provisioner
   166  	config := testConfig(t)
   167  	defer os.Remove(config["command"].(string))
   168  
   169  	hostkey_file, err := ioutil.TempFile("", "hostkey")
   170  	if err != nil {
   171  		t.Fatalf("err: %s", err)
   172  	}
   173  	defer os.Remove(hostkey_file.Name())
   174  
   175  	playbook_file, err := ioutil.TempFile("", "playbook")
   176  	if err != nil {
   177  		t.Fatalf("err: %s", err)
   178  	}
   179  	defer os.Remove(playbook_file.Name())
   180  
   181  	filename := make([]byte, 10)
   182  	n, err := io.ReadFull(rand.Reader, filename)
   183  	if n != len(filename) || err != nil {
   184  		t.Fatal("could not create random file name")
   185  	}
   186  
   187  	config["ssh_host_key_file"] = hostkey_file.Name()
   188  	config["playbook_file"] = playbook_file.Name()
   189  	config["ssh_authorized_key_file"] = fmt.Sprintf("%x", filename)
   190  
   191  	err = p.Prepare(config)
   192  	if err == nil {
   193  		t.Errorf("should error if ssh_authorized_key_file does not exist")
   194  	}
   195  
   196  	publickey_file, err := ioutil.TempFile("", "publickey")
   197  	if err != nil {
   198  		t.Fatalf("err: %s", err)
   199  	}
   200  	defer os.Remove(publickey_file.Name())
   201  
   202  	config["ssh_authorized_key_file"] = publickey_file.Name()
   203  	err = p.Prepare(config)
   204  	if err != nil {
   205  		t.Errorf("err: %s", err)
   206  	}
   207  }
   208  
   209  func TestProvisionerPrepare_LocalPort(t *testing.T) {
   210  	var p Provisioner
   211  	config := testConfig(t)
   212  	defer os.Remove(config["command"].(string))
   213  
   214  	hostkey_file, err := ioutil.TempFile("", "hostkey")
   215  	if err != nil {
   216  		t.Fatalf("err: %s", err)
   217  	}
   218  	defer os.Remove(hostkey_file.Name())
   219  
   220  	publickey_file, err := ioutil.TempFile("", "publickey")
   221  	if err != nil {
   222  		t.Fatalf("err: %s", err)
   223  	}
   224  	defer os.Remove(publickey_file.Name())
   225  
   226  	playbook_file, err := ioutil.TempFile("", "playbook")
   227  	if err != nil {
   228  		t.Fatalf("err: %s", err)
   229  	}
   230  	defer os.Remove(playbook_file.Name())
   231  
   232  	config["ssh_host_key_file"] = hostkey_file.Name()
   233  	config["ssh_authorized_key_file"] = publickey_file.Name()
   234  	config["playbook_file"] = playbook_file.Name()
   235  
   236  	config["local_port"] = "65537"
   237  	err = p.Prepare(config)
   238  	if err == nil {
   239  		t.Fatal("should have error")
   240  	}
   241  
   242  	config["local_port"] = "22222"
   243  	err = p.Prepare(config)
   244  	if err != nil {
   245  		t.Fatalf("err: %s", err)
   246  	}
   247  }
   248  
   249  func TestProvisionerPrepare_InventoryDirectory(t *testing.T) {
   250  	var p Provisioner
   251  	config := testConfig(t)
   252  	defer os.Remove(config["command"].(string))
   253  
   254  	hostkey_file, err := ioutil.TempFile("", "hostkey")
   255  	if err != nil {
   256  		t.Fatalf("err: %s", err)
   257  	}
   258  	defer os.Remove(hostkey_file.Name())
   259  
   260  	publickey_file, err := ioutil.TempFile("", "publickey")
   261  	if err != nil {
   262  		t.Fatalf("err: %s", err)
   263  	}
   264  	defer os.Remove(publickey_file.Name())
   265  
   266  	playbook_file, err := ioutil.TempFile("", "playbook")
   267  	if err != nil {
   268  		t.Fatalf("err: %s", err)
   269  	}
   270  	defer os.Remove(playbook_file.Name())
   271  
   272  	config["ssh_host_key_file"] = hostkey_file.Name()
   273  	config["ssh_authorized_key_file"] = publickey_file.Name()
   274  	config["playbook_file"] = playbook_file.Name()
   275  
   276  	config["inventory_directory"] = "doesnotexist"
   277  	err = p.Prepare(config)
   278  	if err == nil {
   279  		t.Errorf("should error if inventory_directory does not exist")
   280  	}
   281  
   282  	inventoryDirectory, err := ioutil.TempDir("", "some_inventory_dir")
   283  	if err != nil {
   284  		t.Fatalf("err: %s", err)
   285  	}
   286  	defer os.Remove(inventoryDirectory)
   287  
   288  	config["inventory_directory"] = inventoryDirectory
   289  	err = p.Prepare(config)
   290  	if err != nil {
   291  		t.Fatalf("err: %s", err)
   292  	}
   293  }
   294  
   295  func TestAnsibleGetVersion(t *testing.T) {
   296  	if os.Getenv("PACKER_ACC") == "" {
   297  		t.Skip("This test is only run with PACKER_ACC=1 and it requires Ansible to be installed")
   298  	}
   299  
   300  	var p Provisioner
   301  	p.config.Command = "ansible-playbook"
   302  	err := p.getVersion()
   303  	if err != nil {
   304  		t.Fatalf("err: %s", err)
   305  	}
   306  }
   307  
   308  func TestAnsibleGetVersionError(t *testing.T) {
   309  	var p Provisioner
   310  	p.config.Command = "./test-fixtures/exit1"
   311  	err := p.getVersion()
   312  	if err == nil {
   313  		t.Fatal("Should return error")
   314  	}
   315  	if !strings.Contains(err.Error(), "./test-fixtures/exit1 --version") {
   316  		t.Fatal("Error message should include command name")
   317  	}
   318  }
   319  
   320  func TestAnsibleLongMessages(t *testing.T) {
   321  	if os.Getenv("PACKER_ACC") == "" {
   322  		t.Skip("This test is only run with PACKER_ACC=1 and it requires Ansible to be installed")
   323  	}
   324  
   325  	var p Provisioner
   326  	p.config.Command = "ansible-playbook"
   327  	p.config.PlaybookFile = "./test-fixtures/long-debug-message.yml"
   328  	err := p.Prepare()
   329  	if err != nil {
   330  		t.Fatalf("err: %s", err)
   331  	}
   332  
   333  	comm := &packer.MockCommunicator{}
   334  	ui := &packer.BasicUi{
   335  		Reader: new(bytes.Buffer),
   336  		Writer: new(bytes.Buffer),
   337  	}
   338  
   339  	err = p.Provision(ui, comm)
   340  	if err != nil {
   341  		t.Fatalf("err: %s", err)
   342  	}
   343  }