github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/terraform/context_validate_test.go (about)

     1  package terraform
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  	"testing"
     7  )
     8  
     9  func TestContext2Validate_badCount(t *testing.T) {
    10  	p := testProvider("aws")
    11  	m := testModule(t, "validate-bad-count")
    12  	c := testContext2(t, &ContextOpts{
    13  		Module: m,
    14  		Providers: map[string]ResourceProviderFactory{
    15  			"aws": testProviderFuncFixed(p),
    16  		},
    17  	})
    18  
    19  	w, e := c.Validate()
    20  	if len(w) > 0 {
    21  		t.Fatalf("bad: %#v", w)
    22  	}
    23  	if len(e) == 0 {
    24  		t.Fatalf("bad: %#v", e)
    25  	}
    26  }
    27  
    28  func TestContext2Validate_badVar(t *testing.T) {
    29  	p := testProvider("aws")
    30  	m := testModule(t, "validate-bad-var")
    31  	c := testContext2(t, &ContextOpts{
    32  		Module: m,
    33  		Providers: map[string]ResourceProviderFactory{
    34  			"aws": testProviderFuncFixed(p),
    35  		},
    36  	})
    37  
    38  	w, e := c.Validate()
    39  	if len(w) > 0 {
    40  		t.Fatalf("bad: %#v", w)
    41  	}
    42  	if len(e) == 0 {
    43  		t.Fatalf("bad: %#v", e)
    44  	}
    45  }
    46  
    47  func TestContext2Validate_varMapOverrideOld(t *testing.T) {
    48  	m := testModule(t, "validate-module-pc-vars")
    49  	p := testProvider("aws")
    50  	c := testContext2(t, &ContextOpts{
    51  		Module: m,
    52  		Providers: map[string]ResourceProviderFactory{
    53  			"aws": testProviderFuncFixed(p),
    54  		},
    55  		Variables: map[string]interface{}{
    56  			"foo.foo": "bar",
    57  		},
    58  	})
    59  
    60  	w, e := c.Validate()
    61  	if len(w) > 0 {
    62  		t.Fatalf("bad: %#v", w)
    63  	}
    64  	if len(e) == 0 {
    65  		t.Fatalf("bad: %s", e)
    66  	}
    67  }
    68  
    69  func TestContext2Validate_varNoDefaultExplicitType(t *testing.T) {
    70  	m := testModule(t, "validate-var-no-default-explicit-type")
    71  	c := testContext2(t, &ContextOpts{
    72  		Module: m,
    73  	})
    74  
    75  	w, e := c.Validate()
    76  	if len(w) > 0 {
    77  		t.Fatalf("bad: %#v", w)
    78  	}
    79  	if len(e) == 0 {
    80  		t.Fatalf("bad: %#v", e)
    81  	}
    82  }
    83  
    84  func TestContext2Validate_computedVar(t *testing.T) {
    85  	p := testProvider("aws")
    86  	m := testModule(t, "validate-computed-var")
    87  	c := testContext2(t, &ContextOpts{
    88  		Module: m,
    89  		Providers: map[string]ResourceProviderFactory{
    90  			"aws":  testProviderFuncFixed(p),
    91  			"test": testProviderFuncFixed(testProvider("test")),
    92  		},
    93  	})
    94  
    95  	p.ValidateFn = func(c *ResourceConfig) ([]string, []error) {
    96  		if !c.IsComputed("value") {
    97  			return nil, []error{fmt.Errorf("value isn't computed")}
    98  		}
    99  
   100  		return nil, c.CheckSet([]string{"value"})
   101  	}
   102  
   103  	p.ConfigureFn = func(c *ResourceConfig) error {
   104  		return fmt.Errorf("Configure should not be called for provider")
   105  	}
   106  
   107  	w, e := c.Validate()
   108  	if len(w) > 0 {
   109  		t.Fatalf("bad: %#v", w)
   110  	}
   111  	if len(e) > 0 {
   112  		for _, err := range e {
   113  			t.Errorf("bad: %s", err)
   114  		}
   115  	}
   116  }
   117  
   118  // Test that validate allows through computed counts. We do this and allow
   119  // them to fail during "plan" since we can't know if the computed values
   120  // can be realized during a plan.
   121  func TestContext2Validate_countComputed(t *testing.T) {
   122  	p := testProvider("aws")
   123  	m := testModule(t, "validate-count-computed")
   124  	c := testContext2(t, &ContextOpts{
   125  		Module: m,
   126  		Providers: map[string]ResourceProviderFactory{
   127  			"aws": testProviderFuncFixed(p),
   128  		},
   129  	})
   130  
   131  	w, e := c.Validate()
   132  	if len(w) > 0 {
   133  		t.Fatalf("bad: %#v", w)
   134  	}
   135  	if len(e) > 0 {
   136  		t.Fatalf("bad: %s", e)
   137  	}
   138  }
   139  
   140  func TestContext2Validate_countNegative(t *testing.T) {
   141  	p := testProvider("aws")
   142  	m := testModule(t, "validate-count-negative")
   143  	c := testContext2(t, &ContextOpts{
   144  		Module: m,
   145  		Providers: map[string]ResourceProviderFactory{
   146  			"aws": testProviderFuncFixed(p),
   147  		},
   148  	})
   149  
   150  	w, e := c.Validate()
   151  	if len(w) > 0 {
   152  		t.Fatalf("bad: %#v", w)
   153  	}
   154  	if len(e) == 0 {
   155  		t.Fatalf("bad: %#v", e)
   156  	}
   157  }
   158  
   159  func TestContext2Validate_countVariable(t *testing.T) {
   160  	p := testProvider("aws")
   161  	m := testModule(t, "apply-count-variable")
   162  	c := testContext2(t, &ContextOpts{
   163  		Module: m,
   164  		Providers: map[string]ResourceProviderFactory{
   165  			"aws": testProviderFuncFixed(p),
   166  		},
   167  	})
   168  
   169  	w, e := c.Validate()
   170  	if len(w) > 0 {
   171  		t.Fatalf("bad: %#v", w)
   172  	}
   173  	if len(e) > 0 {
   174  		t.Fatalf("bad: %s", e)
   175  	}
   176  }
   177  
   178  func TestContext2Validate_countVariableNoDefault(t *testing.T) {
   179  	p := testProvider("aws")
   180  	m := testModule(t, "validate-count-variable")
   181  	c := testContext2(t, &ContextOpts{
   182  		Module: m,
   183  		Providers: map[string]ResourceProviderFactory{
   184  			"aws": testProviderFuncFixed(p),
   185  		},
   186  	})
   187  
   188  	w, e := c.Validate()
   189  	if len(w) > 0 {
   190  		t.Fatalf("bad: %#v", w)
   191  	}
   192  	if len(e) != 1 {
   193  		t.Fatalf("bad: %s", e)
   194  	}
   195  }
   196  
   197  /*
   198  TODO: What should we do here?
   199  func TestContext2Validate_cycle(t *testing.T) {
   200  	p := testProvider("aws")
   201  	m := testModule(t, "validate-cycle")
   202  	c := testContext2(t, &ContextOpts{
   203  		Module: m,
   204  		Providers: map[string]ResourceProviderFactory{
   205  			"aws": testProviderFuncFixed(p),
   206  		},
   207  	})
   208  
   209  	w, e := c.Validate()
   210  	if len(w) > 0 {
   211  		t.Fatalf("expected no warns, got: %#v", w)
   212  	}
   213  	if len(e) != 1 {
   214  		t.Fatalf("expected 1 err, got: %s", e)
   215  	}
   216  }
   217  */
   218  
   219  func TestContext2Validate_moduleBadOutput(t *testing.T) {
   220  	p := testProvider("aws")
   221  	m := testModule(t, "validate-bad-module-output")
   222  	c := testContext2(t, &ContextOpts{
   223  		Module: m,
   224  		Providers: map[string]ResourceProviderFactory{
   225  			"aws": testProviderFuncFixed(p),
   226  		},
   227  	})
   228  
   229  	w, e := c.Validate()
   230  	if len(w) > 0 {
   231  		t.Fatalf("bad: %#v", w)
   232  	}
   233  	if len(e) == 0 {
   234  		t.Fatalf("bad: %s", e)
   235  	}
   236  }
   237  
   238  func TestContext2Validate_moduleGood(t *testing.T) {
   239  	p := testProvider("aws")
   240  	m := testModule(t, "validate-good-module")
   241  	c := testContext2(t, &ContextOpts{
   242  		Module: m,
   243  		Providers: map[string]ResourceProviderFactory{
   244  			"aws": testProviderFuncFixed(p),
   245  		},
   246  	})
   247  
   248  	w, e := c.Validate()
   249  	if len(w) > 0 {
   250  		t.Fatalf("bad: %#v", w)
   251  	}
   252  	if len(e) > 0 {
   253  		t.Fatalf("bad: %#v", e)
   254  	}
   255  }
   256  
   257  func TestContext2Validate_moduleBadResource(t *testing.T) {
   258  	m := testModule(t, "validate-module-bad-rc")
   259  	p := testProvider("aws")
   260  	c := testContext2(t, &ContextOpts{
   261  		Module: m,
   262  		Providers: map[string]ResourceProviderFactory{
   263  			"aws": testProviderFuncFixed(p),
   264  		},
   265  	})
   266  
   267  	p.ValidateResourceReturnErrors = []error{fmt.Errorf("bad")}
   268  
   269  	w, e := c.Validate()
   270  	if len(w) > 0 {
   271  		t.Fatalf("bad: %#v", w)
   272  	}
   273  	if len(e) == 0 {
   274  		t.Fatalf("bad: %#v", e)
   275  	}
   276  }
   277  
   278  func TestContext2Validate_moduleDepsShouldNotCycle(t *testing.T) {
   279  	m := testModule(t, "validate-module-deps-cycle")
   280  	p := testProvider("aws")
   281  	ctx := testContext2(t, &ContextOpts{
   282  		Module: m,
   283  		Providers: map[string]ResourceProviderFactory{
   284  			"aws": testProviderFuncFixed(p),
   285  		},
   286  	})
   287  
   288  	w, e := ctx.Validate()
   289  
   290  	if len(w) > 0 {
   291  		t.Fatalf("expected no warnings, got: %s", w)
   292  	}
   293  	if len(e) > 0 {
   294  		t.Fatalf("expected no errors, got: %s", e)
   295  	}
   296  }
   297  
   298  func TestContext2Validate_moduleProviderInherit(t *testing.T) {
   299  	m := testModule(t, "validate-module-pc-inherit")
   300  	p := testProvider("aws")
   301  	c := testContext2(t, &ContextOpts{
   302  		Module: m,
   303  		Providers: map[string]ResourceProviderFactory{
   304  			"aws": testProviderFuncFixed(p),
   305  		},
   306  	})
   307  
   308  	p.ValidateFn = func(c *ResourceConfig) ([]string, []error) {
   309  		return nil, c.CheckSet([]string{"set"})
   310  	}
   311  
   312  	w, e := c.Validate()
   313  	if len(w) > 0 {
   314  		t.Fatalf("bad: %#v", w)
   315  	}
   316  	if len(e) > 0 {
   317  		t.Fatalf("bad: %s", e)
   318  	}
   319  }
   320  
   321  func TestContext2Validate_moduleProviderInheritOrphan(t *testing.T) {
   322  	m := testModule(t, "validate-module-pc-inherit-orphan")
   323  	p := testProvider("aws")
   324  	c := testContext2(t, &ContextOpts{
   325  		Module: m,
   326  		Providers: map[string]ResourceProviderFactory{
   327  			"aws": testProviderFuncFixed(p),
   328  		},
   329  		State: &State{
   330  			Modules: []*ModuleState{
   331  				&ModuleState{
   332  					Path: []string{"root", "child"},
   333  					Resources: map[string]*ResourceState{
   334  						"aws_instance.bar": &ResourceState{
   335  							Type: "aws_instance",
   336  							Primary: &InstanceState{
   337  								ID: "bar",
   338  							},
   339  						},
   340  					},
   341  				},
   342  			},
   343  		},
   344  	})
   345  
   346  	p.ValidateFn = func(c *ResourceConfig) ([]string, []error) {
   347  		v, ok := c.Get("set")
   348  		if !ok {
   349  			return nil, []error{fmt.Errorf("not set")}
   350  		}
   351  		if v != "bar" {
   352  			return nil, []error{fmt.Errorf("bad: %#v", v)}
   353  		}
   354  
   355  		return nil, nil
   356  	}
   357  
   358  	w, e := c.Validate()
   359  	if len(w) > 0 {
   360  		t.Fatalf("bad: %#v", w)
   361  	}
   362  	if len(e) > 0 {
   363  		t.Fatalf("bad: %s", e)
   364  	}
   365  }
   366  
   367  func TestContext2Validate_moduleProviderVar(t *testing.T) {
   368  	m := testModule(t, "validate-module-pc-vars")
   369  	p := testProvider("aws")
   370  	c := testContext2(t, &ContextOpts{
   371  		Module: m,
   372  		Providers: map[string]ResourceProviderFactory{
   373  			"aws": testProviderFuncFixed(p),
   374  		},
   375  		Variables: map[string]interface{}{
   376  			"provider_var": "bar",
   377  		},
   378  	})
   379  
   380  	p.ValidateFn = func(c *ResourceConfig) ([]string, []error) {
   381  		return nil, c.CheckSet([]string{"foo"})
   382  	}
   383  
   384  	w, e := c.Validate()
   385  	if len(w) > 0 {
   386  		t.Fatalf("bad: %#v", w)
   387  	}
   388  	if len(e) > 0 {
   389  		t.Fatalf("bad: %s", e)
   390  	}
   391  }
   392  
   393  func TestContext2Validate_moduleProviderInheritUnused(t *testing.T) {
   394  	m := testModule(t, "validate-module-pc-inherit-unused")
   395  	p := testProvider("aws")
   396  	c := testContext2(t, &ContextOpts{
   397  		Module: m,
   398  		Providers: map[string]ResourceProviderFactory{
   399  			"aws": testProviderFuncFixed(p),
   400  		},
   401  	})
   402  
   403  	p.ValidateFn = func(c *ResourceConfig) ([]string, []error) {
   404  		return nil, c.CheckSet([]string{"foo"})
   405  	}
   406  
   407  	w, e := c.Validate()
   408  	if len(w) > 0 {
   409  		t.Fatalf("bad: %#v", w)
   410  	}
   411  	if len(e) > 0 {
   412  		t.Fatalf("bad: %s", e)
   413  	}
   414  }
   415  
   416  func TestContext2Validate_orphans(t *testing.T) {
   417  	p := testProvider("aws")
   418  	m := testModule(t, "validate-good")
   419  	state := &State{
   420  		Modules: []*ModuleState{
   421  			&ModuleState{
   422  				Path: rootModulePath,
   423  				Resources: map[string]*ResourceState{
   424  					"aws_instance.web": &ResourceState{
   425  						Type: "aws_instance",
   426  						Primary: &InstanceState{
   427  							ID: "bar",
   428  						},
   429  					},
   430  				},
   431  			},
   432  		},
   433  	}
   434  	c := testContext2(t, &ContextOpts{
   435  		Module: m,
   436  		Providers: map[string]ResourceProviderFactory{
   437  			"aws": testProviderFuncFixed(p),
   438  		},
   439  		State: state,
   440  	})
   441  
   442  	p.ValidateResourceFn = func(
   443  		t string, c *ResourceConfig) ([]string, []error) {
   444  		return nil, c.CheckSet([]string{"foo"})
   445  	}
   446  
   447  	w, e := c.Validate()
   448  	if len(w) > 0 {
   449  		t.Fatalf("bad: %#v", w)
   450  	}
   451  	if len(e) > 0 {
   452  		t.Fatalf("bad: %s", e)
   453  	}
   454  }
   455  
   456  func TestContext2Validate_providerConfig_bad(t *testing.T) {
   457  	m := testModule(t, "validate-bad-pc")
   458  	p := testProvider("aws")
   459  	c := testContext2(t, &ContextOpts{
   460  		Module: m,
   461  		Providers: map[string]ResourceProviderFactory{
   462  			"aws": testProviderFuncFixed(p),
   463  		},
   464  	})
   465  
   466  	p.ValidateReturnErrors = []error{fmt.Errorf("bad")}
   467  
   468  	w, e := c.Validate()
   469  	if len(w) > 0 {
   470  		t.Fatalf("bad: %#v", w)
   471  	}
   472  	if len(e) == 0 {
   473  		t.Fatalf("bad: %s", e)
   474  	}
   475  	if !strings.Contains(fmt.Sprintf("%s", e), "bad") {
   476  		t.Fatalf("bad: %s", e)
   477  	}
   478  }
   479  
   480  func TestContext2Validate_providerConfig_badEmpty(t *testing.T) {
   481  	m := testModule(t, "validate-bad-pc-empty")
   482  	p := testProvider("aws")
   483  	c := testContext2(t, &ContextOpts{
   484  		Module: m,
   485  		Providers: map[string]ResourceProviderFactory{
   486  			"aws": testProviderFuncFixed(p),
   487  		},
   488  	})
   489  
   490  	p.ValidateReturnErrors = []error{fmt.Errorf("bad")}
   491  
   492  	w, e := c.Validate()
   493  	if len(w) > 0 {
   494  		t.Fatalf("bad: %#v", w)
   495  	}
   496  	if len(e) == 0 {
   497  		t.Fatalf("bad: %#v", e)
   498  	}
   499  }
   500  
   501  func TestContext2Validate_providerConfig_good(t *testing.T) {
   502  	m := testModule(t, "validate-bad-pc")
   503  	p := testProvider("aws")
   504  	c := testContext2(t, &ContextOpts{
   505  		Module: m,
   506  		Providers: map[string]ResourceProviderFactory{
   507  			"aws": testProviderFuncFixed(p),
   508  		},
   509  	})
   510  
   511  	w, e := c.Validate()
   512  	if len(w) > 0 {
   513  		t.Fatalf("bad: %#v", w)
   514  	}
   515  	if len(e) > 0 {
   516  		t.Fatalf("bad: %#v", e)
   517  	}
   518  }
   519  
   520  func TestContext2Validate_provisionerConfig_bad(t *testing.T) {
   521  	m := testModule(t, "validate-bad-prov-conf")
   522  	p := testProvider("aws")
   523  	pr := testProvisioner()
   524  	c := testContext2(t, &ContextOpts{
   525  		Module: m,
   526  		Providers: map[string]ResourceProviderFactory{
   527  			"aws": testProviderFuncFixed(p),
   528  		},
   529  		Provisioners: map[string]ResourceProvisionerFactory{
   530  			"shell": testProvisionerFuncFixed(pr),
   531  		},
   532  	})
   533  
   534  	pr.ValidateReturnErrors = []error{fmt.Errorf("bad")}
   535  
   536  	w, e := c.Validate()
   537  	if len(w) > 0 {
   538  		t.Fatalf("bad: %#v", w)
   539  	}
   540  	if len(e) == 0 {
   541  		t.Fatalf("bad: %#v", e)
   542  	}
   543  }
   544  
   545  func TestContext2Validate_provisionerConfig_good(t *testing.T) {
   546  	m := testModule(t, "validate-bad-prov-conf")
   547  	p := testProvider("aws")
   548  	pr := testProvisioner()
   549  	pr.ValidateFn = func(c *ResourceConfig) ([]string, []error) {
   550  		if c == nil {
   551  			t.Fatalf("missing resource config for provisioner")
   552  		}
   553  		return nil, c.CheckSet([]string{"command"})
   554  	}
   555  	c := testContext2(t, &ContextOpts{
   556  		Module: m,
   557  		Providers: map[string]ResourceProviderFactory{
   558  			"aws": testProviderFuncFixed(p),
   559  		},
   560  		Provisioners: map[string]ResourceProvisionerFactory{
   561  			"shell": testProvisionerFuncFixed(pr),
   562  		},
   563  	})
   564  
   565  	w, e := c.Validate()
   566  	if len(w) > 0 {
   567  		t.Fatalf("bad: %#v", w)
   568  	}
   569  	if len(e) > 0 {
   570  		t.Fatalf("bad: %#v", e)
   571  	}
   572  }
   573  
   574  func TestContext2Validate_requiredVar(t *testing.T) {
   575  	m := testModule(t, "validate-required-var")
   576  	p := testProvider("aws")
   577  	c := testContext2(t, &ContextOpts{
   578  		Module: m,
   579  		Providers: map[string]ResourceProviderFactory{
   580  			"aws": testProviderFuncFixed(p),
   581  		},
   582  	})
   583  
   584  	w, e := c.Validate()
   585  	if len(w) > 0 {
   586  		t.Fatalf("bad: %#v", w)
   587  	}
   588  	if len(e) == 0 {
   589  		t.Fatalf("bad: %s", e)
   590  	}
   591  }
   592  
   593  func TestContext2Validate_resourceConfig_bad(t *testing.T) {
   594  	m := testModule(t, "validate-bad-rc")
   595  	p := testProvider("aws")
   596  	c := testContext2(t, &ContextOpts{
   597  		Module: m,
   598  		Providers: map[string]ResourceProviderFactory{
   599  			"aws": testProviderFuncFixed(p),
   600  		},
   601  	})
   602  
   603  	p.ValidateResourceReturnErrors = []error{fmt.Errorf("bad")}
   604  
   605  	w, e := c.Validate()
   606  	if len(w) > 0 {
   607  		t.Fatalf("bad: %#v", w)
   608  	}
   609  	if len(e) == 0 {
   610  		t.Fatalf("bad: %s", e)
   611  	}
   612  }
   613  
   614  func TestContext2Validate_resourceConfig_good(t *testing.T) {
   615  	m := testModule(t, "validate-bad-rc")
   616  	p := testProvider("aws")
   617  	c := testContext2(t, &ContextOpts{
   618  		Module: m,
   619  		Providers: map[string]ResourceProviderFactory{
   620  			"aws": testProviderFuncFixed(p),
   621  		},
   622  	})
   623  
   624  	w, e := c.Validate()
   625  	if len(w) > 0 {
   626  		t.Fatalf("bad: %#v", w)
   627  	}
   628  	if len(e) > 0 {
   629  		t.Fatalf("bad: %#v", e)
   630  	}
   631  }
   632  
   633  func TestContext2Validate_resourceNameSymbol(t *testing.T) {
   634  	p := testProvider("aws")
   635  	m := testModule(t, "validate-resource-name-symbol")
   636  	c := testContext2(t, &ContextOpts{
   637  		Module: m,
   638  		Providers: map[string]ResourceProviderFactory{
   639  			"aws": testProviderFuncFixed(p),
   640  		},
   641  	})
   642  
   643  	w, e := c.Validate()
   644  	if len(w) > 0 {
   645  		t.Fatalf("bad: %#v", w)
   646  	}
   647  	if len(e) == 0 {
   648  		t.Fatalf("bad: %s", e)
   649  	}
   650  }
   651  
   652  func TestContext2Validate_selfRef(t *testing.T) {
   653  	p := testProvider("aws")
   654  	m := testModule(t, "validate-self-ref")
   655  	c := testContext2(t, &ContextOpts{
   656  		Module: m,
   657  		Providers: map[string]ResourceProviderFactory{
   658  			"aws": testProviderFuncFixed(p),
   659  		},
   660  	})
   661  
   662  	w, e := c.Validate()
   663  	if len(w) > 0 {
   664  		t.Fatalf("bad: %#v", w)
   665  	}
   666  	if len(e) == 0 {
   667  		t.Fatalf("bad: %s", e)
   668  	}
   669  }
   670  
   671  func TestContext2Validate_selfRefMulti(t *testing.T) {
   672  	p := testProvider("aws")
   673  	m := testModule(t, "validate-self-ref-multi")
   674  	c := testContext2(t, &ContextOpts{
   675  		Module: m,
   676  		Providers: map[string]ResourceProviderFactory{
   677  			"aws": testProviderFuncFixed(p),
   678  		},
   679  	})
   680  
   681  	w, e := c.Validate()
   682  	if len(w) > 0 {
   683  		t.Fatalf("bad: %#v", w)
   684  	}
   685  	if len(e) == 0 {
   686  		t.Fatalf("bad: %#v", e)
   687  	}
   688  }
   689  
   690  func TestContext2Validate_selfRefMultiAll(t *testing.T) {
   691  	p := testProvider("aws")
   692  	m := testModule(t, "validate-self-ref-multi-all")
   693  	c := testContext2(t, &ContextOpts{
   694  		Module: m,
   695  		Providers: map[string]ResourceProviderFactory{
   696  			"aws": testProviderFuncFixed(p),
   697  		},
   698  	})
   699  
   700  	w, e := c.Validate()
   701  	if len(w) > 0 {
   702  		t.Fatalf("bad: %#v", w)
   703  	}
   704  	if len(e) == 0 {
   705  		t.Fatalf("bad: %#v", e)
   706  	}
   707  }
   708  
   709  func TestContext2Validate_tainted(t *testing.T) {
   710  	p := testProvider("aws")
   711  	m := testModule(t, "validate-good")
   712  	state := &State{
   713  		Modules: []*ModuleState{
   714  			&ModuleState{
   715  				Path: rootModulePath,
   716  				Resources: map[string]*ResourceState{
   717  					"aws_instance.foo": &ResourceState{
   718  						Type: "aws_instance",
   719  						Primary: &InstanceState{
   720  							ID:      "bar",
   721  							Tainted: true,
   722  						},
   723  					},
   724  				},
   725  			},
   726  		},
   727  	}
   728  	c := testContext2(t, &ContextOpts{
   729  		Module: m,
   730  		Providers: map[string]ResourceProviderFactory{
   731  			"aws": testProviderFuncFixed(p),
   732  		},
   733  		State: state,
   734  	})
   735  
   736  	p.ValidateResourceFn = func(
   737  		t string, c *ResourceConfig) ([]string, []error) {
   738  		return nil, c.CheckSet([]string{"foo"})
   739  	}
   740  
   741  	w, e := c.Validate()
   742  	if len(w) > 0 {
   743  		t.Fatalf("bad: %#v", w)
   744  	}
   745  	if len(e) > 0 {
   746  		t.Fatalf("bad: %#v", e)
   747  	}
   748  }
   749  
   750  func TestContext2Validate_targetedDestroy(t *testing.T) {
   751  	m := testModule(t, "validate-targeted")
   752  	p := testProvider("aws")
   753  	pr := testProvisioner()
   754  	p.ApplyFn = testApplyFn
   755  	p.DiffFn = testDiffFn
   756  	ctx := testContext2(t, &ContextOpts{
   757  		Module: m,
   758  		Providers: map[string]ResourceProviderFactory{
   759  			"aws": testProviderFuncFixed(p),
   760  		},
   761  		Provisioners: map[string]ResourceProvisionerFactory{
   762  			"shell": testProvisionerFuncFixed(pr),
   763  		},
   764  		State: &State{
   765  			Modules: []*ModuleState{
   766  				&ModuleState{
   767  					Path: rootModulePath,
   768  					Resources: map[string]*ResourceState{
   769  						"aws_instance.foo": resourceState("aws_instance", "i-bcd345"),
   770  						"aws_instance.bar": resourceState("aws_instance", "i-abc123"),
   771  					},
   772  				},
   773  			},
   774  		},
   775  		Targets: []string{"aws_instance.foo"},
   776  		Destroy: true,
   777  	})
   778  
   779  	w, e := ctx.Validate()
   780  	if len(w) > 0 {
   781  		warnStr := ""
   782  		for _, v := range w {
   783  			warnStr = warnStr + " " + v
   784  		}
   785  		t.Fatalf("bad: %s", warnStr)
   786  	}
   787  	if len(e) > 0 {
   788  		t.Fatalf("bad: %s", e)
   789  	}
   790  }
   791  
   792  func TestContext2Validate_varRefFilled(t *testing.T) {
   793  	m := testModule(t, "validate-variable-ref")
   794  	p := testProvider("aws")
   795  	c := testContext2(t, &ContextOpts{
   796  		Module: m,
   797  		Providers: map[string]ResourceProviderFactory{
   798  			"aws": testProviderFuncFixed(p),
   799  		},
   800  		Variables: map[string]interface{}{
   801  			"foo": "bar",
   802  		},
   803  	})
   804  
   805  	var value interface{}
   806  	p.ValidateResourceFn = func(t string, c *ResourceConfig) ([]string, []error) {
   807  		value, _ = c.Get("foo")
   808  		return nil, nil
   809  	}
   810  
   811  	c.Validate()
   812  	if value != "bar" {
   813  		t.Fatalf("bad: %#v", value)
   814  	}
   815  }
   816  
   817  // Module variables weren't being interpolated during Validate phase.
   818  // related to https://github.com/hashicorp/terraform/issues/5322
   819  func TestContext2Validate_interpolateVar(t *testing.T) {
   820  	input := new(MockUIInput)
   821  
   822  	m := testModule(t, "input-interpolate-var")
   823  	p := testProvider("null")
   824  	p.ApplyFn = testApplyFn
   825  	p.DiffFn = testDiffFn
   826  
   827  	ctx := testContext2(t, &ContextOpts{
   828  		Module: m,
   829  		Providers: map[string]ResourceProviderFactory{
   830  			"template": testProviderFuncFixed(p),
   831  		},
   832  		UIInput: input,
   833  	})
   834  
   835  	w, e := ctx.Validate()
   836  	if w != nil {
   837  		t.Log("warnings:", w)
   838  	}
   839  	if e != nil {
   840  		t.Fatal("err:", e)
   841  	}
   842  }
   843  
   844  // When module vars reference something that is actually computed, this
   845  // shouldn't cause validation to fail.
   846  func TestContext2Validate_interpolateComputedModuleVarDef(t *testing.T) {
   847  	input := new(MockUIInput)
   848  
   849  	m := testModule(t, "validate-computed-module-var-ref")
   850  	p := testProvider("aws")
   851  	p.ApplyFn = testApplyFn
   852  	p.DiffFn = testDiffFn
   853  
   854  	ctx := testContext2(t, &ContextOpts{
   855  		Module: m,
   856  		Providers: map[string]ResourceProviderFactory{
   857  			"aws": testProviderFuncFixed(p),
   858  		},
   859  		UIInput: input,
   860  	})
   861  
   862  	w, e := ctx.Validate()
   863  	if w != nil {
   864  		t.Log("warnings:", w)
   865  	}
   866  	if e != nil {
   867  		t.Fatal("err:", e)
   868  	}
   869  }
   870  
   871  // Computed values are lost when a map is output from a module
   872  func TestContext2Validate_interpolateMap(t *testing.T) {
   873  	input := new(MockUIInput)
   874  
   875  	m := testModule(t, "issue-9549")
   876  	p := testProvider("null")
   877  	p.ApplyFn = testApplyFn
   878  	p.DiffFn = testDiffFn
   879  
   880  	ctx := testContext2(t, &ContextOpts{
   881  		Module: m,
   882  		Providers: map[string]ResourceProviderFactory{
   883  			"template": testProviderFuncFixed(p),
   884  		},
   885  		UIInput: input,
   886  	})
   887  
   888  	w, e := ctx.Validate()
   889  	if w != nil {
   890  		t.Log("warnings:", w)
   891  	}
   892  	if e != nil {
   893  		t.Fatal("err:", e)
   894  	}
   895  }
   896  
   897  // Manually validate using the new PlanGraphBuilder
   898  func TestContext2Validate_PlanGraphBuilder(t *testing.T) {
   899  	m := testModule(t, "apply-vars")
   900  	p := testProvider("aws")
   901  	p.ApplyFn = testApplyFn
   902  	p.DiffFn = testDiffFn
   903  	c := testContext2(t, &ContextOpts{
   904  		Module: m,
   905  		Providers: map[string]ResourceProviderFactory{
   906  			"aws": testProviderFuncFixed(p),
   907  		},
   908  		Variables: map[string]interface{}{
   909  			"foo":       "us-west-2",
   910  			"test_list": []interface{}{"Hello", "World"},
   911  			"test_map": map[string]interface{}{
   912  				"Hello": "World",
   913  				"Foo":   "Bar",
   914  				"Baz":   "Foo",
   915  			},
   916  			"amis": []map[string]interface{}{
   917  				map[string]interface{}{
   918  					"us-east-1": "override",
   919  				},
   920  			},
   921  		},
   922  	})
   923  
   924  	graph, err := (&PlanGraphBuilder{
   925  		Module:    c.module,
   926  		State:     NewState(),
   927  		Providers: c.components.ResourceProviders(),
   928  		Targets:   c.targets,
   929  	}).Build(RootModulePath)
   930  
   931  	defer c.acquireRun("validate-test")()
   932  	walker, err := c.walk(graph, graph, walkValidate)
   933  	if err != nil {
   934  		t.Fatal(err)
   935  	}
   936  	if len(walker.ValidationErrors) > 0 {
   937  		t.Fatal(walker.ValidationErrors)
   938  	}
   939  }