terraform/terraform
Paul Hinze 4a1b36ac0d
core: rerun resource validation before plan and apply
In #7170 we found two scenarios where the type checking done during the
`context.Validate()` graph walk was circumvented, and the subsequent
assumption of type safety in the provider's `Diff()` implementation
caused panics.

Both scenarios have to do with interpolations that reference Computed
values. The sentinel we use to indicate that a value is Computed does
not carry any type information with it yet.

That means that an incorrect reference to a list or a map in a string
attribute can "sneak through" validation only to crop up...

 1. ...during Plan for Data Source References
 2. ...during Apply for Resource references

In order to address this, we:

 * add high-level tests for each of these two scenarios in `provider/test`
 * add context-level tests for the same two scenarios in `terraform`
   (these tests proved _really_ tricky to write!)
 * place an `EvalValidateResource` just before `EvalDiff` and `EvalApply` to
   catch these errors
 * add some plumbing to `Plan()` and `Apply()` to return validation
   errors, which were previously only generated during `Validate()`
 * wrap unit-tests around `EvalValidateResource`
 * add an `IgnoreWarnings` option to `EvalValidateResource` to prevent
   active warnings from halting execution on the second-pass validation

Eventually, we might be able to attach type information to Computed
values, which would allow for these errors to be caught earlier. For
now, this solution keeps us safe from panics and raises the proper
errors to the user.

