Commit Graph

2444 Commits

Author SHA1 Message Date
Radek Simko
84d4e78481 core: Add test to show that data resource reads are not functioning properly 2018-10-16 19:14:11 -07:00
Martin Atkins
ec2e6cb06f terraform: Prune resource husks at the end of "terraform destroy"
When we're being asked to destroy everything, we ideally want to end up
with a totally empty state. Normally we will conservatively keep around
the "husks" of resources (what's left after all of the instances have been
destroyed) unless they are configured without count or for_each, but in
this special case we'll prune those out.

The implication of this is that in "weird" expression contexts that happen
before the next "terraform plan", such as evaluation in
"terraform console" or expressions in data resources and provider blocks
that get evaluated during the refresh walk, we will see these results
as unknown rather than as empty lists of objects. We accept that weirdness
for now because in a future release we are likely to remove "refresh" as
a separate walk anyway, doing all of that work during the plan walk where
we can ensure that these values are properly re-populated before trying
to use them.
2018-10-16 19:14:11 -07:00
Martin Atkins
4ee15ec604 core: MockProvider.GetSchema shouldn't panic if unconfigured
Some mock objects will not have any mock behavior configured for the
GetSchema method, so we should just return a valid-but-empty schema in
that case, rather than panicking as we did before.
2018-10-16 19:14:11 -07:00
Martin Atkins
a2a37ae40d provisioners: Add Factory type and FactoryFixed helper
These are similar to the symbols of the same name in package "providers".

terraform.ProvisionerFactory is now an alias for provisioners.Factory, so
we can defer updating all of the existing users of it.
2018-10-16 19:14:11 -07:00
Martin Atkins
5ff35c1a9a repl: Make tests compile and execute without panics
There are still some errors left, because our expression evaluator now
does more validation than before and so we'll need to (in a subsequent
commit) actually use a fixture configuration for these tests so that the
validations will allow the expressions to be validated.
2018-10-16 19:14:11 -07:00
Martin Atkins
3919a9644c core: go fmt context_plan_test.go 2018-10-16 19:14:11 -07:00
Martin Atkins
55103985f7 core: Fix TestContext2Apply_moduleDestroyOrder
This test was occasionally failing due to a missing graph edge causing it
to be non-deterministic.

The graph edge was missing because our standard schema doesn't quite match
the config fixture and so the reference checker was not finding the "blah"
argument on aws_instance.a.

This change also includes an 100ms pause for the b node just to make this
potential race more likely to hit the "wrong" ordering when the graph is
not complete.
2018-10-16 19:14:11 -07:00
Martin Atkins
620f04af73 core: Fix TestContext2Plan_moduleVariableFromSplat
The weird special-case behaviors of testDiffFn were interfering with the
outcome of this test, but we don't actually need any of those special
behaviors here so we'll use a very simple PlanResourceChangeFn
implementation instead, just letting the built-in merge behavior in core
take care of it.
2018-10-16 19:14:11 -07:00
Martin Atkins
b229264bd6 core: A "go fmt" catchup
Since we started using experimental Go Modules our editor tooling hasn't
been fully functional, apparently including format-on-save support. This
is a catchup to get everything back straight again.
2018-10-16 19:14:11 -07:00
Martin Atkins
eddc29d6e4 core: Fix TestRefreshGraphBuilder_configOrphans
We now include explicit separate nodes in the graph for deposed instances,
whereas before we just dealt with them inside the main nodes.
2018-10-16 19:14:11 -07:00
Martin Atkins
3b2834b8fc core: Re-instate the ignore_changes processing tests 2018-10-16 19:14:11 -07:00
Martin Atkins
33d01a2ba2 core: Fix TestContext2Apply_moduleOrphanGrandchildProvider
One of the assumptions this test was checking no longer holds: we don't
retain outputs for non-root modules in persistent state, because we can
always re-populate these on a future run by evaluating the configuration.
2018-10-16 19:14:11 -07:00
Martin Atkins
95bdf98738 core: Fix TestContext2Apply_moduleOrphanProvider
We now always expect to find a provider configuration in state. If not,
we assume a module-local one, which is not what this test was trying to
test.
2018-10-16 19:14:11 -07:00
Martin Atkins
4dd4b721ac core: Fix TestContext2Apply_moduleOrphanInheritAlias
The old-fashioned formatting of "Provider" on the shimmed state here was
causing the state upgrade code to treat it like a module-relative address,
rather than an absolute address as we now expect.
2018-10-16 19:14:11 -07:00
Martin Atkins
76fca28faa core: Better error message for prematurely-removed provider config
This error message appears in a situation that is often confusing for
users, since the connection between resources and their providers in the
state is not something we draw attention to in the user experience of
Terraform.

