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 }