terraform/helper/schema
Paul Hinze b4df304b47
helper/schema: Normalize bools to "true"/"false" in diffs
For a long time now, the diff logic has relied on the behavior of
`mapstructure.WeakDecode` to determine how various primitives are
converted into strings.  The `schema.DiffString` function is used for
all primitive field types: TypeBool, TypeInt, TypeFloat, and TypeString.

The `mapstructure` library's string representation of booleans is "0"
and "1", which differs from `strconv.FormatBool`'s "false" and "true"
(which is used in writing out boolean fields to the state).

Because of this difference, diffs have long had the potential for
cosmetically odd but semantically neutral output like:

    "true" => "1"
    "false" => "0"

So long as `mapstructure.Decode` or `strconv.ParseBool` are used to
interpret these strings, there's no functional problem.

We had our first clear functional problem with #6005 and friends, where
users noticed diffs like the above showing up unexpectedly and causing
troubles when `ignore_changes` was in play.

This particular bug occurs down in Terraform core's EvalIgnoreChanges.
There, the diff is modified to account for ignored attributes, and
special logic attempts to handle properly the situation where the
ignored attribute was going to trigger a resource replacement. That
logic relies on the string representations of the Old and New fields in
the diff to be the same so that it filters properly.

So therefore, we now get a bug when a diff includes `Old: "0", New:
"false"` since the strings do not match, and `ignore_changes` is not
properly handled.

Here, we introduce `TypeBool`-specific normalizing into `finalizeDiff`.
I spiked out a full `diffBool` function, but figuring out which pieces
of `diffString` to duplicate there got hairy. This seemed like a simpler
and more direct solution.

Fixes #6005 (and potentially others!)
2016-05-05 09:00:58 -05:00
..
README.md helper/schema: README 2014-08-17 20:51:09 -07:00
equal.go helper/schema: use interface for equality check 2015-01-16 09:32:15 -08:00
field_reader.go helper/schema: Default hashing function for sets 2015-10-03 18:10:47 -07:00
field_reader_config.go Change Set internals and make (extreme) performance improvements 2015-11-22 14:21:28 +01:00
field_reader_config_test.go Use built-in schema.HashString. 2016-02-07 16:29:34 -08:00
field_reader_diff.go helper/schema: Default hashing function for sets 2015-10-03 18:10:47 -07:00
field_reader_diff_test.go removed extra parentheses 2015-10-08 15:48:04 +03:00
field_reader_map.go helper/schema: Default hashing function for sets 2015-10-03 18:10:47 -07:00
field_reader_map_test.go removed extra parentheses 2015-10-08 15:48:04 +03: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 helper/schema: too big to fail 2015-01-08 18:02:19 -08:00
field_reader_test.go removed extra parentheses 2015-10-08 15:48:04 +03:00
field_writer.go helper/schema: FieldWriter, replace Set 2015-01-10 11:44:26 -08:00
field_writer_map.go consul: Fix several problems w/ consul_keys update 2016-01-26 14:46:26 -06:00
field_writer_map_test.go Merge pull request #3257 from fatih/fix-nil-setting-schema 2015-12-08 20:15:00 -06:00
getsource_string.go Reflect new comment format in stringer.go 2015-11-09 11:38:51 -05:00
provider.go helper/schema: internal validate as part of provider validation 2015-06-23 16:52:04 -07:00
provider_test.go removed extra parentheses 2015-10-08 15:48:04 +03:00
resource.go Merge pull request #4446 from TimeIncOSS/f-schema-new-resource 2016-02-29 20:07:00 +00:00
resource_data.go helper/schema: Allow identification of a new resource in update func 2015-12-27 14:01:03 +01: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 Change Set internals and make (extreme) performance improvements 2015-11-22 14:21:28 +01:00
resource_test.go helper/schema: Allow identification of a new resource in update func 2015-12-27 14:01:03 +01:00
schema.go helper/schema: Normalize bools to "true"/"false" in diffs 2016-05-05 09:00:58 -05:00
schema_test.go helper/schema: Normalize bools to "true"/"false" in diffs 2016-05-05 09:00:58 -05:00
serialize.go helper/schema: Default hashing function for sets 2015-10-03 18:10:47 -07:00
serialize_test.go helper/schema: Default hashing function for sets 2015-10-03 18:10:47 -07:00
set.go Change Set internals and make (extreme) performance improvements 2015-11-22 14:21:28 +01:00
set_test.go Change Set internals and make (extreme) performance improvements 2015-11-22 14:21:28 +01:00
valuetype.go helper/schema: zero value of a set should be empty 2015-02-17 16:58:47 -08:00
valuetype_string.go Reflect new comment format in stringer.go 2015-11-09 11:38:51 -05: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.