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