Commit Graph

732 Commits

Author SHA1 Message Date
Paul Hinze f1c9e32fa0 core: tweaks from code review 2015-03-05 10:11:14 -06:00
Paul Hinze 6e13aacefa core: [refactor] DRY up EvalWriteState nodes
Also some final comment cleanup
2015-03-04 18:22:18 -06:00
Paul Hinze 6c93fbb85d core: [refactor] store Deposed resource instances as a list
Deposed instances need to be stored as a list for certain pathological
cases where destroys fail for some reason (e.g. upstream API failure,
Terraform interrupted mid-run). Terraform needs to be able to remember
all Deposed nodes so that it can clean them up properly in subsequent
runs.

Deposed instances will now never touch the Tainted list - they're fully
managed from within their own list.

Added a "multiDepose" test case that walks through a scenario to
exercise this.
2015-03-04 12:25:59 -06:00
Paul Hinze 426f253085 core: [refactor] split WriteState EvalNodes
This is the non-DRY pass.
2015-03-04 12:25:47 -06:00
Paul Hinze d81ec2d37e core: [refactor] pull out common ReadState behavior 2015-03-04 12:25:47 -06:00
Paul Hinze 596e891b80 core: [refactor] pull Deposed out of Tainted list 2015-03-04 12:25:47 -06:00
Mitchell Hashimoto 80c129a961 terraform: style, multiline a long line 2015-03-02 08:41:09 -08:00
Mitchell Hashimoto 4894080d87 Merge pull request #1086 from hashicorp/b-pph
terraform: catch scenario where both "foo" and "foo.0" are in state
2015-03-02 08:34:05 -08:00
Mitchell Hashimoto 11d073f7d4 terraform: test the increase from one case 2015-03-01 21:39:48 -08:00
Mitchell Hashimoto 2389251c38 terraform: catch scenario where both "foo" and "foo.0" are in state 2015-03-01 21:28:41 -08:00
Mitchell Hashimoto 865de51816 dag: do a DFS for each vertex 2015-02-27 19:37:59 -08:00
Mitchell Hashimoto 9eb7ebbddd terraform: do the transitive reduction as part of the graph builder 2015-02-27 19:23:20 -08:00
Mitchell Hashimoto 903e49162d terraform: add TransitiveReductionTransformer 2015-02-27 19:18:04 -08:00
Mitchell Hashimoto ac6efa5e57 Merge pull request #1065 from hashicorp/f-taint
Add "taint" command
2015-02-26 23:55:20 -08:00
Paul Hinze c03e44106f core: band-aid fix for tainted double destroy
After a lot of fun debugging with @mitchellh we finally have a diagnosis
for #1056.

I'm going to attempt to reproduce the diagnosis in prose to test out my
understanding.

----

The `DestroyTransformer` runs twice:

 * `DestroyPrimary` mode creates destroy nodes for normal resources
 * `DestroyTainted` mode creates destroy nodes for tainted resources

These destroy nodes are specializations of `GraphConfigNode`, which has
a `DynamicExpand` step.

In `DynamicExpand` we have a race condition between the normal destroy
node and the tainted destroy node for a given resource when
`CreateBeforeDestroy` is off.

The `DestroyTainted` `GraphConfigNode` must run the `TaintedTransform`
to draw out tainted nodes, since it is reponsible for destroying them
for replacement.

The `DestroyPrimary` `GraphConfigNode` _also_ runs `TaintedTransform` -
this is to catch `Deposed` nodes from CBD, which are piggy backing on
the end of the `Tainted` list.

Here's the bug: when CBD is off and you start an apply with a tainted
resource in your state, both `DestroyPrimary` and `DestroyTainted` catch
it and create their own `graphNodeTaintedResource` in their respective
subgraphs.

If parallelism is disabled, this doesn't happen because the
`DestroyPrimary` subgraph resolves completely before the
`DestroyTainted` node does its `DynamicExpand`, so the `Tainted` list
has been cleared by the time `DestroyTainted` is expanding. With
parallelism, each of these two subgraphs plays out in its own goroutine
simultaneously, and each picks up the tainted resource(s) that the apply
starts with.  So you get two `graphNodeTaintedResource` nodes, and two
destroys.

This band-aid fixes that by skipping the TaintedTransform alltogether in
the `DestroyPrimary` node if CBD is off.

A better fix will follow, which involves reworking the `Deposed` concept
so it no longer piggybacks on `Tainted`.

