terraform/config/test-fixtures
Martin Atkins 410b60cb7f Stop requiring multi-vars (splats) to be in array brackets
Prior to Terraform 0.7, lists in Terraform were just a shallow abstraction
on top of strings with a magic delimiter between items. Wrapping a single
string in brackets in the configuration was Terraform's prompt that it
needed to split the string on that delimiter during interpolation.

In 0.7, when first-class lists were added, this convention was preserved
by flattening lists-of-lists by one level when they were encountered in
configuration. However, there was an oversight in that change where it
did not correctly handle the case where the inner list was unknown.

In #14135 we removed some code that was flattening partially-unknown lists
into fully-unknown (untyped) values. This inadvertently exposed the missed
case from the previous paragraph, causing issues for list-wrapped splat
expressions with unknown members. While this worked fine for resources,
due to some fixup done inside helper/schema, this did not work for other
interpolation contexts such as module blocks.

Various attempts to fix this up and restore the flattening behavior
selectively were unsuccessful, due to a proliferation of assumptions all
over the core code that would be too risky to change just to fix this bug.

This change, then, takes the different approach of removing the
requirement that splats be presented inside list brackets. This
requirement didn't make much sense anymore anyway, since no other
list-returning expression had this constraint and so the rest of Terraform
was already successfully dealing with both cases.

This leaves us with two different scenarios:

- For resource arguments, existing normalization code in helper/schema
  does its own flattening that preserves compatibility with the common
  practice of using bracketed splats. This change proves this with a test
  within the "test" provider that exercises the whole Terraform core and
  helper/schema stack that assigns bracketed splats to list and set
  attributes.

- For arguments in other blocks, such as in module callsites, the
  interpolator's own flattening behavior applies to known lists,
  preserving compatibility with configurations from before
  partially-computed splats were possible, but those wishing to use
  partially-computed splats are required to drop the surrounding brackets.
  This is less concerning because this scenario was introduced only in
  0.9.5, so the scope for breakage is limited to those who adopted this
  new feature quickly after upgrading.

As of this commit, the recommendation is to stop using brackets around
splats but the old form continues to be supported for backward
compatibility. In a future _major_ version of Terraform we will probably
phase out this legacy form to improve consistency, but for now both
forms are acceptable at the expense of some (pre-existing) weird behavior
when _actual_ lists-of-lists are used.

