github.com/rahart/packer@v0.12.2-0.20161229105310-282bb6ad370f/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  	"testing"
    12  
    13  	"github.com/mitchellh/packer/packer"
    14  )
    15  
    16  // Be sure to remove the Ansible stub file in each test with:
    17  //   defer os.Remove(config["command"].(string))
    18  func testConfig(t *testing.T) map[string]interface{} {
    19  	m := make(map[string]interface{})
    20  	wd, err := os.Getwd()
    21  	if err != nil {
    22  		t.Fatalf("err: %s", err)
    23  	}
    24  	ansible_stub := path.Join(wd, "packer-ansible-stub.sh")
    25  
    26  	err = ioutil.WriteFile(ansible_stub, []byte("#!/usr/bin/env bash\necho ansible 1.6.0"), 0777)
    27  	if err != nil {
    28  		t.Fatalf("err: %s", err)
    29  	}
    30  	m["command"] = ansible_stub
    31  
    32  	return m
    33  }
    34  
    35  func TestProvisioner_Impl(t *testing.T) {
    36  	var raw interface{}
    37  	raw = &Provisioner{}
    38  	if _, ok := raw.(packer.Provisioner); !ok {
    39  		t.Fatalf("must be a Provisioner")
    40  	}
    41  }
    42  
    43  func TestProvisionerPrepare_Defaults(t *testing.T) {
    44  	var p Provisioner
    45  	config := testConfig(t)
    46  	defer os.Remove(config["command"].(string))
    47  
    48  	err := p.Prepare(config)
    49  	if err == nil {
    50  		t.Fatalf("should have error")
    51  	}
    52  
    53  	hostkey_file, err := ioutil.TempFile("", "hostkey")
    54  	if err != nil {
    55  		t.Fatalf("err: %s", err)
    56  	}
    57  	defer os.Remove(hostkey_file.Name())
    58  
    59  	publickey_file, err := ioutil.TempFile("", "publickey")
    60  	if err != nil {
    61  		t.Fatalf("err: %s", err)
    62  	}
    63  	defer os.Remove(publickey_file.Name())
    64  
    65  	playbook_file, err := ioutil.TempFile("", "playbook")
    66  	if err != nil {
    67  		t.Fatalf("err: %s", err)
    68  	}
    69  	defer os.Remove(playbook_file.Name())
    70  
    71  	config["ssh_host_key_file"] = hostkey_file.Name()
    72  	config["ssh_authorized_key_file"] = publickey_file.Name()
    73  	config["playbook_file"] = playbook_file.Name()
    74  	err = p.Prepare(config)
    75  	if err != nil {
    76  		t.Fatalf("err: %s", err)
    77  	}
    78  }
    79  
    80  func TestProvisionerPrepare_PlaybookFile(t *testing.T) {
    81  	var p Provisioner
    82  	config := testConfig(t)
    83  	defer os.Remove(config["command"].(string))
    84  
    85  	hostkey_file, err := ioutil.TempFile("", "hostkey")
    86  	if err != nil {
    87  		t.Fatalf("err: %s", err)
    88  	}
    89  	defer os.Remove(hostkey_file.Name())
    90  
    91  	publickey_file, err := ioutil.TempFile("", "publickey")
    92  	if err != nil {
    93  		t.Fatalf("err: %s", err)
    94  	}
    95  	defer os.Remove(publickey_file.Name())
    96  
    97  	config["ssh_host_key_file"] = hostkey_file.Name()
    98  	config["ssh_authorized_key_file"] = publickey_file.Name()
    99  
   100  	err = p.Prepare(config)
   101  	if err == nil {
   102  		t.Fatal("should have error")
   103  	}
   104  
   105  	playbook_file, err := ioutil.TempFile("", "playbook")
   106  	if err != nil {
   107  		t.Fatalf("err: %s", err)
   108  	}
   109  	defer os.Remove(playbook_file.Name())
   110  
   111  	config["playbook_file"] = playbook_file.Name()
   112  	err = p.Prepare(config)
   113  	if err != nil {
   114  		t.Fatalf("err: %s", err)
   115  	}
   116  }
   117  
   118  func TestProvisionerPrepare_HostKeyFile(t *testing.T) {
   119  	var p Provisioner
   120  	config := testConfig(t)
   121  	defer os.Remove(config["command"].(string))
   122  
   123  	publickey_file, err := ioutil.TempFile("", "publickey")
   124  	if err != nil {
   125  		t.Fatalf("err: %s", err)
   126  	}
   127  	defer os.Remove(publickey_file.Name())
   128  
   129  	playbook_file, err := ioutil.TempFile("", "playbook")
   130  	if err != nil {
   131  		t.Fatalf("err: %s", err)
   132  	}
   133  	defer os.Remove(playbook_file.Name())
   134  
   135  	filename := make([]byte, 10)
   136  	n, err := io.ReadFull(rand.Reader, filename)
   137  	if n != len(filename) || err != nil {
   138  		t.Fatal("could not create random file name")
   139  	}
   140  
   141  	config["ssh_host_key_file"] = fmt.Sprintf("%x", filename)
   142  	config["ssh_authorized_key_file"] = publickey_file.Name()
   143  	config["playbook_file"] = playbook_file.Name()
   144  
   145  	err = p.Prepare(config)
   146  	if err == nil {
   147  		t.Fatal("should error if ssh_host_key_file does not exist")
   148  	}
   149  
   150  	hostkey_file, err := ioutil.TempFile("", "hostkey")
   151  	if err != nil {
   152  		t.Fatalf("err: %s", err)
   153  	}
   154  	defer os.Remove(hostkey_file.Name())
   155  
   156  	config["ssh_host_key_file"] = hostkey_file.Name()
   157  	err = p.Prepare(config)
   158  	if err != nil {
   159  		t.Fatalf("err: %s", err)
   160  	}
   161  }
   162  
   163  func TestProvisionerPrepare_AuthorizedKeyFile(t *testing.T) {
   164  	var p Provisioner
   165  	config := testConfig(t)
   166  	defer os.Remove(config["command"].(string))
   167  
   168  	hostkey_file, err := ioutil.TempFile("", "hostkey")
   169  	if err != nil {
   170  		t.Fatalf("err: %s", err)
   171  	}
   172  	defer os.Remove(hostkey_file.Name())
   173  
   174  	playbook_file, err := ioutil.TempFile("", "playbook")
   175  	if err != nil {
   176  		t.Fatalf("err: %s", err)
   177  	}
   178  	defer os.Remove(playbook_file.Name())
   179  
   180  	filename := make([]byte, 10)
   181  	n, err := io.ReadFull(rand.Reader, filename)
   182  	if n != len(filename) || err != nil {
   183  		t.Fatal("could not create random file name")
   184  	}
   185  
   186  	config["ssh_host_key_file"] = hostkey_file.Name()
   187  	config["playbook_file"] = playbook_file.Name()
   188  	config["ssh_authorized_key_file"] = fmt.Sprintf("%x", filename)
   189  
   190  	err = p.Prepare(config)
   191  	if err == nil {
   192  		t.Errorf("should error if ssh_authorized_key_file does not exist")
   193  	}
   194  
   195  	publickey_file, err := ioutil.TempFile("", "publickey")
   196  	if err != nil {
   197  		t.Fatalf("err: %s", err)
   198  	}
   199  	defer os.Remove(publickey_file.Name())
   200  
   201  	config["ssh_authorized_key_file"] = publickey_file.Name()
   202  	err = p.Prepare(config)
   203  	if err != nil {
   204  		t.Errorf("err: %s", err)
   205  	}
   206  }
   207  
   208  func TestProvisionerPrepare_LocalPort(t *testing.T) {
   209  	var p Provisioner
   210  	config := testConfig(t)
   211  	defer os.Remove(config["command"].(string))
   212  
   213  	hostkey_file, err := ioutil.TempFile("", "hostkey")
   214  	if err != nil {
   215  		t.Fatalf("err: %s", err)
   216  	}
   217  	defer os.Remove(hostkey_file.Name())
   218  
   219  	publickey_file, err := ioutil.TempFile("", "publickey")
   220  	if err != nil {
   221  		t.Fatalf("err: %s", err)
   222  	}
   223  	defer os.Remove(publickey_file.Name())
   224  
   225  	playbook_file, err := ioutil.TempFile("", "playbook")
   226  	if err != nil {
   227  		t.Fatalf("err: %s", err)
   228  	}
   229  	defer os.Remove(playbook_file.Name())
   230  
   231  	config["ssh_host_key_file"] = hostkey_file.Name()
   232  	config["ssh_authorized_key_file"] = publickey_file.Name()
   233  	config["playbook_file"] = playbook_file.Name()
   234  
   235  	config["local_port"] = "65537"
   236  	err = p.Prepare(config)
   237  	if err == nil {
   238  		t.Fatal("should have error")
   239  	}
   240  
   241  	config["local_port"] = "22222"
   242  	err = p.Prepare(config)
   243  	if err != nil {
   244  		t.Fatalf("err: %s", err)
   245  	}
   246  }
   247  
   248  func TestAnsibleGetVersion(t *testing.T) {
   249  	if os.Getenv("PACKER_ACC") == "" {
   250  		t.Skip("This test is only run with PACKER_ACC=1 and it requires Ansible to be installed")
   251  	}
   252  
   253  	var p Provisioner
   254  	p.config.Command = "ansible-playbook"
   255  	err := p.getVersion()
   256  	if err != nil {
   257  		t.Fatalf("err: %s", err)
   258  	}
   259  }
   260  
   261  func TestAnsibleLongMessages(t *testing.T) {
   262  	if os.Getenv("PACKER_ACC") == "" {
   263  		t.Skip("This test is only run with PACKER_ACC=1 and it requires Ansible to be installed")
   264  	}
   265  
   266  	var p Provisioner
   267  	p.config.Command = "ansible-playbook"
   268  	p.config.PlaybookFile = "./test-fixtures/long-debug-message.yml"
   269  	err := p.Prepare()
   270  	if err != nil {
   271  		t.Fatalf("err: %s", err)
   272  	}
   273  
   274  	comm := &packer.MockCommunicator{}
   275  	ui := &packer.BasicUi{
   276  		Reader: new(bytes.Buffer),
   277  		Writer: new(bytes.Buffer),
   278  	}
   279  
   280  	err = p.Provision(ui, comm)
   281  	if err != nil {
   282  		t.Fatalf("err: %s", err)
   283  	}
   284  }