github.com/rvichery/terraform@v0.11.10/builtin/provisioners/salt-masterless/resource_provisioner_test.go (about) 1 package saltmasterless 2 3 import ( 4 "io/ioutil" 5 "os" 6 "strings" 7 "testing" 8 9 "github.com/hashicorp/terraform/config" 10 "github.com/hashicorp/terraform/helper/schema" 11 "github.com/hashicorp/terraform/terraform" 12 ) 13 14 func testConfig(t *testing.T, c map[string]interface{}) *terraform.ResourceConfig { 15 r, err := config.NewRawConfig(c) 16 if err != nil { 17 t.Fatalf("bad: %s", err) 18 } 19 20 return terraform.NewResourceConfig(r) 21 } 22 23 func TestResourceProvisioner_impl(t *testing.T) { 24 var _ terraform.ResourceProvisioner = Provisioner() 25 } 26 27 func TestProvisioner(t *testing.T) { 28 if err := Provisioner().(*schema.Provisioner).InternalValidate(); err != nil { 29 t.Fatalf("err: %s", err) 30 } 31 } 32 33 func TestResourceProvisioner_Validate_good(t *testing.T) { 34 dir, err := ioutil.TempDir("", "_terraform_saltmasterless_test") 35 if err != nil { 36 t.Fatalf("Error when creating temp dir: %v", err) 37 } 38 39 defer os.RemoveAll(dir) // clean up 40 41 c := testConfig(t, map[string]interface{}{ 42 "local_state_tree": dir, 43 }) 44 warn, errs := Provisioner().Validate(c) 45 if len(warn) > 0 { 46 t.Fatalf("Warnings: %v", warn) 47 } 48 if len(errs) > 0 { 49 t.Fatalf("Errors: %v", errs) 50 } 51 } 52 53 func TestResourceProvider_Validate_missing_required(t *testing.T) { 54 c := testConfig(t, map[string]interface{}{ 55 "remote_state_tree": "_default", 56 }) 57 warn, errs := Provisioner().Validate(c) 58 if len(warn) > 0 { 59 t.Fatalf("Warnings: %v", warn) 60 } 61 if len(errs) == 0 { 62 t.Fatalf("Should have errors") 63 } 64 } 65 66 func TestResourceProvider_Validate_LocalStateTree_doesnt_exist(t *testing.T) { 67 c := testConfig(t, map[string]interface{}{ 68 "local_state_tree": "/i/dont/exist", 69 }) 70 warn, errs := Provisioner().Validate(c) 71 if len(warn) > 0 { 72 t.Fatalf("Warnings: %v", warn) 73 } 74 if len(errs) == 0 { 75 t.Fatalf("Should have errors") 76 } 77 } 78 79 func TestResourceProvisioner_Validate_invalid(t *testing.T) { 80 dir, err := ioutil.TempDir("", "_terraform_saltmasterless_test") 81 if err != nil { 82 t.Fatalf("Error when creating temp dir: %v", err) 83 } 84 85 defer os.RemoveAll(dir) // clean up 86 87 c := testConfig(t, map[string]interface{}{ 88 "local_state_tree": dir, 89 "i_am_not_valid": "_invalid", 90 }) 91 92 warn, errs := Provisioner().Validate(c) 93 if len(warn) > 0 { 94 t.Fatalf("Warnings: %v", warn) 95 } 96 if len(errs) == 0 { 97 t.Fatalf("Should have errors") 98 } 99 } 100 101 func TestProvisionerPrepare_CustomState(t *testing.T) { 102 c := map[string]interface{}{ 103 "local_state_tree": "/tmp/local_state_tree", 104 } 105 106 p, err := decodeConfig( 107 schema.TestResourceDataRaw(t, Provisioner().(*schema.Provisioner).Schema, c), 108 ) 109 110 if err != nil { 111 t.Fatalf("Error: %v", err) 112 } 113 114 if !strings.Contains(p.CmdArgs, "state.highstate") { 115 t.Fatal("CmdArgs should contain state.highstate") 116 } 117 118 if err != nil { 119 t.Fatalf("err: %s", err) 120 } 121 122 c = map[string]interface{}{ 123 "local_state_tree": "/tmp/local_state_tree", 124 "custom_state": "custom", 125 } 126 127 p, err = decodeConfig( 128 schema.TestResourceDataRaw(t, Provisioner().(*schema.Provisioner).Schema, c), 129 ) 130 131 if err != nil { 132 t.Fatalf("Error: %v", err) 133 } 134 135 if !strings.Contains(p.CmdArgs, "state.sls custom") { 136 t.Fatal("CmdArgs should contain state.sls custom") 137 } 138 139 if err != nil { 140 t.Fatalf("err: %s", err) 141 } 142 } 143 144 func TestProvisionerPrepare_MinionConfig(t *testing.T) { 145 dir, err := ioutil.TempDir("", "_terraform_saltmasterless_test") 146 if err != nil { 147 t.Fatalf("Error when creating temp dir: %v", err) 148 } 149 150 defer os.RemoveAll(dir) // clean up 151 152 c := testConfig(t, map[string]interface{}{ 153 "local_state_tree": dir, 154 "minion_config_file": "i/dont/exist", 155 }) 156 157 warns, errs := Provisioner().Validate(c) 158 159 if len(warns) > 0 { 160 t.Fatalf("Warnings: %v", warns) 161 } 162 if len(errs) == 0 { 163 t.Fatalf("Should have error") 164 } 165 166 tf, err := ioutil.TempFile("", "minion") 167 if err != nil { 168 t.Fatalf("error tempfile: %s", err) 169 } 170 171 defer os.Remove(tf.Name()) 172 173 c = testConfig(t, map[string]interface{}{ 174 "local_state_tree": dir, 175 "minion_config_file": tf.Name(), 176 }) 177 178 warns, errs = Provisioner().Validate(c) 179 180 if len(warns) > 0 { 181 t.Fatalf("Warnings: %v", warns) 182 } 183 if len(errs) > 0 { 184 t.Fatalf("errs: %s", errs) 185 } 186 } 187 188 func TestProvisionerPrepare_MinionConfig_RemoteStateTree(t *testing.T) { 189 dir, err := ioutil.TempDir("", "_terraform_saltmasterless_test") 190 if err != nil { 191 t.Fatalf("Error when creating temp dir: %v", err) 192 } 193 194 c := testConfig(t, map[string]interface{}{ 195 "local_state_tree": dir, 196 "minion_config_file": "i/dont/exist", 197 "remote_state_tree": "i/dont/exist/remote_state_tree", 198 }) 199 200 warns, errs := Provisioner().Validate(c) 201 if len(warns) > 0 { 202 t.Fatalf("Warnings: %v", warns) 203 } 204 if len(errs) == 0 { 205 t.Fatalf("Should be error") 206 } 207 } 208 209 func TestProvisionerPrepare_MinionConfig_RemotePillarRoots(t *testing.T) { 210 dir, err := ioutil.TempDir("", "_terraform_saltmasterless_test") 211 if err != nil { 212 t.Fatalf("Error when creating temp dir: %v", err) 213 } 214 215 c := testConfig(t, map[string]interface{}{ 216 "local_state_tree": dir, 217 "minion_config_file": "i/dont/exist", 218 "remote_pillar_roots": "i/dont/exist/remote_pillar_roots", 219 }) 220 221 warns, errs := Provisioner().Validate(c) 222 if len(warns) > 0 { 223 t.Fatalf("Warnings: %v", warns) 224 } 225 if len(errs) == 0 { 226 t.Fatalf("Should be error") 227 } 228 } 229 230 func TestProvisionerPrepare_LocalPillarRoots(t *testing.T) { 231 dir, err := ioutil.TempDir("", "_terraform_saltmasterless_test") 232 if err != nil { 233 t.Fatalf("Error when creating temp dir: %v", err) 234 } 235 236 c := testConfig(t, map[string]interface{}{ 237 "local_state_tree": dir, 238 "minion_config_file": "i/dont/exist", 239 "local_pillar_roots": "i/dont/exist/local_pillar_roots", 240 }) 241 242 warns, errs := Provisioner().Validate(c) 243 if len(warns) > 0 { 244 t.Fatalf("Warnings: %v", warns) 245 } 246 if len(errs) == 0 { 247 t.Fatalf("Should be error") 248 } 249 } 250 251 func TestProvisionerSudo(t *testing.T) { 252 dir, err := ioutil.TempDir("", "_terraform_saltmasterless_test") 253 if err != nil { 254 t.Fatalf("Error when creating temp dir: %v", err) 255 } 256 257 c := map[string]interface{}{ 258 "local_state_tree": dir, 259 } 260 261 p, err := decodeConfig( 262 schema.TestResourceDataRaw(t, Provisioner().(*schema.Provisioner).Schema, c), 263 ) 264 265 withSudo := p.sudo("echo hello") 266 if withSudo != "sudo echo hello" { 267 t.Fatalf("sudo command not generated correctly") 268 } 269 270 c = map[string]interface{}{ 271 "local_state_tree": dir, 272 "disable_sudo": "true", 273 } 274 275 p, err = decodeConfig( 276 schema.TestResourceDataRaw(t, Provisioner().(*schema.Provisioner).Schema, c), 277 ) 278 279 if err != nil { 280 t.Fatalf("err: %s", err) 281 } 282 withoutSudo := p.sudo("echo hello") 283 if withoutSudo != "echo hello" { 284 t.Fatalf("sudo-less command not generated correctly") 285 } 286 } 287 288 func TestProvisionerPrepare_RemoteStateTree(t *testing.T) { 289 dir, err := ioutil.TempDir("", "_terraform_saltmasterless_test") 290 if err != nil { 291 t.Fatalf("Error when creating temp dir: %v", err) 292 } 293 294 c := map[string]interface{}{ 295 "local_state_tree": dir, 296 "remote_state_tree": "/remote_state_tree", 297 } 298 299 p, err := decodeConfig( 300 schema.TestResourceDataRaw(t, Provisioner().(*schema.Provisioner).Schema, c), 301 ) 302 303 if err != nil { 304 t.Fatalf("err: %s", err) 305 } 306 307 if !strings.Contains(p.CmdArgs, "--file-root=/remote_state_tree") { 308 t.Fatal("--file-root should be set in CmdArgs") 309 } 310 } 311 312 func TestProvisionerPrepare_RemotePillarRoots(t *testing.T) { 313 dir, err := ioutil.TempDir("", "_terraform_saltmasterless_test") 314 if err != nil { 315 t.Fatalf("Error when creating temp dir: %v", err) 316 } 317 318 c := map[string]interface{}{ 319 "local_state_tree": dir, 320 "remote_pillar_roots": "/remote_pillar_roots", 321 } 322 323 p, err := decodeConfig( 324 schema.TestResourceDataRaw(t, Provisioner().(*schema.Provisioner).Schema, c), 325 ) 326 327 if err != nil { 328 t.Fatalf("err: %s", err) 329 } 330 331 if !strings.Contains(p.CmdArgs, "--pillar-root=/remote_pillar_roots") { 332 t.Fatal("--pillar-root should be set in CmdArgs") 333 } 334 } 335 336 func TestProvisionerPrepare_RemoteStateTree_Default(t *testing.T) { 337 dir, err := ioutil.TempDir("", "_terraform_saltmasterless_test") 338 if err != nil { 339 t.Fatalf("Error when creating temp dir: %v", err) 340 } 341 342 c := map[string]interface{}{ 343 "local_state_tree": dir, 344 } 345 346 p, err := decodeConfig( 347 schema.TestResourceDataRaw(t, Provisioner().(*schema.Provisioner).Schema, c), 348 ) 349 350 if err != nil { 351 t.Fatalf("err: %s", err) 352 } 353 354 if !strings.Contains(p.CmdArgs, "--file-root=/srv/salt") { 355 t.Fatal("--file-root should be set in CmdArgs") 356 } 357 } 358 359 func TestProvisionerPrepare_RemotePillarRoots_Default(t *testing.T) { 360 dir, err := ioutil.TempDir("", "_terraform_saltmasterless_test") 361 if err != nil { 362 t.Fatalf("Error when creating temp dir: %v", err) 363 } 364 365 c := map[string]interface{}{ 366 "local_state_tree": dir, 367 } 368 369 p, err := decodeConfig( 370 schema.TestResourceDataRaw(t, Provisioner().(*schema.Provisioner).Schema, c), 371 ) 372 373 if err != nil { 374 t.Fatalf("err: %s", err) 375 } 376 377 if !strings.Contains(p.CmdArgs, "--pillar-root=/srv/pillar") { 378 t.Fatal("--pillar-root should be set in CmdArgs") 379 } 380 } 381 382 func TestProvisionerPrepare_NoExitOnFailure(t *testing.T) { 383 dir, err := ioutil.TempDir("", "_terraform_saltmasterless_test") 384 if err != nil { 385 t.Fatalf("Error when creating temp dir: %v", err) 386 } 387 388 c := map[string]interface{}{ 389 "local_state_tree": dir, 390 } 391 392 p, err := decodeConfig( 393 schema.TestResourceDataRaw(t, Provisioner().(*schema.Provisioner).Schema, c), 394 ) 395 396 if err != nil { 397 t.Fatalf("err: %s", err) 398 } 399 400 if !strings.Contains(p.CmdArgs, "--retcode-passthrough") { 401 t.Fatal("--retcode-passthrough should be set in CmdArgs") 402 } 403 404 c = map[string]interface{}{ 405 "no_exit_on_failure": true, 406 } 407 408 p, err = decodeConfig( 409 schema.TestResourceDataRaw(t, Provisioner().(*schema.Provisioner).Schema, c), 410 ) 411 412 if err != nil { 413 t.Fatalf("err: %s", err) 414 } 415 416 if strings.Contains(p.CmdArgs, "--retcode-passthrough") { 417 t.Fatal("--retcode-passthrough should not be set in CmdArgs") 418 } 419 } 420 421 func TestProvisionerPrepare_LogLevel(t *testing.T) { 422 dir, err := ioutil.TempDir("", "_terraform_saltmasterless_test") 423 if err != nil { 424 t.Fatalf("Error when creating temp dir: %v", err) 425 } 426 427 c := map[string]interface{}{ 428 "local_state_tree": dir, 429 } 430 431 p, err := decodeConfig( 432 schema.TestResourceDataRaw(t, Provisioner().(*schema.Provisioner).Schema, c), 433 ) 434 435 if err != nil { 436 t.Fatalf("err: %s", err) 437 } 438 439 if !strings.Contains(p.CmdArgs, "-l info") { 440 t.Fatal("-l info should be set in CmdArgs") 441 } 442 443 c = map[string]interface{}{ 444 "log_level": "debug", 445 } 446 447 p, err = decodeConfig( 448 schema.TestResourceDataRaw(t, Provisioner().(*schema.Provisioner).Schema, c), 449 ) 450 451 if err != nil { 452 t.Fatalf("err: %s", err) 453 } 454 455 if !strings.Contains(p.CmdArgs, "-l debug") { 456 t.Fatal("-l debug should be set in CmdArgs") 457 } 458 }