This new error message tries to be a bit clearer about what the user must
do to resolve it. It's still not perfect since it doesn't cover the
variant of this problem where an entire module containing a provider block
and resources has been removed at the same time, but since there isn't
an easily-summarizable way to continue in that state this will need to
do for the moment, until we find a way to file off that rough edge in
the workflow.
2018-10-16 19:14:11 -07:00
Martin Atkins
4a62315d35 core: Don't show full provider configuration block in the logs
Configuration blocks can contain sensitive information, so better to just
talk about them by reference (in this case, source location) rather than
embedding them directly, to reduce the risk of accidental information
leakage through sharing logs for debug purposes.
2018-10-16 19:14:11 -07:00
Martin Atkins
5af82917b9 core: Fix TestEvalWriteStateDeposed
This was already updated for the new state types earlier, but since then
we adjusted how deposed instances are written out in the old string
representation of state, and so this regressed.
2018-10-16 19:14:11 -07:00
Martin Atkins
902e8e1f2a core: Fix two TestContext2Input_... tests
These both just were missing some computed attributes from their schema,
which was causing them to not appear in the rendered state output.
2018-10-16 19:14:11 -07:00
Martin Atkins
fdf7057ff5 core: Fix various state-pruning-related test failures
These tests show that we're still not fully pruning modules from the state
in all cases, due to us not being able to fully prune out modules that
contain resources with count set after a destroy, but this is no worse
than before so we'll accept it for now and address this separately later.

A module heading without "<no state>" but also without any instances
listed is the rendering for a module containing a resource that has no
instances, since our old string rendering of state doesn't represent
resources themselves.
2018-10-16 19:14:11 -07:00
Martin Atkins
69bcbfb813 core: Fix TestContext2Apply_destroyModuleWithAttrsReferencingResource
Now that we're properly pruning orphaned resources and empty modules from
the state, our expected output is a little different.
2018-10-16 19:14:11 -07:00
Martin Atkins
2eea07750a core: Clean up resource states when they are orphaned
We previously had mechanisms to clean up only individual instance states,
leaving behind empty resource husks in the state after they were all
destroyed.

This takes care of it in the "orphan" case. It does not yet do it in the
"terraform destroy" or "terraform plan -destroy" cases because we don't
have anywhere to record in the plan that we're actually destroying and so
the resource configurations should be ignored and _everything_ should be
cleaned. We'll let the state be not-quite-empty in that case for now,
since it doesn't really hurt; cleaning up orphans is the main case because
the state will live on afterwards and so leftover cruft will accumulate
over the course of many changes.
2018-10-16 19:14:11 -07:00
Martin Atkins
a806bb7d8c core: OrphanResourceTransformer -> OrphanResourceInstanceTransformer
This transformer creates resource _instance_ nodes rather than resource
nodes, so this name is a clearer descriptor for what it does.
2018-10-16 19:14:11 -07:00
Martin Atkins
311cdbdcab core: Remove unused EvalDiffDestroyModule
This is no longer needed because the state structure self-prunes when
a module becomes empty.
2018-10-16 19:14:11 -07:00
Martin Atkins
ab1dc08e5c core: Fix TestContext2Apply_dataDependsOn
The value returned from ReadDataSourceFn must conform to the schema for
the data source.
2018-10-16 19:14:11 -07:00
Martin Atkins
804da4be57 core: Fix TestContext2Apply_multiDepose_createBeforeDestroy
Since this one has a situation where there are two deposed objects for
the same instance at once, we can't rely on comparing state strings: they
are not deterministic when multiple deposed objects are present.

