opentofu/terraform
Martin Atkins 3b49028b77 core: Static-validate resource references against schemas
In the initial move to HCL2 we started relying only on full expression
evaluation to catch attribute errors, but that's not sufficient for
resource attributes in practice because during validation we can't know
yet whether a resource reference evaluates to a single object or to a
list of objects (if count is set).

To address this, here we reinstate some static validation of resource
references by analyzing directly the reference objects, disregarding any
instance index if present, and produce errors if the remaining subsequent
traversal steps do not correspond to items within the resource type
schema.

This also allows us to produce some more specialized error messages for
certain situations. In particular, we can recognize a reference like
aws_instance.foo.count, which in 0.11 and prior was a weird special case
for determining the count value of a resource block, and offer a helpful
error showing the new length(aws_instance.foo) usage pattern.

This eventually delegates to the static traversal validation logic that
was added to the configschema package in a previous commit, which also
includes some specialized error messages that distinguish between
attributes and block types in the schema so that the errors relate more
directly to constructs the user can see in the configuration.

In future we could potentially move more of the checks from the dynamic
schema construction step to the static validation step, but resources
are the reference type that most needs this immediately due to the
ambiguity caused by the instance indexing syntax. We can safely refactor
other reference types to be statically validated in later releases.

This is verified by two pre-existing context validate tests which we
temporarily disabled during earlier work (now re-enabled) and also by a
new validate test aimed specifically at the special case for the "count"
attribute.
2018-11-26 08:25:03 -08:00
..
test-fixtures core: Whole-module evaluation must consider planned output values 2018-11-01 17:41:35 -07:00
context_apply_test.go export MustShimLegacyState for resource tests 2018-10-16 19:14:11 -07:00
context_components_test.go replace provider and provisioner types in tests 2018-10-16 19:11:09 -07:00
context_components.go update to start a new process for each plugin 2018-10-16 19:14:11 -07:00
context_fixtures_test.go core: A "go fmt" catchup 2018-10-16 19:14:11 -07:00
context_graph_type.go core: Remove machinery for the "input" walk 2018-10-16 18:49:20 -07:00
context_import_test.go convert import tests 2018-10-16 19:14:11 -07:00
context_import.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
context_input_test.go core: Fix two TestContext2Input_... tests 2018-10-16 19:14:11 -07:00
context_input.go core: Context.Input as config walk, rather than graph walk 2018-10-16 18:49:20 -07:00
context_plan_test.go add missing key-value from test 2018-11-19 18:58:29 -05:00
context_refresh_test.go export MustShimLegacyState for resource tests 2018-10-16 19:14:11 -07:00
context_test.go export MustShimLegacyState for resource tests 2018-10-16 19:14:11 -07:00
context_validate_test.go core: Static-validate resource references against schemas 2018-11-26 08:25:03 -08:00
context.go reset plan changes every call to Plan. 2018-10-16 19:14:11 -07:00
diff_test.go re-count the flatmapped containers 2018-11-16 15:26:16 -05:00
diff.go fixes for the remaining tests 2018-11-19 18:56:50 -05:00
edge_destroy.go terraform: starting CBD, destroy edge for the destroy relationship 2016-10-19 13:38:52 -07:00
eval_apply.go core: Handle forced-create_before_destroy during the plan walk 2018-10-16 19:14:11 -07:00
eval_check_prevent_destroy.go core: Handle forced-create_before_destroy during the plan walk 2018-10-16 19:14:11 -07:00
eval_context_builtin_test.go terraform: More wiring in of new provider types 2018-10-16 19:12:54 -07:00
eval_context_builtin.go ResourceProvisioner to provisioners.Interface 2018-10-16 19:11:09 -07:00
eval_context_mock.go ResourceProvisioner to provisioners.Interface 2018-10-16 19:11:09 -07:00
eval_context.go ResourceProvisioner to provisioners.Interface 2018-10-16 19:11:09 -07:00
eval_count_boundary.go core: Update EvalCountFixZeroOneBoundaryGlobal for new state types 2018-10-16 19:14:11 -07:00
eval_count_computed.go terraform: detect compute counts and show a nicer error 2016-11-11 11:07:17 -08:00
eval_count.go core: Update EvalCountFixZeroOneBoundaryGlobal for new state types 2018-10-16 19:14:11 -07:00
eval_diff_test.go core: A "go fmt" catchup 2018-10-16 19:14:11 -07:00
eval_diff.go create a new proposed value when replacing 2018-10-31 13:49:04 -04:00
eval_error.go core: [refactor] store Deposed resource instances as a list 2015-03-04 12:25:59 -06:00
eval_filter_operation.go terraform: clean up EvalNodes 2015-02-19 12:08:32 -08:00
eval_filter.go terraform: more eval stuff 2015-02-19 12:07:54 -08:00
eval_if.go core: [refactor] pull Deposed out of Tainted list 2015-03-04 12:25:47 -06:00
eval_import_state.go terraform: More wiring in of new provider types 2018-10-16 19:12:54 -07:00
eval_lang.go move "configschema" from "config" to "configs" 2018-10-16 18:50:29 -07:00
eval_local_test.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
eval_local.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
eval_noop.go terraform: clean up EvalNodes 2015-02-19 12:08:32 -08:00
eval_output_test.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
eval_output.go core: Allow planned output changes to be updated during apply 2018-11-05 16:02:45 -08:00
eval_provider_test.go replace provider and provisioner types in tests 2018-10-16 19:11:09 -07:00
eval_provider.go first step in core provider type replacement 2018-10-16 19:11:09 -07:00
eval_provisioner_test.go replace provider and provisioner types in tests 2018-10-16 19:11:09 -07:00
eval_provisioner.go ResourceProvisioner to provisioners.Interface 2018-10-16 19:11:09 -07:00
eval_read_data.go core: Reinstate state-based tracking of data resource dependencies 2018-10-16 19:14:11 -07:00
eval_refresh.go core: EvalRefresh should not mutate the state object it is given 2018-10-16 19:14:11 -07:00
eval_sequence_test.go terraform: Refresh, Read/Write state 2015-02-19 12:08:00 -08:00
eval_sequence.go core: EvalSequence to handle EvalEarlyExitError 2018-10-16 18:49:20 -07:00
eval_state_test.go export MustShimLegacyState for resource tests 2018-10-16 19:14:11 -07:00
eval_state.go core: Clean up resource states when they are orphaned 2018-10-16 19:14:11 -07:00
eval_test.go terraform: clean up EvalNodes 2015-02-19 12:08:32 -08:00
eval_validate_selfref_test.go move "configschema" from "config" to "configs" 2018-10-16 18:50:29 -07:00
eval_validate_selfref.go move "configschema" from "config" to "configs" 2018-10-16 18:50:29 -07:00
eval_validate_test.go core: Fix various compile-time errors in tests 2018-10-16 19:14:11 -07:00
eval_validate.go update terraform with PrepareProviderConfig 2018-10-18 08:48:55 -04:00
eval_variable.go terraform: ugly huge change to weave in new HCL2-oriented types 2018-10-16 18:46:46 -07:00
eval.go core: EvalSequence must continue when only warnings are returned 2018-10-16 18:49:20 -07:00
evaltree_provider.go first step in core provider type replacement 2018-10-16 19:11:09 -07:00
evaluate_test.go core: Get tests compiling again 2018-10-16 18:46:46 -07:00
evaluate_valid.go core: Static-validate resource references against schemas 2018-11-26 08:25:03 -08:00
evaluate.go core: Whole-module evaluation must consider planned output values 2018-11-01 17:41:35 -07:00
features.go output warning flag 2017-11-28 14:18:54 -05:00
graph_builder_apply_test.go export MustShimLegacyState for resource tests 2018-10-16 19:14:11 -07:00
graph_builder_apply.go core: Clean up resource states when they are orphaned 2018-10-16 19:14:11 -07:00
graph_builder_destroy_plan.go core: A "go fmt" catchup 2018-10-16 19:14:11 -07:00
graph_builder_eval.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
graph_builder_import.go core: Don't create indirect provider dependencies for references 2018-10-16 18:49:20 -07:00
graph_builder_plan_test.go terraform.Schemas: export struct fields 2018-10-16 19:14:11 -07:00
graph_builder_plan.go core: A "go fmt" catchup 2018-10-16 19:14:11 -07:00
graph_builder_refresh_test.go export MustShimLegacyState for resource tests 2018-10-16 19:14:11 -07:00
graph_builder_refresh.go core: A "go fmt" catchup 2018-10-16 19:14:11 -07:00
graph_builder_test.go core: Get tests compiling again 2018-10-16 18:46:46 -07:00
graph_builder_validate.go terraform: ugly huge change to weave in new HCL2-oriented types 2018-10-16 18:46:46 -07:00
graph_builder.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
graph_dot_test.go terraform: remove ConnectDependents and related interfaces 2017-02-03 14:25:54 +01:00
graph_dot.go Remove dot package 2016-11-14 08:50:34 -05:00
graph_interface_subgraph.go terraform: ugly huge change to weave in new HCL2-oriented types 2018-10-16 18:46:46 -07:00
graph_test.go update some graph builder tests 2018-10-16 19:14:11 -07:00
graph_walk_context.go core: Evaluate resource references from plan where possible 2018-10-16 19:14:11 -07:00
graph_walk_operation.go core: Remove machinery for the "input" walk 2018-10-16 18:49:20 -07:00
graph_walk_test.go terraform: trying this graphwalker thing 2015-02-19 12:07:56 -08:00
graph_walk.go core: Remove GraphWalkerPanicwrap, etc 2018-10-16 18:48:28 -07:00
graph.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
graphtype_string.go core: update Stringer implementations for GraphType and walkOperation 2018-10-16 18:49:20 -07:00
hook_mock.go terraform: More wiring in of new provider types 2018-10-16 19:12:54 -07:00
hook_stop_test.go terraform: stopHook and tests 2014-07-02 16:16:38 -07:00
hook_stop.go command: Fix TestPlan_shutdown 2018-11-08 08:57:11 -08:00
hook_test.go core: Fix various compile-time errors in tests 2018-10-16 19:14:11 -07:00
hook.go terraform: More wiring in of new provider types 2018-10-16 19:12:54 -07:00
instancetype_string.go Update various files for new version of "stringer" 2017-12-11 13:26:29 -08:00
instancetype.go core: formalize resource addressing 2015-03-31 15:04:10 -05:00
interpolate.go core: Remove machinery for the "input" walk 2018-10-16 18:49:20 -07:00
module_dependencies_test.go export MustShimLegacyState for resource tests 2018-10-16 19:14:11 -07:00
module_dependencies.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
node_count_boundary.go core: Update EvalCountFixZeroOneBoundaryGlobal for new state types 2018-10-16 19:14:11 -07:00
node_data_destroy.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
node_data_refresh_test.go export MustShimLegacyState for resource tests 2018-10-16 19:14:11 -07:00
node_data_refresh.go core: Reinstate state-based tracking of data resource dependencies 2018-10-16 19:14:11 -07:00
node_local.go core: Local and output values must reference destroy nodes too 2018-10-16 18:49:20 -07:00
node_module_removed.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
node_module_variable_test.go core: Update TestNodeApplyableModuleVariablePath for new address type 2018-10-16 18:48:28 -07:00
node_module_variable.go core: Remove machinery for the "input" walk 2018-10-16 18:49:20 -07:00
node_output_orphan.go terraform: ugly huge change to weave in new HCL2-oriented types 2018-10-16 18:46:46 -07:00
node_output.go core: Remove machinery for the "input" walk 2018-10-16 18:49:20 -07:00
node_provider_abstract.go core: A "go fmt" catchup 2018-10-16 19:14:11 -07:00
node_provider_disabled.go terraform: ugly huge change to weave in new HCL2-oriented types 2018-10-16 18:46:46 -07:00
node_provider_eval.go core: Context.Eval method 2018-10-16 18:46:46 -07:00
node_provider.go WIP reference providers by full name 2017-11-02 15:00:06 -04:00
node_provisioner.go core: NodeProvisioner.Name update for new address types 2018-10-16 18:48:28 -07:00
node_resource_abstract.go core: Don't create self-references in state 2018-10-16 19:14:11 -07:00
node_resource_apply_instance.go core: Reinstate state-based tracking of data resource dependencies 2018-10-16 19:14:11 -07:00
node_resource_apply.go core: NodeApplyableResource only depends on count and for_each 2018-10-16 19:14:11 -07:00
node_resource_destroy_deposed.go core: Fix TestRefreshGraphBuilder_configOrphans 2018-10-16 19:14:11 -07:00
node_resource_destroy.go core: Clean up resource states when they are orphaned 2018-10-16 19:14:11 -07:00
node_resource_plan_destroy.go core: Always set ProviderAddr on EvalDiffDestroy 2018-10-16 19:14:11 -07:00
node_resource_plan_instance.go core: Reinstate state-based tracking of data resource dependencies 2018-10-16 19:14:11 -07:00
node_resource_plan_orphan.go core: Record correct provider address in orphan destroy plan 2018-10-16 19:14:11 -07:00
node_resource_plan.go core: Handle forced-create_before_destroy during the plan walk 2018-10-16 19:14:11 -07:00
node_resource_refresh_test.go export MustShimLegacyState for resource tests 2018-10-16 19:14:11 -07:00
node_resource_refresh.go core: Prune placeholder objects from state after refresh 2018-10-16 19:14:11 -07:00
node_resource_validate.go ResourceProvisioner to provisioners.Interface 2018-10-16 19:11:09 -07:00
node_root_variable.go core: render variables, locals and outputs nicely in "terraform graph" 2018-10-16 18:46:46 -07:00
path.go terraform: ugly huge change to weave in new HCL2-oriented types 2018-10-16 18:46:46 -07:00
plan.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
provider_mock.go fixes for the remaining tests 2018-11-19 18:56:50 -05:00
provisioner_mock.go core: MockProvider and MockProvisioner can't lock in Stop 2018-10-16 19:14:11 -07:00
resource_address_test.go configs: Re-unify the ManagedResource and DataResource types 2018-10-16 18:44:26 -07:00
resource_address.go core: NewLegacyResourceInstanceAddress correct handling of addrs.NoKey 2018-10-16 18:46:46 -07:00
resource_provider_mock_test.go terraform: More wiring in of new provider types 2018-10-16 19:12:54 -07:00
resource_provider_mock.go minor race issue in mockResourceProvider 2017-12-20 09:18:38 -05:00
resource_provider.go first step in core provider type replacement 2018-10-16 19:11:09 -07:00
resource_provisioner_mock_test.go replace provider and provisioner types in tests 2018-10-16 19:11:09 -07:00
resource_provisioner_mock.go move "configschema" from "config" to "configs" 2018-10-16 18:50:29 -07:00
resource_provisioner.go provisioners: Add Factory type and FactoryFixed helper 2018-10-16 19:14:11 -07:00
resource_test.go some basic tests for NewResourceConfigShimmed 2018-10-26 15:01:30 -04:00
resource.go insert resource timeouts into the config schema 2018-10-30 13:14:08 -04:00
schemas_test.go terraform.Schemas: export struct fields 2018-10-16 19:14:11 -07:00
schemas.go terraform.Schemas: export struct fields 2018-10-16 19:14:11 -07:00
state_test.go command/state: update and fix the state list command 2018-10-19 16:31:12 +02:00
state_upgrade_v1_to_v2.go terraform: convert empty path to root path in V1 state 2017-03-21 11:37:12 -07:00
state_upgrade_v2_to_v3.go terraform: V1 to V2 upgrade should treat nil path as root path 2017-03-21 11:12:44 -07:00
state_v1.go core: Introduce state v3 and upgrade process 2016-06-09 10:49:49 +01:00
state.go command/state: update and fix the state list command 2018-10-19 16:31:12 +02:00
terraform_test.go core: Fix TestContext2Apply_Provisioner_compute 2018-10-16 19:14:11 -07:00
testing.go terraform: support backends in the state 2017-01-26 14:33:49 -08:00
transform_attach_config_provider.go core: Attach resource and provider config schemas during graph build 2018-10-16 18:46:46 -07:00
transform_attach_config_resource.go core: Additional trace logging in attach resource config transformer 2018-10-16 18:48:28 -07:00
transform_attach_schema.go move "configschema" from "config" to "configs" 2018-10-16 18:50:29 -07:00
transform_attach_state.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
transform_config_flat_test.go core: Get tests compiling again 2018-10-16 18:46:46 -07:00
transform_config_flat.go terraform: ugly huge change to weave in new HCL2-oriented types 2018-10-16 18:46:46 -07:00
transform_config_old.go terraform: remove config transformer old 2017-01-26 19:57:46 -08:00
transform_config_test.go core: Get tests compiling again 2018-10-16 18:46:46 -07:00
transform_config.go terraform: ugly huge change to weave in new HCL2-oriented types 2018-10-16 18:46:46 -07:00
transform_count_boundary.go core: Update EvalCountFixZeroOneBoundaryGlobal for new state types 2018-10-16 19:14:11 -07:00
transform_destroy_cbd_test.go CBD transformer test update 2018-10-16 19:14:11 -07:00
transform_destroy_cbd.go CBD transformer test update 2018-10-16 19:14:11 -07:00
transform_destroy_edge_test.go core: Fetch schemas during context construction 2018-10-16 18:49:20 -07:00
transform_destroy_edge.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
transform_diff_test.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
transform_diff.go core: Handle forced-create_before_destroy during the plan walk 2018-10-16 19:14:11 -07:00
transform_expand_test.go implement dag.Subgrapher interface 2016-11-14 08:50:34 -05:00
transform_expand.go terraform: more dead code removal 2017-01-26 19:47:02 -08:00
transform_import_provider.go terraform: ugly huge change to weave in new HCL2-oriented types 2018-10-16 18:46:46 -07:00
transform_import_state.go terraform: More wiring in of new provider types 2018-10-16 19:12:54 -07:00
transform_local.go terraform: ugly huge change to weave in new HCL2-oriented types 2018-10-16 18:46:46 -07:00
transform_module_variable_test.go core: Get tests compiling again 2018-10-16 18:46:46 -07:00
transform_module_variable.go terraform: ugly huge change to weave in new HCL2-oriented types 2018-10-16 18:46:46 -07:00
transform_orphan_count_test.go export MustShimLegacyState for resource tests 2018-10-16 19:14:11 -07:00
transform_orphan_count.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
transform_orphan_output.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
transform_orphan_resource_test.go core: OrphanResourceTransformer -> OrphanResourceInstanceTransformer 2018-10-16 19:14:11 -07:00
transform_orphan_resource.go core: Clean up resource states when they are orphaned 2018-10-16 19:14:11 -07:00
transform_output.go terraform: ugly huge change to weave in new HCL2-oriented types 2018-10-16 18:46:46 -07:00
transform_provider_test.go core: Update ProviderTransformer tests for new ImportTarget interface 2018-10-16 18:48:28 -07:00
transform_provider.go core: Better error message for prematurely-removed provider config 2018-10-16 19:14:11 -07:00
transform_provisioner_test.go core: Be more explicit in how we handle create_before_destroy 2018-10-16 19:14:11 -07:00
transform_provisioner.go core: Make provisioner schemas available to plan resource instance nodes 2018-10-16 18:49:20 -07:00
transform_reference_test.go core: Fix ReferenceTransformer tests 2018-10-16 18:48:28 -07:00
transform_reference.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
transform_removed_modules.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
transform_resource_count.go move "configschema" from "config" to "configs" 2018-10-16 18:50:29 -07:00
transform_root_test.go core: NodeAbstractResource correct default result from ProvidedBy 2018-10-16 18:48:28 -07:00
transform_root.go terraform: provider transform is converted to new graph world view 2017-01-26 20:58:22 -08:00
transform_state.go core: Be more explicit in how we handle create_before_destroy 2018-10-16 19:14:11 -07:00
transform_targets_test.go core: Get tests compiling again 2018-10-16 18:46:46 -07:00
transform_targets.go don't check for targeted downstream from providers 2018-10-16 18:49:20 -07:00
transform_transitive_reduction_test.go terraform.Schemas: export struct fields 2018-10-16 19:14:11 -07:00
transform_transitive_reduction.go terraform: add TransitiveReductionTransformer 2015-02-27 19:18:04 -08:00
transform_variable.go terraform: ugly huge change to weave in new HCL2-oriented types 2018-10-16 18:46:46 -07:00
transform_vertex_test.go terraform: GraphVertexTransformers 2015-02-19 12:07:57 -08:00
transform_vertex.go terraform: GraphVertexTransformers 2015-02-19 12:07:57 -08:00
transform.go terraform: ugly huge change to weave in new HCL2-oriented types 2018-10-16 18:46:46 -07:00
ui_input_mock.go terraform: Input() asks for variable inputs 2014-09-28 23:37:36 -07:00
ui_input_prefix_test.go terraform: prefix the Id for configuring providers 2014-09-29 10:36:49 -07:00
ui_input_prefix.go terraform: Make output more machine-like 2014-09-29 12:52:48 -07:00
ui_input.go helper/scheam: support UI defaults 2014-09-29 14:00:35 -07:00
ui_output_callback_test.go terraform: provisioners 2015-02-19 12:08:06 -08:00
ui_output_callback.go terraform: provisioners 2015-02-19 12:08:06 -08:00
ui_output_mock_test.go terraform: UIOutput interface 2014-10-04 09:00:07 -07:00
ui_output_mock.go minor race fix in tests 2017-10-02 16:19:01 -04:00
ui_output_provisioner_test.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
ui_output_provisioner.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
ui_output.go terraform: UIOutput interface 2014-10-04 09:00:07 -07:00
upgrade_state_v1_test.go Fix swallowed tests in terraform package tests 2017-07-20 02:23:43 -07:00
upgrade_state_v2_test.go core: Add test for V2->V3 state upgrade 2016-06-09 11:16:34 +01:00
user_agent.go Standardize http.Client creation with User-Agent 2018-02-28 12:09:50 -05:00
util_test.go Resolve resource provider types in config package 2017-06-09 14:03:59 -07:00
util.go Resolve resource provider types in config package 2017-06-09 14:03:59 -07:00
valuesourcetype_string.go Fix wildcard dependencies when upgrading states 2018-11-15 13:17:15 +01:00
variables_test.go core: Remove GraphSemanticChecker, etc 2018-11-26 08:25:03 -08:00
variables.go core: Remove GraphSemanticChecker, etc 2018-11-26 08:25:03 -08:00
version_required.go terraform: ugly huge change to weave in new HCL2-oriented types 2018-10-16 18:46:46 -07:00
version.go use the new version package 2017-10-19 21:48:08 -04:00
walkoperation_string.go core: update Stringer implementations for GraphType and walkOperation 2018-10-16 18:49:20 -07:00