terraform/internal/terraform
Martin Atkins 37b1413ab3 core: Handle root and child module input variables consistently
Previously we had a significant discrepancy between these two situations:
we wrote the raw root module variables directly into the EvalContext and
then applied type conversions only at expression evaluation time, while
for child modules we converted and validated the values while visiting
the variable graph node and wrote only the _final_ value into the
EvalContext.

This confusion seems to have been the root cause for #29899, where
validation rules for root module variables were being applied at the wrong
point in the process, prior to type conversion.

To fix that bug and also make similar mistakes less likely in the future,
I've made the root module variable handling more like the child module
variable handling in the following ways:
 - The "raw value" (exactly as given by the user) lives only in the graph
   node representing the variable, which mirrors how the _expression_
   for a child module variable lives in its graph node. This means that
   the flow for the two is the same except that there's no expression
   evaluation step for root module variables, because they arrive as
   constant values from the caller.
 - The set of variable values in the EvalContext is always only "final"
   values, after type conversion is complete. That in turn means we no
   longer need to do "just in time" conversion in
   evaluationStateData.GetInputVariable, and can just return the value
   exactly as stored, which is consistent with how we handle all other
   references between objects.

This diff is noisier than I'd like because of how much it takes to wire
a new argument (the raw variable values) through to the plan graph builder,
but those changes are pretty mechanical and the interesting logic lives
inside the plan graph builder itself, in NodeRootVariable, and
the shared helper functions in eval_variable.go.