Instead, we do more surgical comparisons directly on the state model
objects, which is not quite as robust but still gets us the main stuff we
care about here, to be followed up by another checkStateString further
down for the final state.
2018-10-16 19:14:11 -07:00
Martin Atkins
bad0f7fafd core: Fix TestContext2Apply_targetedWithTaintedInState
Tainted objects now also remember which provider they belong to (via the
resource state they are attached to) and so the stringified state output
here is slightly different.
2018-10-16 19:14:11 -07:00
Martin Atkins
b565018bf1 core: Fix TestContext2Apply_provisionerInterpCount
This was relying on a no-longer-valid mechanism for accessing the "count"
value from a resource block. The original issue this test was written to
cover is not really such a sharp edge anymore, since the length is taken
from the state during apply rather than from configuration, but it's still
a good case to cover.
2018-10-16 19:14:11 -07:00
Martin Atkins
f88b4fd1f4 core: Fix TestContext2Apply_issue7824
This test was incorrectly amended on the first pass to create a
configuration snapshot from the step zero configuration, rather than the
step one configuration that the save plan is built from.

Along with that, it needed various other minor updates to match with
details that have shifted:
- "id" and "type" attributes must be explicitly declared in schema
- template_file.parent has count = 1, which now causes it to get an index
  and be a list where before it did not.
2018-10-16 19:14:11 -07:00
Martin Atkins
49fa2b3f35 core: Always set ProviderAddr on EvalDiffDestroy
If we don't set it, we end up creating an invalid plan where the destroy
changes don't have a provider address set, which then later fails
decoding when round-tripped through a planfile.

This also includes some extra safety checks in EvalDiff and
EvalDiffDestroy so that we can catch this bug sooner in future.

This change is verified by
TestContext2Apply_plannedDestroyInterpolatedCount, which is now passing.
2018-10-16 19:14:11 -07:00
Martin Atkins
48dd8ddec5 core: test helper contextOptsForPlanViaFile to set default backend
A plan file without a backend set is not valid, but at the level we're
testing in this package we don't really care about backends so we'll just
set a default one if the caller doesn't set something more specific, and
then we'll just ignore it completely when reading back.
2018-10-16 19:14:11 -07:00
Martin Atkins
9e0f7c10d9 core: Skip ignore_changes handling for create actions
It doesn't make sense to ignore_changes when the prior value is null,
since we have to create something before we can ignore changes to it.

This change is verified by TestContext2Apply_ignoreChangesWildcard.
2018-10-16 19:14:11 -07:00
Martin Atkins
5c4545dac2 core: Fix TestContext2Apply_destroyProvisionerWithMultipleLocals
This test was relying on the feature of the old provisioner API that gave
provisioners full access to the instance state of what they were
provisioning.

We no longer do this, and so instead the ApplyFn must distingish the
instances using a value from the provisioner's own configuration.
2018-10-16 19:14:11 -07:00
Martin Atkins
2bab5bf502 core: Allow planned Update change to become NoOp during apply
This can happen if unknown values in the plan actually end up being
identical to the prior values once resolved. In that case, we'll just make
no change at all.

This is verified by TestContext2Apply_ignoreChangesWithDep.
2018-10-16 19:14:11 -07:00
Martin Atkins
1885f107a5 core: Fix TestContext2Apply_destroyDeeplyNestedModule
The new state.String() has slightly different output for an empty state,
so we'll test that it's empty in a more direct way.
2018-10-16 19:14:11 -07:00
Martin Atkins
d1f95ea6a7 core: Fix TestContext2Apply_Provisioner_compute
Due to a quirk in how testDiffFn constructs its diff, compute doesn't
actually get included in the final result anymore under the new shims.
This result is still correct, nonetheless.
2018-10-16 19:14:11 -07:00
Martin Atkins
1cfaf52406 core: Fix TestContext2Apply_outputOrphanModule
The new state.String is not quite identical to the old, so we'll assert
an empty state in a more direct way.
2018-10-16 19:14:11 -07:00
Martin Atkins
b6e9a5e5a4 core: Fix TestContext2Apply_outputOrphanModule
This is caused just be a slight difference in the new implementation of
stringifying state.
2018-10-16 19:14:11 -07:00
Martin Atkins
90faaf9f80 core: Fix TestContext2Apply_countTainted
The prior behavior being asserted by this test was incorrect, since the
configuration calls for there to be two instances of the resource at the
end.

