From 1da560b653eaa699692fb48e8935f8d32b922578 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Sun, 1 May 2016 21:38:44 -0700 Subject: [PATCH] core: Separate resource lifecycle for data vs. managed resources The key difference between data and managed resources is in their respective lifecycles. Now the expanded resource EvalTree switches on the resource mode, generating a different lifecycle for each mode. For this initial change only managed resources are implemented, using the same implementation as before; data resources are no-ops. The data resource implementation will follow in a subsequent change. --- terraform/transform_resource.go | 48 ++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/terraform/transform_resource.go b/terraform/transform_resource.go index a761bf17f..d252e3ef0 100644 --- a/terraform/transform_resource.go +++ b/terraform/transform_resource.go @@ -195,10 +195,8 @@ func (n *graphNodeExpandedResource) StateDependencies() []string { // GraphNodeEvalable impl. func (n *graphNodeExpandedResource) EvalTree() EvalNode { - var diff *InstanceDiff var provider ResourceProvider var resourceConfig *ResourceConfig - var state *InstanceState // Build the resource. If we aren't part of a multi-resource, then // we still consider ourselves as count index zero. @@ -259,8 +257,34 @@ func (n *graphNodeExpandedResource) EvalTree() EvalNode { info := n.instanceInfo() seq.Nodes = append(seq.Nodes, &EvalInstanceInfo{Info: info}) + // Each resource mode has its own lifecycle + switch n.Resource.Mode { + case config.ManagedResourceMode: + seq.Nodes = append( + seq.Nodes, + n.managedResourceEvalNodes(resource, info, resourceConfig)..., + ) + case config.DataResourceMode: + seq.Nodes = append( + seq.Nodes, + n.dataResourceEvalNodes(resource, info, resourceConfig)..., + ) + default: + panic(fmt.Errorf("unsupported resource mode %s", n.Resource.Mode)) + } + + return seq +} + +func (n *graphNodeExpandedResource) managedResourceEvalNodes(resource *Resource, info *InstanceInfo, resourceConfig *ResourceConfig) []EvalNode { + var diff *InstanceDiff + var provider ResourceProvider + var state *InstanceState + + nodes := make([]EvalNode, 0, 5) + // Refresh the resource - seq.Nodes = append(seq.Nodes, &EvalOpFilter{ + nodes = append(nodes, &EvalOpFilter{ Ops: []walkOperation{walkRefresh}, Node: &EvalSequence{ Nodes: []EvalNode{ @@ -290,7 +314,7 @@ func (n *graphNodeExpandedResource) EvalTree() EvalNode { }) // Diff the resource - seq.Nodes = append(seq.Nodes, &EvalOpFilter{ + nodes = append(nodes, &EvalOpFilter{ Ops: []walkOperation{walkPlan}, Node: &EvalSequence{ Nodes: []EvalNode{ @@ -343,7 +367,7 @@ func (n *graphNodeExpandedResource) EvalTree() EvalNode { }) // Diff the resource for destruction - seq.Nodes = append(seq.Nodes, &EvalOpFilter{ + nodes = append(nodes, &EvalOpFilter{ Ops: []walkOperation{walkPlanDestroy}, Node: &EvalSequence{ Nodes: []EvalNode{ @@ -374,7 +398,7 @@ func (n *graphNodeExpandedResource) EvalTree() EvalNode { var createNew, tainted bool var createBeforeDestroyEnabled bool var wasChangeType DiffChangeType - seq.Nodes = append(seq.Nodes, &EvalOpFilter{ + nodes = append(nodes, &EvalOpFilter{ Ops: []walkOperation{walkApply, walkDestroy}, Node: &EvalSequence{ Nodes: []EvalNode{ @@ -557,7 +581,17 @@ func (n *graphNodeExpandedResource) EvalTree() EvalNode { }, }) - return seq + return nodes +} + +func (n *graphNodeExpandedResource) dataResourceEvalNodes(resource *Resource, info *InstanceInfo, resourceConfig *ResourceConfig) []EvalNode { + //var diff *InstanceDiff + //var provider ResourceProvider + //var state *InstanceState + + nodes := make([]EvalNode, 0, 5) + + return nodes } // instanceInfo is used for EvalTree.