While here I also took the opportunity to fix a historical API wart in
EvalContext, where SetModuleCallArguments was built to take a set of
variable values all at once but our current caller always calls with only
one at a time. That is now just SetModuleCallArgument singular, to match
with the new SetRootModuleArgument to deal with root module variables.
2022-01-10 12:26:54 -08:00
..
testdata revert 6b8b0617 2021-12-14 17:58:10 -05:00
context.go insert panic handlers 2021-10-28 11:51:39 -04:00
context_apply.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
context_apply2_test.go return graph errors from Context.Apply 2021-12-17 14:00:57 -05:00
context_apply_test.go command/workspace_delete: Allow deleting a workspace with empty husks 2021-10-13 13:54:11 -07:00
context_eval.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
context_eval_test.go core: Functional-style API for terraform.Context 2021-08-30 13:59:14 -07:00
context_fixtures_test.go core: Functional-style API for terraform.Context 2021-08-30 13:59:14 -07:00
context_import.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
context_import_test.go core: Functional-style API for terraform.Context 2021-08-30 13:59:14 -07:00
context_input.go core: Functional-style API for terraform.Context 2021-08-30 13:59:14 -07:00
context_input_test.go wrap multiple provider creations into a factory fn 2021-10-12 17:47:50 -04:00
context_plan.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
context_plan2_test.go instances: Non-existing module instance has no resource instances 2021-12-13 10:03:50 -05:00
context_plan_test.go revert 6b8b0617 2021-12-14 17:58:10 -05:00
context_plugins.go core: Simplify and centralize plugin availability checks 2021-10-01 14:43:58 -07:00
context_plugins_test.go core: Replace contextComponentFactory with contextPlugins 2021-09-10 14:56:49 -07:00
context_refresh.go core: Functional-style API for terraform.Context 2021-08-30 13:59:14 -07:00
context_refresh_test.go core: Simplify and centralize plugin availability checks 2021-10-01 14:43:58 -07:00
context_test.go plans/planfile: Create takes most arguments via a struct type 2021-10-01 14:43:58 -07:00
context_validate.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
context_validate_test.go core: Remove TestContext2Validate_PlanGraphBuilder 2022-01-10 12:26:54 -08:00
context_walk.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
eval_context.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
eval_context_builtin.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
eval_context_builtin_test.go core: Replace contextComponentFactory with contextPlugins 2021-09-10 14:56:49 -07:00
eval_context_mock.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
eval_count.go core: refactoring.ImpliedMoveStatements replaces NodeCountBoundary 2021-09-20 09:06:22 -07:00
eval_count_test.go update to use typed sensitive marks 2021-06-25 12:49:07 -04:00
eval_for_each.go core: Invalid for_each argument messaging improvements 2022-01-10 12:23:13 -08:00
eval_for_each_test.go core: Invalid for_each argument messaging improvements 2022-01-10 12:23:13 -08:00
eval_provider.go core: EvalContextBuiltin no longer has a "Schemas" 2021-09-10 14:56:49 -07:00
eval_provider_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
eval_variable.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
eval_variable_test.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
evaluate.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
evaluate_test.go Merge pull request #29559 from hashicorp/jbardin/optional-attrs 2021-09-13 08:58:11 -04:00
evaluate_valid.go core: Graph walk loads plugin schemas opportunistically 2021-09-10 14:56:49 -07:00
evaluate_valid_test.go core: Graph walk loads plugin schemas opportunistically 2021-09-10 14:56:49 -07:00
execute.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
features.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
graph.go insert panic handlers 2021-10-28 11:51:39 -04:00
graph_builder.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
graph_builder_apply.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
graph_builder_apply_test.go core: refactoring.ImpliedMoveStatements replaces NodeCountBoundary 2021-09-20 09:06:22 -07:00
graph_builder_destroy_plan.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
graph_builder_eval.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
graph_builder_import.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
graph_builder_plan.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
graph_builder_plan_test.go core: refactoring.ImpliedMoveStatements replaces NodeCountBoundary 2021-09-20 09:06:22 -07:00
graph_builder_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
graph_builder_validate.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
graph_dot.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
graph_dot_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
graph_interface_subgraph.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
graph_test.go de-linting 2021-09-01 11:36:21 -04:00
graph_walk.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
graph_walk_context.go refactoring: ApplyMoves new return type 2021-09-22 09:01:10 -07:00
graph_walk_operation.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
graph_walk_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
hook.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
hook_mock.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
hook_stop.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
hook_stop_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
hook_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
instance_expanders.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
marks.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
marks_test.go update to use typed sensitive marks 2021-06-25 12:49:07 -04:00
node_data_destroy.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_data_destroy_test.go command/workspace_delete: Allow deleting a workspace with empty husks 2021-10-13 13:54:11 -07:00
node_local.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_local_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_module_expand.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_module_expand_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_module_variable.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
node_module_variable_test.go configs: add ConstraintType to config.Variable 2021-09-13 08:51:32 -04:00
node_output.go remove IsMarked and ContainsMarked calls 2021-06-25 14:17:06 -04:00
node_output_test.go update to use typed sensitive marks 2021-06-25 12:49:07 -04:00
node_provider.go add comment about when we call ConfigureProvider 2021-10-08 15:23:36 -04:00
node_provider_abstract.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_provider_eval.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_provider_test.go Merge pull request #29039 from hashicorp/jbardin/sensitive 2021-06-25 17:11:59 -04:00
node_resource_abstract.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_resource_abstract_instance.go core: Fix schema loading for deleted resources 2021-11-24 15:23:20 -05:00
node_resource_abstract_instance_test.go core: Fix schema loading for deleted resources 2021-11-24 15:23:20 -05:00
node_resource_abstract_test.go addrs: Rename DefaultRegistryHost to DefaultProviderRegistryHost 2021-06-03 08:50:34 -07:00
node_resource_apply.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_resource_apply_instance.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_resource_apply_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_resource_destroy.go Check for nil change during apply 2021-10-08 16:46:29 -04:00
node_resource_destroy_deposed.go skip refreshing deposed during destroy plan 2021-10-07 16:51:48 -04:00
node_resource_destroy_deposed_test.go fixup tests for MockProvider changes 2021-10-08 08:42:06 -04:00
node_resource_plan.go core: Fix refresh-only interaction with orphans 2021-09-23 16:38:08 -04:00
node_resource_plan_destroy.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_resource_plan_instance.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_resource_plan_orphan.go instances: Non-existing module instance has no resource instances 2021-12-13 10:03:50 -05:00
node_resource_plan_orphan_test.go fixup tests for MockProvider changes 2021-10-08 08:42:06 -04:00
node_resource_plan_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
node_resource_validate.go core: EvalContextBuiltin no longer has a "Schemas" 2021-09-10 14:56:49 -07:00
node_resource_validate_test.go update to use typed sensitive marks 2021-06-25 12:49:07 -04:00
node_root_variable.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
node_root_variable_test.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
node_value.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
phasestate_string.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
provider_mock.go test that providers are configured for calls 2021-10-07 16:48:56 -04:00
provisioner_mock.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
provisioner_mock_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
reduce_plan.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
reduce_plan_test.go test for null map and fix lost map marks 2021-11-11 10:44:39 -05:00
resource_provider_mock_test.go de-linting 2021-09-01 11:36:21 -04:00
schemas.go core: Context.Schemas in terms of contextPlugins methods 2021-09-10 14:56:49 -07:00
schemas_test.go core: Opportunistic schema loading during graph construction 2021-09-10 14:56:49 -07:00
terraform_test.go command: make module installation interruptible 2021-11-11 12:28:10 +00:00
transform.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_attach_config_provider.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_attach_config_provider_meta.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_attach_config_resource.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_attach_schema.go core: Opportunistic schema loading during graph construction 2021-09-10 14:56:49 -07:00
transform_attach_state.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_config.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_config_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_destroy_cbd.go core: Opportunistic schema loading during graph construction 2021-09-10 14:56:49 -07:00
transform_destroy_cbd_test.go core: Opportunistic schema loading during graph construction 2021-09-10 14:56:49 -07:00
transform_destroy_edge.go core: Opportunistic schema loading during graph construction 2021-09-10 14:56:49 -07:00
transform_destroy_edge_test.go core: Opportunistic schema loading during graph construction 2021-09-10 14:56:49 -07:00
transform_diff.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_diff_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_expand.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_import_state.go return error for invalid resource import 2021-05-25 17:13:49 -04:00
transform_import_state_test.go fixup tests for MockProvider changes 2021-10-08 08:42:06 -04:00
transform_local.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_module_expansion.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_module_variable.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_module_variable_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_orphan_count.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_orphan_count_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_orphan_output.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_orphan_resource.go deposed instances should not be counted as orphans 2021-05-20 09:36:45 -04:00
transform_orphan_resource_test.go deposed instances should not be counted as orphans 2021-05-20 09:36:45 -04:00
transform_output.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_provider.go core: Provider transformers don't use the set of all available providers 2021-09-10 14:56:49 -07:00
transform_provider_test.go core: Provider transformers don't use the set of all available providers 2021-09-10 14:56:49 -07:00
transform_provisioner.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_reference.go don't check all ancestors for data depends_on 2021-09-30 16:43:09 -04:00
transform_reference_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_removed_modules.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_resource_count.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_root.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_root_test.go core: Provider transformers don't use the set of all available providers 2021-09-10 14:56:49 -07:00
transform_state.go command/workspace_delete: Allow deleting a workspace with empty husks 2021-10-13 13:54:11 -07:00
transform_targets.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_targets_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_transitive_reduction.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_transitive_reduction_test.go core: Opportunistic schema loading during graph construction 2021-09-10 14:56:49 -07:00
transform_variable.go core: Handle root and child module input variables consistently 2022-01-10 12:26:54 -08:00
transform_vertex.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
transform_vertex_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_input.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_input_mock.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_input_prefix.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_input_prefix_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_output.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_output_callback.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_output_callback_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_output_mock.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_output_mock_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_output_provisioner.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
ui_output_provisioner_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
update_state_hook.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
update_state_hook_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
upgrade_resource_state.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
upgrade_resource_state_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
util.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
util_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
validate_selfref.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
validate_selfref_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
valuesourcetype_string.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
variables.go configs: add ConstraintType to config.Variable 2021-09-13 08:51:32 -04:00
variables_test.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
version_required.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00
walkoperation_string.go Move terraform/ to internal/terraform/ 2021-05-17 14:09:07 -07:00