github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/terraform/graph_builder_refresh.go (about) 1 package terraform 2 3 import ( 4 "github.com/hashicorp/terraform/config" 5 "github.com/hashicorp/terraform/config/module" 6 "github.com/hashicorp/terraform/dag" 7 ) 8 9 // RefreshGraphBuilder implements GraphBuilder and is responsible for building 10 // a graph for refreshing (updating the Terraform state). 11 // 12 // The primary difference between this graph and others: 13 // 14 // * Based on the state since it represents the only resources that 15 // need to be refreshed. 16 // 17 // * Ignores lifecycle options since no lifecycle events occur here. This 18 // simplifies the graph significantly since complex transforms such as 19 // create-before-destroy can be completely ignored. 20 // 21 type RefreshGraphBuilder struct { 22 // Module is the root module for the graph to build. 23 Module *module.Tree 24 25 // State is the current state 26 State *State 27 28 // Providers is the list of providers supported. 29 Providers []string 30 31 // Targets are resources to target 32 Targets []string 33 34 // DisableReduce, if true, will not reduce the graph. Great for testing. 35 DisableReduce bool 36 37 // Validate will do structural validation of the graph. 38 Validate bool 39 } 40 41 // See GraphBuilder 42 func (b *RefreshGraphBuilder) Build(path []string) (*Graph, error) { 43 return (&BasicGraphBuilder{ 44 Steps: b.Steps(), 45 Validate: b.Validate, 46 Name: "RefreshGraphBuilder", 47 }).Build(path) 48 } 49 50 // See GraphBuilder 51 func (b *RefreshGraphBuilder) Steps() []GraphTransformer { 52 // Custom factory for creating providers. 53 concreteProvider := func(a *NodeAbstractProvider) dag.Vertex { 54 return &NodeApplyableProvider{ 55 NodeAbstractProvider: a, 56 } 57 } 58 59 concreteResource := func(a *NodeAbstractResource) dag.Vertex { 60 return &NodeRefreshableResource{ 61 NodeAbstractResource: a, 62 } 63 } 64 65 concreteDataResource := func(a *NodeAbstractResource) dag.Vertex { 66 return &NodeRefreshableDataResource{ 67 NodeAbstractCountResource: &NodeAbstractCountResource{ 68 NodeAbstractResource: a, 69 }, 70 } 71 } 72 73 steps := []GraphTransformer{ 74 // Creates all the resources represented in the state 75 &StateTransformer{ 76 Concrete: concreteResource, 77 State: b.State, 78 }, 79 80 // Creates all the data resources that aren't in the state 81 &ConfigTransformer{ 82 Concrete: concreteDataResource, 83 Module: b.Module, 84 Unique: true, 85 ModeFilter: true, 86 Mode: config.DataResourceMode, 87 }, 88 89 // Attach the state 90 &AttachStateTransformer{State: b.State}, 91 92 // Attach the configuration to any resources 93 &AttachResourceConfigTransformer{Module: b.Module}, 94 95 // Add root variables 96 &RootVariableTransformer{Module: b.Module}, 97 98 // Create all the providers 99 &MissingProviderTransformer{Providers: b.Providers, Concrete: concreteProvider}, 100 &ProviderTransformer{}, 101 &DisableProviderTransformer{}, 102 &ParentProviderTransformer{}, 103 &AttachProviderConfigTransformer{Module: b.Module}, 104 105 // Add the outputs 106 &OutputTransformer{Module: b.Module}, 107 108 // Add module variables 109 &ModuleVariableTransformer{Module: b.Module}, 110 111 // Connect so that the references are ready for targeting. We'll 112 // have to connect again later for providers and so on. 113 &ReferenceTransformer{}, 114 115 // Target 116 &TargetsTransformer{Targets: b.Targets}, 117 118 // Single root 119 &RootTransformer{}, 120 } 121 122 if !b.DisableReduce { 123 // Perform the transitive reduction to make our graph a bit 124 // more sane if possible (it usually is possible). 125 steps = append(steps, &TransitiveReductionTransformer{}) 126 } 127 128 return steps 129 }