This addresses #14521 by officially adopting the suggested workaround of
dropping the brackets around the splat. However, it doesn't yet allow
passing of a partially-unknown list between modules: that still violates
assumptions in Terraform's core, so for the moment partially-unknown lists
work only within a _single_ interpolation expression, and cannot be
passed around between expressions. Until more holistic work is done to
improve Terraform's type handling, passing a partially-unknown splat
through to a module will result in a fully-unknown list emerging on
the other side, just as was the case before #14135; this change just
addresses the fact that this was failing with an error in 0.9.5.
2017-05-23 11:22:37 -07:00
..
backend-hash-basic config: add "backend" loading to the Terraform section 2017-01-26 14:33:49 -08:00
backend-hash-empty config: add "backend" loading to the Terraform section 2017-01-26 14:33:49 -08:00
backend-hash-no-terraform config: add "backend" loading to the Terraform section 2017-01-26 14:33:49 -08:00
backend-hash-type-only config: add "backend" loading to the Terraform section 2017-01-26 14:33:49 -08:00
copy-basic core: Make copies when creating destroy nodes 2016-02-09 09:25:16 -06:00
count-int
count-list config: Resource.Count should type check 2017-02-10 10:41:41 -08:00
count-string
count-var
data-count Add a test load of a data source with count 2016-09-03 13:08:41 -07:00
dir-basic config: Data source loading 2016-05-14 08:26:35 -07:00
dir-empty
dir-merge
dir-override config: Data source loading 2016-05-14 08:26:35 -07:00
dir-override-var config: test for var uniqueness in overrides 2016-08-26 13:48:21 -07:00
dir-temporary-files
empty-collections core: Fix detection of empty list/map defaults 2016-06-12 11:19:03 +02:00
import
interpolations
validate-backend-interpolate config: validate backend configuration can't contain interpolations 2017-02-17 16:27:01 -08:00
validate-bad-depends-on
validate-bad-multi-resource
validate-bad-tf-version config: parse and validate terraform.required_version 2016-11-12 16:22:35 -08:00
validate-basic-provisioners config: parse "when" and "on_failure" on provisioners 2017-01-19 18:10:21 -08:00
validate-count-bad-context
validate-count-below-zero
validate-count-count-var
validate-count-int
validate-count-module-var
validate-count-not-int
validate-count-resource-var
validate-count-resource-var-multi command/meta: validate config immediately 2016-09-03 15:26:49 -07:00
validate-count-user-var
validate-count-var
validate-count-var-invalid
validate-count-var-unknown config: count can't be a SimpleVariable 2016-08-16 13:48:12 -07:00
validate-count-zero
validate-data-provisioner config: validate that data sources don't have provisioners 2016-11-23 08:46:13 -08:00
validate-depends-on-bad-module config: validate depends_on with module values 2016-11-12 08:21:27 -08:00
validate-depends-on-module config: validate depends_on with module values 2016-11-12 08:21:27 -08:00
validate-depends-on-var
validate-dup-module
validate-dup-resource
validate-good core: Better error for dot indexing on user vars 2016-06-12 10:45:48 -05:00
validate-ignore-changes Add wildcard (match all) support to ignore_changes (#8599) 2016-09-02 15:44:35 +02:00
validate-ignore-changes-bad Add wildcard (match all) support to ignore_changes (#8599) 2016-09-02 15:44:35 +02:00
validate-ignore-changes-interpolate config: ignore_changes cannot have interpolations 2016-10-24 23:06:33 -07:00
validate-module-name-bad
validate-module-source-var
validate-module-var-int
validate-module-var-list core: support native list variables in config 2016-05-10 14:49:14 -04:00
validate-module-var-map core: support native list variables in config 2016-05-10 14:49:14 -04:00
validate-module-var-self
validate-output-bad-field
validate-output-description core: allow outputs to have descriptions (#9722) 2016-11-18 19:09:43 +02:00
validate-output-dup config: outputs must be unique 2016-08-25 14:43:57 -07:00
validate-path-var
validate-path-var-invalid
validate-prov-conn-splat-other
validate-prov-conn-splat-self
validate-prov-splat-other
validate-prov-splat-self
validate-provider-multi
validate-provider-multi-good
validate-provider-multi-ref-bad
validate-provider-multi-ref-good
validate-resource-prov-self
validate-resource-self
validate-tf-version config: parse and validate terraform.required_version 2016-11-12 16:22:35 -08:00
validate-tf-version-interp config: parse and validate terraform.required_version 2016-11-12 16:22:35 -08:00
validate-unknown-resource-var
validate-unknown-resource-var-output
validate-unknownthing
validate-unknownvar
validate-unknownvar-count
validate-var-default config: vars must be unique 2016-08-25 14:51:49 -07:00
validate-var-default-interpolate
validate-var-default-interpolate-escaped Allow escaped interpolation-like sequences in variable defaults 2017-03-29 09:25:57 -07:00
validate-var-default-list-type core: support native list variables in config 2016-05-10 14:49:14 -04:00
validate-var-dup config: vars must be unique 2016-08-25 14:51:49 -07:00
validate-var-module
validate-var-module-invalid
validate-var-multi-exact-non-slice
validate-var-multi-func
validate-var-nested Add test for Validate crash 2017-03-07 15:01:29 -05:00
.gitattributes Add regression test for #4069 2015-12-01 13:37:18 -05:00
attributes.tf
attributes.tf.json
bad-variable-type.tf core: Support explicit variable type declaration 2016-01-24 11:40:02 -06:00
bad_type.tf.nope
basic.tf config: parse and validate terraform.required_version 2016-11-12 16:22:35 -08:00
basic.tf.json config: Data source loading 2016-05-14 08:26:35 -07:00
connection.tf
create-before-destroy.tf
data-source-arity-mistake.tf config: Data source loading 2016-05-14 08:26:35 -07:00
empty.tf
escapedquotes.tf config: test covering escaped quotes syntax error 2015-11-19 12:11:42 -06:00
git-crypt.tf config: test that null characters show up as errors in parse 2016-11-21 18:11:11 -08:00
heredoc.tf config: test replicating #4079 2015-12-01 10:31:05 -06:00
ignore-changes.tf
import.tf
lifecycle_cbd_typo.tf config: validate lifecycle keys [GH-4413] 2016-01-19 11:28:45 -08:00
module-unnamed.tf config: generate errors for unnamed blocks of various sources 2017-05-02 16:29:57 -07:00
modules.tf
output-depends-on.tf config: parse depends_on for outputs 2016-11-11 17:46:34 -08:00
output-unnamed.tf config: generate errors for unnamed blocks of various sources 2017-05-02 16:29:57 -07:00
prevent-destroy-string.tf
provisioners-destroy.tf config: parse "when" and "on_failure" on provisioners 2017-01-19 18:10:21 -08:00
provisioners.tf
resource-arity-mistake.tf config: friendlier error message on resource arity mismatch 2015-12-09 18:05:49 -06:00
resource-multi-lifecycle.tf config: error when loading multiple lifecycle blocks 2016-12-10 18:52:13 -05:00
resource-no-name.tf.json config: JSON resource keys with only one item load properly GH-5140 2016-08-25 17:18:18 -07:00
terraform-backend-2.tf.json restructure JSON terraform config block AST 2017-03-21 18:15:58 -04:00
terraform-backend-multi.tf config: add "backend" loading to the Terraform section 2017-01-26 14:33:49 -08:00
terraform-backend.tf config: add "backend" loading to the Terraform section 2017-01-26 14:33:49 -08:00
terraform-backend.tf.json config: test that JSON loading terraform backend info works 2017-03-16 14:51:26 -07:00
var-invalid-key.tf config: validate invalid variable keys 2016-12-10 19:27:01 -05:00
var_int.tf config: disallow names starting with ints 2016-12-08 23:01:51 -05:00
var_int_bare.tf config: disallow names starting with ints 2016-12-08 23:01:51 -05:00
variable-mismatched-type.tf core: Support explicit variable type declaration 2016-01-24 11:40:02 -06:00
variable-no-name.tf config: generate errors for unnamed blocks of various sources 2017-05-02 16:29:57 -07:00
variables.tf
windows-line-endings.tf Add regression test for #4069 2015-12-01 13:37:18 -05:00