1package terraform
2
3import (
4	"bytes"
5	"encoding/gob"
6	"fmt"
7	"io"
8
9	"github.com/hashicorp/terraform-plugin-sdk/internal/configs"
10	"github.com/zclconf/go-cty/cty"
11)
12
13func init() {
14	gob.Register(make([]interface{}, 0))
15	gob.Register(make([]map[string]interface{}, 0))
16	gob.Register(make(map[string]interface{}))
17	gob.Register(make(map[string]string))
18}
19
20// Plan represents a single Terraform execution plan, which contains
21// all the information necessary to make an infrastructure change.
22//
23// A plan has to contain basically the entire state of the world
24// necessary to make a change: the state, diff, config, backend config, etc.
25// This is so that it can run alone without any other data.
26type Plan struct {
27	// Diff describes the resource actions that must be taken when this
28	// plan is applied.
29	Diff *Diff
30
31	// Config represents the entire configuration that was present when this
32	// plan was created.
33	Config *configs.Config
34
35	// State is the Terraform state that was current when this plan was
36	// created.
37	//
38	// It is not allowed to apply a plan that has a stale state, since its
39	// diff could be outdated.
40	State *State
41
42	// Vars retains the variables that were set when creating the plan, so
43	// that the same variables can be applied during apply.
44	Vars map[string]cty.Value
45
46	// Targets, if non-empty, contains a set of resource address strings that
47	// identify graph nodes that were selected as targets for plan.
48	//
49	// When targets are set, any graph node that is not directly targeted or
50	// indirectly targeted via dependencies is excluded from the graph.
51	Targets []string
52
53	// TerraformVersion is the version of Terraform that was used to create
54	// this plan.
55	//
56	// It is not allowed to apply a plan created with a different version of
57	// Terraform, since the other fields of this structure may be interpreted
58	// in different ways between versions.
59	TerraformVersion string
60
61	// ProviderSHA256s is a map giving the SHA256 hashes of the exact binaries
62	// used as plugins for each provider during plan.
63	//
64	// These must match between plan and apply to ensure that the diff is
65	// correctly interpreted, since different provider versions may have
66	// different attributes or attribute value constraints.
67	ProviderSHA256s map[string][]byte
68
69	// Backend is the backend that this plan should use and store data with.
70	Backend *BackendState
71
72	// Destroy indicates that this plan was created for a full destroy operation
73	Destroy bool
74}
75
76func (p *Plan) String() string {
77	buf := new(bytes.Buffer)
78	buf.WriteString("DIFF:\n\n")
79	buf.WriteString(p.Diff.String())
80	buf.WriteString("\n\nSTATE:\n\n")
81	buf.WriteString(p.State.String())
82	return buf.String()
83}
84
85// ReadPlan reads a plan structure out of a reader in the format that
86// was written by WritePlan.
87func ReadPlan(src io.Reader) (*Plan, error) {
88	return nil, fmt.Errorf("terraform.ReadPlan is no longer in use; use planfile.Open instead")
89}
90
91// WritePlan writes a plan somewhere in a binary format.
92func WritePlan(d *Plan, dst io.Writer) error {
93	return fmt.Errorf("terraform.WritePlan is no longer in use; use planfile.Create instead")
94}
95