We also now assert on the generated plan since it's important to verify
that we are indeed planning to replace the zeroth instance but not the
first instance (which doesn't yet exist).
2018-10-16 19:14:11 -07:00
Martin Atkins
ca6efc6ba9 core: Fix TestContext2Apply_countDecreaseToOneCorrupted
We now include attribute changes in destroy diffs, so the expected output
of this test includes these changes.

Also includes a fix to legacyDiffComparisonString to actually sort the
attribute changes by name in the rendered diff.
2018-10-16 19:14:11 -07:00
Martin Atkins
74ffebe8ea core: Fix TestContext2Apply_compute
The testDiffFn doesn't include "compute" in the diff it produces and so
it no longer appears in the shimmed output.

This is just a quirk of this weird mock implementation; real providers
always copy all of the values from thec config into the diff before adding
in any other changes.
2018-10-16 19:14:11 -07:00
Martin Atkins
e6f8b51111 core: Fix TestContext2Apply_cancelProvisioner
This test now requires a provisioner schema for correct operation.
2018-10-16 19:14:11 -07:00
Martin Atkins
032f908f4a core: MockProvider and MockProvisioner can't lock in Stop
The only reasonable usage of these methods is for them to run concurrently
with other methods, so we mustn't hold a lock to do this work. For tests
that deal with stopping, it's the test's own responsibility to deal with
any concurrency issues that arise from their StopFns running concurrently
with other mock functions.
2018-10-16 19:14:11 -07:00
Martin Atkins
21071fb679 core: Additional logging for Context.Stop
Since stopping is a rather complex mechanism that relies on correct
handling of concurrency, it's handy to have these logs here to debug when
things don't happen in quite the right order.
2018-10-16 19:14:11 -07:00
James Bardin
847c8d6244 CBD transformer test update
Comment out an out of date CBD test. The test no longer works due to
the CBD status being checked during plan, but the test case may still
have some value which we can review later.

update the text in the CBD transformer to reflect the
s/ancestor/descendent/ change.
2018-10-16 19:14:11 -07:00
Kristin Laemmert
fe67d9dbf8 terraform.Schemas: export struct fields
There does not appear to be any real reason that these Schemas fields are
not exported, and exporting them makes it possible to directly construct
Schemas for tests without pulling in an entire context.
2018-10-16 19:14:11 -07:00
James Bardin
844f157183 finish graph builder test updates 2018-10-16 19:14:11 -07:00
Martin Atkins
9dcc841f31 core: Fix TestContext2Apply_cancel
Now that we populate a resource-level state pre-emptively for a resource,
before we apply the instances of that resource, it is no longer true that
this produces only one resource state, but the test below (comparing the
string version of the state) already captures the expected behavior and
so this additional check was redundant anyway.
2018-10-16 19:14:11 -07:00
Martin Atkins
185d9cf7fe core: Fix TestContext2Apply_destroyCrossProviders
This test needed a schema that better reflects the expectations of its
configuration fixture.
2018-10-16 19:14:11 -07:00
Martin Atkins
6491c6d997 core: Fix TestContext2Apply_dataBasic
The mock provider must be configured to return an object of a type that
conforms to the schema for the test_data_source resource type.
2018-10-16 19:14:11 -07:00
Martin Atkins
058df3563f core: fix TestContext2Apply_createBeforeDestroy_hook
This test was incorrectly updated to the new hook API; it should've been
recording the individual resource state values passed to the hook, not
the original state as a whole (which is not yet updated at the point
when the hook is called).
2018-10-16 19:14:11 -07:00