github.com/pbthorste/terraform@v0.8.6-0.20170127005045-deb56bd93da2/backend/backend.go (about)

     1  // Package backend provides interfaces that the CLI uses to interact with
     2  // Terraform. A backend provides the abstraction that allows the same CLI
     3  // to simultaneously support both local and remote operations for seamlessly
     4  // using Terraform in a team environment.
     5  package backend
     6  
     7  import (
     8  	"context"
     9  
    10  	"github.com/hashicorp/terraform/config/module"
    11  	"github.com/hashicorp/terraform/state"
    12  	"github.com/hashicorp/terraform/terraform"
    13  )
    14  
    15  // Backend is the minimal interface that must be implemented to enable Terraform.
    16  type Backend interface {
    17  	// Ask for input and configure the backend. Similar to
    18  	// terraform.ResourceProvider.
    19  	Input(terraform.UIInput, *terraform.ResourceConfig) (*terraform.ResourceConfig, error)
    20  	Validate(*terraform.ResourceConfig) ([]string, []error)
    21  	Configure(*terraform.ResourceConfig) error
    22  
    23  	// State returns the current state for this environment. This state may
    24  	// not be loaded locally: the proper APIs should be called on state.State
    25  	// to load the state.
    26  	State() (state.State, error)
    27  }
    28  
    29  // Enhanced implements additional behavior on top of a normal backend.
    30  //
    31  // Enhanced backends allow customizing the behavior of Terraform operations.
    32  // This allows Terraform to potentially run operations remotely, load
    33  // configurations from external sources, etc.
    34  type Enhanced interface {
    35  	Backend
    36  
    37  	// Operation performs a Terraform operation such as refresh, plan, apply.
    38  	// It is up to the implementation to determine what "performing" means.
    39  	// This DOES NOT BLOCK. The context returned as part of RunningOperation
    40  	// should be used to block for completion.
    41  	Operation(context.Context, *Operation) (*RunningOperation, error)
    42  }
    43  
    44  // Local implements additional behavior on a Backend that allows local
    45  // operations in addition to remote operations.
    46  //
    47  // This enables more behaviors of Terraform that require more data such
    48  // as `console`, `import`, `graph`. These require direct access to
    49  // configurations, variables, and more. Not all backends may support this
    50  // so we separate it out into its own optional interface.
    51  type Local interface {
    52  	// Context returns a runnable terraform Context. The operation parameter
    53  	// doesn't need a Type set but it needs other options set such as Module.
    54  	Context(*Operation) (*terraform.Context, state.State, error)
    55  }
    56  
    57  // An operation represents an operation for Terraform to execute.
    58  //
    59  // Note that not all fields are supported by all backends and can result
    60  // in an error if set. All backend implementations should show user-friendly
    61  // errors explaining any incorrectly set values. For example, the local
    62  // backend doesn't support a PlanId being set.
    63  //
    64  // The operation options are purposely designed to have maximal compatibility
    65  // between Terraform and Terraform Servers (a commercial product offered by
    66  // HashiCorp). Therefore, it isn't expected that other implementation support
    67  // every possible option. The struct here is generalized in order to allow
    68  // even partial implementations to exist in the open, without walling off
    69  // remote functionality 100% behind a commercial wall. Anyone can implement
    70  // against this interface and have Terraform interact with it just as it
    71  // would with HashiCorp-provided Terraform Servers.
    72  type Operation struct {
    73  	// Type is the operation to perform.
    74  	Type OperationType
    75  
    76  	// PlanId is an opaque value that backends can use to execute a specific
    77  	// plan for an apply operation.
    78  	//
    79  	// PlanOutBackend is the backend to store with the plan. This is the
    80  	// backend that will be used when applying the plan.
    81  	PlanId         string
    82  	PlanRefresh    bool   // PlanRefresh will do a refresh before a plan
    83  	PlanOutPath    string // PlanOutPath is the path to save the plan
    84  	PlanOutBackend *terraform.BackendState
    85  
    86  	// Module settings specify the root module to use for operations.
    87  	Module *module.Tree
    88  
    89  	// Plan is a plan that was passed as an argument. This is valid for
    90  	// plan and apply arguments but may not work for all backends.
    91  	Plan *terraform.Plan
    92  
    93  	// The options below are more self-explanatory and affect the runtime
    94  	// behavior of the operation.
    95  	Destroy   bool
    96  	Targets   []string
    97  	Variables map[string]interface{}
    98  
    99  	// Input/output/control options.
   100  	UIIn  terraform.UIInput
   101  	UIOut terraform.UIOutput
   102  }
   103  
   104  // RunningOperation is the result of starting an operation.
   105  type RunningOperation struct {
   106  	// Context should be used to track Done and Err for errors.
   107  	//
   108  	// For implementers of a backend, this context should not wrap the
   109  	// passed in context. Otherwise, canceling the parent context will
   110  	// immediately mark this context as "done" but those aren't the semantics
   111  	// we want: we want this context to be done only when the operation itself
   112  	// is fully done.
   113  	context.Context
   114  
   115  	// Err is the error of the operation. This is populated after
   116  	// the operation has completed.
   117  	Err error
   118  
   119  	// PlanEmpty is populated after a Plan operation completes without error
   120  	// to note whether a plan is empty or has changes.
   121  	PlanEmpty bool
   122  
   123  	// State is the final state after the operation completed. Persisting
   124  	// this state is managed by the backend. This should only be read
   125  	// after the operation completes to avoid read/write races.
   126  	State *terraform.State
   127  }