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 }