github.com/Hashicorp/terraform@v0.11.12-beta1/backend/remote-state/backend.go (about) 1 // Package remotestate implements a Backend for remote state implementations 2 // from the state/remote package that also implement a backend schema for 3 // configuration. 4 package remotestate 5 6 import ( 7 "context" 8 9 "github.com/hashicorp/terraform/backend" 10 "github.com/hashicorp/terraform/helper/schema" 11 "github.com/hashicorp/terraform/state" 12 "github.com/hashicorp/terraform/state/remote" 13 "github.com/hashicorp/terraform/terraform" 14 ) 15 16 // Backend implements backend.Backend for remote state backends. 17 // 18 // All exported fields should be set. This struct should only be used 19 // by implementers of backends, not by consumers. If you're consuming, please 20 // use a higher level package such as Consul backends. 21 type Backend struct { 22 // Backend should be set to the configuration schema. ConfigureFunc 23 // should not be set on the schema. 24 *schema.Backend 25 26 // ConfigureFunc takes the ctx from a schema.Backend and returns a 27 // fully configured remote client to use for state operations. 28 ConfigureFunc func(ctx context.Context) (remote.Client, error) 29 30 client remote.Client 31 } 32 33 func (b *Backend) Configure(rc *terraform.ResourceConfig) error { 34 // Set our configureFunc manually 35 b.Backend.ConfigureFunc = func(ctx context.Context) error { 36 c, err := b.ConfigureFunc(ctx) 37 if err != nil { 38 return err 39 } 40 41 // Set the client for later 42 b.client = c 43 return nil 44 } 45 46 // Run the normal configuration 47 return b.Backend.Configure(rc) 48 } 49 50 func (b *Backend) States() ([]string, error) { 51 return nil, backend.ErrNamedStatesNotSupported 52 } 53 54 func (b *Backend) DeleteState(name string) error { 55 return backend.ErrNamedStatesNotSupported 56 } 57 58 func (b *Backend) State(name string) (state.State, error) { 59 // This shouldn't happen 60 if b.client == nil { 61 panic("nil remote client") 62 } 63 64 if name != backend.DefaultStateName { 65 return nil, backend.ErrNamedStatesNotSupported 66 } 67 68 s := &remote.State{Client: b.client} 69 return s, nil 70 }