58 lines
1.5 KiB
Go
58 lines
1.5 KiB
Go
|
// Package remotestate implements a Backend for remote state implementations
|
||
|
// from the state/remote package that also implement a backend schema for
|
||
|
// configuration.
|
||
|
package remotestate
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
"github.com/hashicorp/terraform/helper/schema"
|
||
|
"github.com/hashicorp/terraform/state"
|
||
|
"github.com/hashicorp/terraform/state/remote"
|
||
|
"github.com/hashicorp/terraform/terraform"
|
||
|
)
|
||
|
|
||
|
// Backend implements backend.Backend for remote state backends.
|
||
|
//
|
||
|
// All exported fields should be set. This struct should only be used
|
||
|
// by implementers of backends, not by consumers. If you're consuming, please
|
||
|
// use a higher level package such as Consul backends.
|
||
|
type Backend struct {
|
||
|
// Backend should be set to the configuration schema. ConfigureFunc
|
||
|
// should not be set on the schema.
|
||
|
*schema.Backend
|
||
|
|
||
|
// ConfigureFunc takes the ctx from a schema.Backend and returns a
|
||
|
// fully configured remote client to use for state operations.
|
||
|
ConfigureFunc func(ctx context.Context) (remote.Client, error)
|
||
|
|
||
|
client remote.Client
|
||
|
}
|
||
|
|
||
|
func (b *Backend) Configure(rc *terraform.ResourceConfig) error {
|
||
|
// Set our configureFunc manually
|
||
|
b.Backend.ConfigureFunc = func(ctx context.Context) error {
|
||
|
c, err := b.ConfigureFunc(ctx)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// Set the client for later
|
||
|
b.client = c
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Run the normal configuration
|
||
|
return b.Backend.Configure(rc)
|
||
|
}
|
||
|
|
||
|
func (b *Backend) State() (state.State, error) {
|
||
|
// This shouldn't happen
|
||
|
if b.client == nil {
|
||
|
panic("nil remote client")
|
||
|
}
|
||
|
|
||
|
s := &remote.State{Client: b.client}
|
||
|
return s, nil
|
||
|
}
|