fixes #1056
2015-02-26 22:32:50 -06:00
Mitchell Hashimoto 4ec31ecb95 command/taint: new command 2015-02-26 10:29:23 -08:00
Mitchell Hashimoto b3cd1bd5bc terraform: add ResourceState.Taint 2015-02-26 09:58:56 -08:00
Mitchell Hashimoto 341be226f4 terraform: test for various taint cases 2015-02-26 09:50:18 -08:00
Mitchell Hashimoto 6affc57b2d terraform: destroy node should not create 2015-02-24 22:45:47 -08:00
Mitchell Hashimoto 1fcbfcd19d Merge pull request #1037 from hashicorp/f-continuous-state
Continuous state persistance
2015-02-24 17:34:19 -08:00
Mitchell Hashimoto ac167c3082 terraform: test post state update is called 2015-02-23 22:10:31 -08:00
Mitchell Hashimoto 57f7507ebd terraform: more state tests, fix a bug 2015-02-23 21:43:54 -08:00
Mitchell Hashimoto f3af221866 terraform: make DeepCopy public 2015-02-23 21:32:27 -08:00
Mitchell Hashimoto c2bf600603 state: only change serial if changed 2015-02-23 21:26:33 -08:00
Mitchell Hashimoto 821536b1e9 terraform: call the EvalUpdateStateHook strategically 2015-02-23 19:14:16 -08:00
Mitchell Hashimoto 429711b938 terraform: PostStateUpdate hook and EvalUpdateStateHook 2015-02-23 19:09:48 -08:00
Mitchell Hashimoto 3f9dafc5f6 Merge pull request #1033 from hashicorp/f-self
core: Self Variables
2015-02-23 15:19:48 -08:00
Mitchell Hashimoto 330364f668 terraform: State.IsEmpty 2015-02-23 15:13:54 -08:00
Mitchell Hashimoto 6cd5c894e8 terraform: State.IsRemote 2015-02-23 15:13:54 -08:00
Mitchell Hashimoto dd7bc5db0c terraform: more self tests 2015-02-23 15:02:26 -08:00
Mitchell Hashimoto 0e59acc2c9 terraform: enable self vars 2015-02-23 14:56:02 -08:00
Mitchell Hashimoto 022967acdb terraform: module inputs/vars can be non-strings [GH-819] 2015-02-23 13:50:53 -08:00
Mitchell Hashimoto 8a9c8a882e Merge pull request #1019 from hashicorp/f-state-equality
terraform: State.Equal to check for state equality
2015-02-23 13:47:47 -08:00
Mitchell Hashimoto 709c40026c terraform: remove debug println 2015-02-23 13:45:45 -08:00
Mitchell Hashimoto 39d2bf4629 terraform: cache provider configuration with the provider name
/cc @sethvargo

This was causing a race with whichever provider was configured first
would "win" the configuration slot. We need to make sure to append the
unique provider name to the end of the key.

Note: this doesn't have tests. We don't test this yet. :(
2015-02-20 15:48:06 -08:00
Mitchell Hashimoto 40ee70d5c9 terraform: Input should only be called on providers once
/cc @sethvargo

Prior to this commit, we'd only persist the result of calling Input if
any input was given (len(result) > 0). The result was that every module
would also repeat asking for input even if there was no input to be
asked for.

This commit makes it so that if no input was received, we still set a
sentinel so that modules don't re-ask.
2015-02-20 15:35:57 -08:00
Mitchell Hashimoto b041f48e56 terraform: State.Equal 2015-02-20 13:39:49 -08:00
Mitchell Hashimoto 85e2bef179 terraform: provisioners should be cached with the provisioner name 2015-02-20 10:50:36 -08:00
Mitchell Hashimoto ab414de0ab terraform: test case for destroying with a count [GH-527] 2015-02-20 10:02:52 -08:00
Mitchell Hashimoto c2593f6ada terraform: re-enable dot-graphs 2015-02-19 23:00:29 -08:00
Mitchell Hashimoto 4b6f258f1f terraform: only depose state if we're doing the destroy side 2015-02-19 12:08:34 -08:00
Mitchell Hashimoto fa222a44c3 terraform: limit parallelism 2015-02-19 12:08:34 -08:00
Mitchell Hashimoto 0175d1babc terraform: updated comment 2015-02-19 12:08:33 -08:00
Mitchell Hashimoto 10e96ad72d terraform: provisioner config is properly interpolated 2015-02-19 12:08:33 -08:00
Mitchell Hashimoto ae68cf1705 terraform: slightly better validation error messages 2015-02-19 12:08:33 -08:00
Mitchell Hashimoto 459ad04d71 terraform: provider cache should append the provider name to it 2015-02-19 12:08:33 -08:00
Mitchell Hashimoto ad595cf254 terraform: test case for cycle of CBD depending on non-CBD 2015-02-19 12:08:33 -08:00
Mitchell Hashimoto e68ea0d38f terraform: only keep the destroy if we decreased counts 2015-02-19 12:08:33 -08:00
Mitchell Hashimoto 1ed37f0b7f terraform: change DiffId to DiffInclude to allow smarter logic
This lets us check for orphans properly.
2015-02-19 12:08:33 -08:00
Mitchell Hashimoto 4789f16796 terraform: tainted destroy nodes 2015-02-19 12:08:33 -08:00