Fixes #7170
2016-07-01 13:12:57 -05:00
..
test-fixtures core: rerun resource validation before plan and apply 2016-07-01 13:12:57 -05:00
context.go core: rerun resource validation before plan and apply 2016-07-01 13:12:57 -05:00
context_apply_test.go core: rerun resource validation before plan and apply 2016-07-01 13:12:57 -05:00
context_import.go terraform: Module option to Import to add module to graph 2016-05-11 13:02:37 -07:00
context_import_test.go terraform: Module option to Import to add module to graph 2016-05-11 13:02:37 -07:00
context_input_test.go core: Add context test for empty lists as module outputs 2016-06-23 21:15:33 +01:00
context_plan_test.go core: rerun resource validation before plan and apply 2016-07-01 13:12:57 -05:00
context_refresh_test.go core: Add missing OutputStates in synthetic state 2016-06-22 17:06:41 +03:00
context_test.go core: Fix empty multi-variable type 2016-06-12 14:00:16 +02:00
context_validate_test.go Add tests and fix last issues 2016-05-26 19:56:03 -05:00
diff.go Remove computed maps from the diff Same check 2016-06-27 10:04:45 -04:00
diff_test.go Remove computed maps from the diff Same check 2016-06-27 10:04:45 -04:00
eval.go core: demote early exit log from ERROR -> DEBUG 2016-02-24 09:58:33 -06:00
eval_apply.go Add tests and fix last issues 2016-05-26 19:56:03 -05:00
eval_check_prevent_destroy.go update prevent_destroy error message 2015-08-13 09:57:52 -05:00
eval_context.go core: Use native HIL maps instead of flatmaps 2016-05-10 14:49:13 -04:00
eval_context_builtin.go Module variables not being interpolated 2016-05-23 13:44:09 -04:00
eval_context_builtin_test.go terraform: provider input should be scoped by path 2015-06-24 09:34:21 -07:00
eval_context_mock.go core: Use native HIL maps instead of flatmaps 2016-05-10 14:49:13 -04:00
eval_count.go terraform: catch scenario where both "foo" and "foo.0" are in state 2015-03-01 21:28:41 -08:00
eval_diff.go Add tests and fix last issues 2016-05-26 19:56:03 -05:00
eval_diff_test.go terraform: destroy node should not create 2015-02-24 22:45:47 -08:00
eval_error.go core: [refactor] store Deposed resource instances as a list 2015-03-04 12:25:59 -06:00
eval_filter.go terraform: more eval stuff 2015-02-19 12:07:54 -08:00
eval_filter_operation.go terraform: clean up EvalNodes 2015-02-19 12:08:32 -08:00
eval_if.go core: [refactor] pull Deposed out of Tainted list 2015-03-04 12:25:47 -06:00
eval_ignore_changes.go core: Fix issues with ignore_changes 2016-03-21 14:20:36 -05:00
eval_import_state.go terraform: import verifies the refresh results in non-nil state 2016-05-11 13:02:36 -07:00
eval_interpolate.go Module variables not being interpolated 2016-05-23 13:44:09 -04:00
eval_interpolate_test.go terraform: clean up EvalNodes 2015-02-19 12:08:32 -08:00
eval_noop.go terraform: clean up EvalNodes 2015-02-19 12:08:32 -08:00
eval_output.go core: Use OutputState in JSON instead of map 2016-05-18 13:25:20 -05:00
eval_provider.go core: close provider/provisioner connections 2015-06-19 21:52:50 +02:00
eval_provider_test.go core: close provider/provisioner connections 2015-06-19 21:52:50 +02:00
eval_provisioner.go core: close provider/provisioner connections 2015-06-19 21:52:50 +02:00
eval_provisioner_test.go core: close provider/provisioner connections 2015-06-19 21:52:50 +02:00
eval_read_data.go core: restore data resource creation diffs 2016-05-21 13:23:28 -07:00
eval_refresh.go providers/aws: security group import imports rules 2016-05-11 13:02:36 -07:00
eval_resource.go terraform: clean up EvalNodes 2015-02-19 12:08:32 -08:00
eval_sequence.go terraform: clean up EvalNodes 2015-02-19 12:08:32 -08:00
eval_sequence_test.go terraform: Refresh, Read/Write state 2015-02-19 12:08:00 -08:00
eval_state.go Add tests and fix last issues 2016-05-26 19:56:03 -05:00
eval_state_test.go Add tests and fix last issues 2016-05-26 19:56:03 -05:00
eval_test.go terraform: clean up EvalNodes 2015-02-19 12:08:32 -08:00
eval_validate.go core: rerun resource validation before plan and apply 2016-07-01 13:12:57 -05:00
eval_validate_test.go core: rerun resource validation before plan and apply 2016-07-01 13:12:57 -05:00
eval_variable.go core: Use Terraform terms over HCL ones 2016-06-24 12:42:39 +01:00
evaltree_provider.go terraform: providers should input/config on import 2016-05-11 13:02:34 -07:00
graph.go core: fix deadlock when dependable node replaced with non-dependable one 2015-08-10 15:50:36 -05:00
graph_builder.go core: Print node types in traces 2016-04-13 10:20:18 -07:00
graph_builder_import.go terraform: Module option to Import to add module to graph 2016-05-11 13:02:37 -07:00
graph_builder_test.go Add tests and fix last issues 2016-05-26 19:56:03 -05:00
graph_config_node.go terraform: fill in more flat interfaces 2015-05-01 15:28:41 -07:00
graph_config_node_module.go core: Use native HIL maps instead of flatmaps 2016-05-10 14:49:13 -04:00
graph_config_node_module_test.go core: Remove module input transformer 2016-04-13 11:15:24 -05:00
graph_config_node_output.go Interpolation also skipped during Validate phase 2016-05-23 13:44:13 -04:00
graph_config_node_provider.go terraform: providers in flattened graphs should depend on the parent 2015-05-01 16:41:49 -07:00
graph_config_node_resource.go Add tests and fix last issues 2016-05-26 19:56:03 -05:00
graph_config_node_test.go terraform: redo how flattening works 2015-05-01 15:18:40 -07:00
graph_config_node_type.go terraform: add variables as graph nodes (no eval yet) 2015-04-30 16:27:20 -07:00
graph_config_node_variable.go core: Fix destroy when module vars used in provider config 2016-06-11 21:21:08 -05:00
graph_config_node_variable_test.go terraform: set variables in the proper location 2015-05-01 16:29:19 -07:00
graph_dot.go Fix three trivial errors 'go vet' discovered. 2015-05-13 21:23:07 -04:00
graph_dot_test.go removed extra parentheses 2015-10-08 15:48:04 +03:00
graph_interface_subgraph.go terraform: subpath context setting 2015-05-01 14:19:32 -07:00
graph_test.go core: fix deadlock when dependable node replaced with non-dependable one 2015-08-10 15:50:36 -05:00
graph_walk.go terraform: subpath context setting 2015-05-01 14:19:32 -07:00
graph_walk_context.go core: Use native HIL maps instead of flatmaps 2016-05-10 14:49:13 -04:00
graph_walk_operation.go terraform: start Import function, totally untested 2016-05-11 13:02:30 -07:00
graph_walk_test.go terraform: trying this graphwalker thing 2015-02-19 12:07:56 -08:00
graphnodeconfigtype_string.go Reflect new comment format in stringer.go 2015-11-09 11:38:51 -05:00
hook.go terraform: import state ID should be sent to hook 2016-05-11 13:02:35 -07:00
hook_mock.go terraform: import state ID should be sent to hook 2016-05-11 13:02:35 -07:00
hook_stop.go terraform: import state ID should be sent to hook 2016-05-11 13:02:35 -07:00
hook_stop_test.go terraform: stopHook and tests 2014-07-02 16:16:38 -07:00
hook_test.go terraform: initial hook impl 2014-06-26 16:52:15 -07:00
instancetype.go core: formalize resource addressing 2015-03-31 15:04:10 -05:00
instancetype_string.go Reflect new comment format in stringer.go 2015-11-09 11:38:51 -05:00
interpolate.go core: Fix interpolation of unknown multi-variables 2016-06-23 21:15:33 +01:00
interpolate_test.go core: Fix interpolation of complex structures 2016-06-11 16:53:45 +01:00
path.go terraform: module inputs are passed through to subgraphs 2015-02-19 12:08:01 -08:00
plan.go core: Add terraform_version to state 2016-05-10 14:40:11 -04:00
plan_test.go terraform: Plan should use module.Tree 2014-09-24 14:56:48 -07:00
resource.go Add tests and fix last issues 2016-05-26 19:56:03 -05:00
resource_address.go core: ResourceAddress supports data resources 2016-05-14 08:26:36 -07:00
resource_address_test.go core: ResourceAddress supports data resources 2016-05-14 08:26:36 -07:00
resource_provider.go core: New ResourceProvider methods for data resources 2016-05-14 08:26:36 -07:00
resource_provider_mock.go core: New ResourceProvider methods for data resources 2016-05-14 08:26:36 -07:00
resource_provider_mock_test.go terraform: provider mock should close itself to find bugs 2015-06-29 10:33:37 -07:00
resource_provider_test.go terraform: add ResourceProviderFactoryFixed 2014-07-10 09:46:21 -07:00
resource_provisioner.go core: close provider/provisioner connections 2015-06-19 21:52:50 +02:00
resource_provisioner_mock.go terraform: change provisioners to take UIOutput 2014-10-04 09:20:05 -07:00
resource_provisioner_mock_test.go terraform: Adding mock resource provisioner 2014-07-10 11:38:56 -07:00
resource_test.go terraform: replace config/lang usage 2016-02-03 13:24:04 -05:00
semantics.go terraform: start implementing interfaces for semantic checks 2015-02-19 12:07:52 -08:00
semantics_test.go terraform: semantic check that variables are set on the correct types 2014-07-22 09:27:28 -07:00
state.go Merge pull request #7370 from tpounds/show-tf-ver-on-state-mismatch 2016-06-29 10:48:13 -05:00
state_add.go Update newly added code to work with the updated taint semantics 2016-05-26 19:56:03 -05:00
state_add_test.go Update newly added code to work with the updated taint semantics 2016-05-26 19:56:03 -05:00
state_filter.go Add tests and fix last issues 2016-05-26 19:56:03 -05:00
state_filter_test.go terraform: state filter wasn't comparing resource names 2016-05-10 14:49:14 -04:00
state_test.go Fix state version error message check. 2016-06-27 13:42:44 -07:00
state_upgrade_v1_to_v2.go Don't nil module maps during state upgrade 2016-06-29 09:17:25 -04:00
state_upgrade_v2_to_v3.go core: Introduce state v3 and upgrade process 2016-06-09 10:49:49 +01:00
state_v1.go core: Introduce state v3 and upgrade process 2016-06-09 10:49:49 +01:00
terraform_test.go Add tests and fix last issues 2016-05-26 19:56:03 -05:00
transform.go terraform: GraphVertexTransformers 2015-02-19 12:07:57 -08:00
transform_config.go Type check variables between modules (#6185) 2016-04-15 12:07:54 -07:00
transform_config_test.go terraform: add variables as graph nodes (no eval yet) 2015-04-30 16:27:20 -07:00
transform_deposed.go Add operation walkDestroy 2015-10-03 14:16:40 -07:00
transform_destroy.go Change taint behaviour to act as a normal resource 2016-05-26 19:55:26 -05:00
transform_destroy_test.go Add tests and fix last issues 2016-05-26 19:56:03 -05:00
transform_expand.go terraform: orphan module should flatten 2015-05-14 20:54:33 -07:00
transform_expand_test.go terraform: fix tests 2015-02-19 12:08:01 -08:00
transform_flatten.go remove various typos 2015-09-11 11:56:20 -07:00
transform_flatten_test.go terraform: add module destroy node to graph 2015-05-01 18:26:35 -07:00
transform_import_state.go terraform: import verifies the refresh results in non-nil state 2016-05-11 13:02:36 -07:00
transform_module.go core: Remove module input transformer 2016-04-13 11:15:24 -05:00
transform_module_test.go core: Remove module input transformer 2016-04-13 11:15:24 -05:00
transform_noop.go terraform: remove print 2015-07-20 08:57:35 -07:00
transform_noop_test.go terraform: PruneNoopTransformer 2015-07-20 08:57:34 -07:00
transform_orphan.go Change taint behaviour to act as a normal resource 2016-05-26 19:55:26 -05:00
transform_orphan_test.go core: Orphan addressing / targeting 2016-01-19 17:48:44 -06:00
transform_output.go Add operation walkDestroy 2015-10-03 14:16:40 -07:00
transform_output_test.go core: Use OutputState in JSON instead of map 2016-05-18 13:25:20 -05:00
transform_provider.go terraform: getting providers to connect the way we want for modules 2016-05-11 13:02:32 -07:00
transform_provider_test.go terraform: more provider transform tests 2016-05-11 13:02:32 -07:00
transform_provisioner.go Cleaning up the PruneProvisionerTransformer 2016-02-04 21:32:10 +01:00
transform_provisioner_test.go Cleaning up the PruneProvisionerTransformer 2016-02-04 21:32:10 +01:00
transform_proxy.go terraform: proxy uses custom edge 2015-05-01 11:41:01 -07:00
transform_proxy_test.go terraform: GraphNodeProxy 2015-05-01 11:38:36 -07:00
transform_resource.go core: rerun resource validation before plan and apply 2016-07-01 13:12:57 -05:00
transform_resource_test.go terraform: inner-count dependencies work [GH-1540] 2015-04-18 15:56:43 -07:00
transform_root.go terraform: prune resources and variables 2015-07-20 08:57:34 -07:00
transform_root_test.go terraform: validation in progress 2015-02-19 12:07:55 -08:00
transform_targets.go core: Orphan addressing / targeting 2016-01-19 17:48:44 -06:00
transform_targets_test.go core: targeted operations 2015-03-31 14:49:38 -05:00
transform_transitive_reduction.go terraform: add TransitiveReductionTransformer 2015-02-27 19:18:04 -08:00
transform_transitive_reduction_test.go terraform: add TransitiveReductionTransformer 2015-02-27 19:18:04 -08:00
transform_vertex.go terraform: GraphVertexTransformers 2015-02-19 12:07:57 -08:00
transform_vertex_test.go terraform: GraphVertexTransformers 2015-02-19 12:07:57 -08:00
ui_input.go helper/scheam: support UI defaults 2014-09-29 14:00:35 -07:00
ui_input_mock.go terraform: Input() asks for variable inputs 2014-09-28 23:37:36 -07:00
ui_input_prefix.go terraform: Make output more machine-like 2014-09-29 12:52:48 -07:00
ui_input_prefix_test.go terraform: prefix the Id for configuring providers 2014-09-29 10:36:49 -07:00
ui_output.go terraform: UIOutput interface 2014-10-04 09:00:07 -07:00
ui_output_callback.go terraform: provisioners 2015-02-19 12:08:06 -08:00
ui_output_callback_test.go terraform: provisioners 2015-02-19 12:08:06 -08:00
ui_output_mock.go fmt 2014-10-10 14:50:35 -07:00
ui_output_mock_test.go terraform: UIOutput interface 2014-10-04 09:00:07 -07:00
ui_output_provisioner.go terraform: no longer require uiOutput, do it auto in Hook 2014-10-04 16:24:07 -07:00
ui_output_provisioner_test.go terraform: no longer require uiOutput, do it auto in Hook 2014-10-04 16:24:07 -07:00
upgrade_state_v1_test.go Don't nil module maps during state upgrade 2016-06-29 09:17:25 -04:00
upgrade_state_v2_test.go core: Add test for V2->V3 state upgrade 2016-06-09 11:16:34 +01:00
util.go Support for multiple providers of the same type 2015-04-20 14:14:34 -07:00
util_test.go terraform: Adding a semaphore implementation 2014-10-16 10:04:36 -07:00
version.go release: clean up after v0.7.0-rc2 2016-06-12 19:21:46 +00:00
walkoperation_string.go terraform: generate 2016-05-11 13:02:30 -07:00