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  }