terraform/helper/schema
Chris Marchesi d7048cb640
helper/schema: ResourceDiff ForceNew attribute correctness
A couple of bugs have been discovered in ResourceDiff.ForceNew:

* NewRemoved is not preserved when a diff for a key is already present.
This is because the second diff that happens after customization
performs a second getChange on not just state and config, but also on
the pre-existing diff. This results in Exists == true, meaning nil is
never returned as a new value.
* ForceNew was doing the work of adding the key to the list of changed
keys by doing a full SetNew on the existing value. This has a side
effect of fetching zero values from what were otherwise undefined values
and creating diffs for these values where there should not have been
(example: "" => "0").

This update fixes these scenarios by:

* Adding a new private function to check the existing diff for
NewRemoved keys. This is included in the check on new values in
diffChange.
* Keys that have been flagged as ForceNew (or parent keys of lists and
sets that have been flagged as ForceNew) are now maintained in a
separate map. UpdatedKeys now returns the results of both of these maps,
but otherwise these keys are ignored by ResourceDiff.
* Pursuant the above, values are no longer pushed into the newDiff
writer by ForceNew. This prevents the zero value problem, and makes for
a cleaner implementation where the provider has to "manually" SetNew to
update the appropriate values in the writer. It also prevents
non-computed keys from winding up in the diff, which ResourceDiff
normally blocks by design.

There are also a couple of tests for cases that should never come up
right now involving Optional/Computed values and NewRemoved, for which
explanations are given in annotations of each test. These are here to
guard against future regressions.
2018-04-08 07:50:41 -07:00
..
README.md helper/schema: README 2014-08-17 20:51:09 -07:00
backend.go helper/schema: Hook CustomizeDiffFunc into diff logic 2017-11-01 14:25:32 -07:00
backend_test.go helper/schema: framework for Backends 2017-01-26 14:33:49 -08:00
core_schema.go core: terraform.ResourceProvider.GetSchema method 2017-10-17 07:23:41 -07:00
core_schema_test.go core: terraform.ResourceProvider.GetSchema method 2017-10-17 07:23:41 -07:00
data_source_resource_shim.go helper/schema: emit warning when using data source resource shim 2016-05-14 08:26:36 -07:00
equal.go helper/schema: use interface for equality check 2015-01-16 09:32:15 -08:00
field_reader.go helper/schema: handle TypeMap elem consistently with other collection types 2018-03-14 14:50:41 -07:00
field_reader_config.go helper/schema: handle TypeMap elem consistently with other collection types 2018-03-14 14:50:41 -07:00
field_reader_config_test.go helper/schema: handle TypeMap elem consistently with other collection types 2018-03-14 14:50:41 -07:00
field_reader_diff.go helper/schema: handle TypeMap elem consistently with other collection types 2018-03-14 14:50:41 -07:00
field_reader_diff_test.go helper/schema: handle TypeMap elem consistently with other collection types 2018-03-14 14:50:41 -07:00
field_reader_map.go helper/schema: handle TypeMap elem consistently with other collection types 2018-03-14 14:50:41 -07:00
field_reader_map_test.go helper/schema: handle TypeMap elem consistently with other collection types 2018-03-14 14:50:41 -07:00
field_reader_multi.go helper/schema: full object test for addrToSchema 2015-01-09 17:43:44 -08:00
field_reader_multi_test.go Revert "helper/schema: Make nested Set(s) in List(s) work" (#7436) 2016-06-30 10:48:52 -05:00
field_reader_test.go helper/schema: handle TypeMap elem consistently with other collection types 2018-03-14 14:50:41 -07:00
field_writer.go helper/schema: FieldWriter, replace Set 2015-01-10 11:44:26 -08:00
field_writer_map.go helper/schema: Clear existing map/set/list contents before overwriting 2017-11-05 12:04:23 -08:00
field_writer_map_test.go helper/schema: Clear existing map/set/list contents before overwriting 2017-11-05 12:04:23 -08:00
getsource_string.go Update various files for new version of "stringer" 2017-12-11 13:26:29 -08:00
provider.go s/repalce/replace 2018-01-23 17:41:03 +01:00
provider_test.go core: terraform.ResourceProvider.GetSchema method 2017-10-17 07:23:41 -07:00
provisioner.go helper/schema: Hook CustomizeDiffFunc into diff logic 2017-11-01 14:25:32 -07:00
provisioner_test.go Refactor the provisioner validation function (#15273) 2017-06-15 19:57:04 +02:00
resource.go make sure ResourceData timeouts are always set 2018-03-22 15:10:43 -04:00
resource_data.go make sure ResourceData timeouts are always set 2018-03-22 15:10:43 -04:00
resource_data_get_source.go helper/schema: diff with set going to 0 elements removes it from state 2015-02-17 11:38:56 -08:00
resource_data_test.go make sure ResourceData timeouts are always set 2018-03-22 15:10:43 -04:00
resource_diff.go helper/schema: ResourceDiff ForceNew attribute correctness 2018-04-08 07:50:41 -07:00
resource_diff_test.go helper/schema: ResourceDiff ForceNew attribute correctness 2018-04-08 07:50:41 -07:00
resource_importer.go helper/schema: pass through import state func 2016-05-16 10:03:57 -07:00
resource_test.go make sure ResourceData timeouts are always set 2018-03-22 15:10:43 -04:00
resource_timeout.go helper/schema: Rename Timeout resource block to Timeouts (#12533) 2017-03-09 14:40:14 -06:00
resource_timeout_test.go helper/schema: Rename Timeout resource block to Timeouts (#12533) 2017-03-09 14:40:14 -06:00
schema.go Merge pull request #17588 from creack/creack/fix-deepcopy-type 2018-04-05 09:24:08 -04:00
schema_test.go helper/schema: ResourceDiff ForceNew attribute correctness 2018-04-08 07:50:41 -07:00
serialize.go core: Avoid crash on empty TypeSet blocks (#14305) 2017-05-09 20:45:53 +02:00
serialize_test.go Add test for TypeMap in a Schema 2016-06-09 16:00:33 -04:00
set.go helper/schema: Add Set.HashEqual 2017-08-15 21:50:52 -07:00
set_test.go helper/schema: More tests for Set.HashEqual 2017-08-15 21:56:01 -07:00
testing.go helper/schema: Hook CustomizeDiffFunc into diff logic 2017-11-01 14:25:32 -07:00
valuetype.go helper/schema: zero value of a set should be empty 2015-02-17 16:58:47 -08:00
valuetype_string.go Update various files for new version of "stringer" 2017-12-11 13:26:29 -08:00

README.md

Terraform Helper Lib: schema

The schema package provides a high-level interface for writing resource providers for Terraform.

If you're writing a resource provider, we recommend you use this package.

The interface exposed by this package is much friendlier than trying to write to the Terraform API directly. The core Terraform API is low-level and built for maximum flexibility and control, whereas this library is built as a framework around that to more easily write common providers.