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 }