diff --git a/builtin/bins/provisioner-local-exec/main.go b/builtin/bins/provisioner-local-exec/main.go index 87a70c6ce..2e0433ff5 100644 --- a/builtin/bins/provisioner-local-exec/main.go +++ b/builtin/bins/provisioner-local-exec/main.go @@ -3,13 +3,10 @@ package main import ( "github.com/hashicorp/terraform/builtin/provisioners/local-exec" "github.com/hashicorp/terraform/plugin" - "github.com/hashicorp/terraform/terraform" ) func main() { plugin.Serve(&plugin.ServeOpts{ - ProvisionerFunc: func() terraform.ResourceProvisioner { - return new(localexec.ResourceProvisioner) - }, + ProvisionerFunc: localexec.Provisioner, }) } diff --git a/builtin/provisioners/local-exec/resource_provisioner.go b/builtin/provisioners/local-exec/resource_provisioner.go index 88e5e0045..cfd687010 100644 --- a/builtin/provisioners/local-exec/resource_provisioner.go +++ b/builtin/provisioners/local-exec/resource_provisioner.go @@ -1,13 +1,14 @@ package localexec import ( + "context" "fmt" "io" "os/exec" "runtime" "github.com/armon/circbuf" - "github.com/hashicorp/terraform/helper/config" + "github.com/hashicorp/terraform/helper/schema" "github.com/hashicorp/terraform/terraform" "github.com/mitchellh/go-linereader" ) @@ -19,21 +20,26 @@ const ( maxBufSize = 8 * 1024 ) -type ResourceProvisioner struct{} +func Provisioner() terraform.ResourceProvisioner { + return &schema.Provisioner{ + Schema: map[string]*schema.Schema{ + "command": &schema.Schema{ + Type: schema.TypeString, + Required: true, + }, + }, -func (p *ResourceProvisioner) Apply( - o terraform.UIOutput, - s *terraform.InstanceState, - c *terraform.ResourceConfig) error { - - // Get the command - commandRaw, ok := c.Config["command"] - if !ok { - return fmt.Errorf("local-exec provisioner missing 'command'") + ApplyFunc: applyFn, } - command, ok := commandRaw.(string) - if !ok { - return fmt.Errorf("local-exec provisioner command must be a string") +} + +func applyFn(ctx context.Context) error { + data := ctx.Value(schema.ProvConfigDataKey).(*schema.ResourceData) + o := ctx.Value(schema.ProvOutputKey).(terraform.UIOutput) + + command := data.Get("command").(string) + if command == "" { + return fmt.Errorf("local-exec provisioner command must be a non-empty string") } // Execute the command using a shell @@ -49,7 +55,7 @@ func (p *ResourceProvisioner) Apply( // Setup the reader that will read the lines from the command pr, pw := io.Pipe() copyDoneCh := make(chan struct{}) - go p.copyOutput(o, pr, copyDoneCh) + go copyOutput(o, pr, copyDoneCh) // Setup the command cmd := exec.Command(shell, flag, command) @@ -78,15 +84,7 @@ func (p *ResourceProvisioner) Apply( return nil } -func (p *ResourceProvisioner) Validate(c *terraform.ResourceConfig) ([]string, []error) { - validator := config.Validator{ - Required: []string{"command"}, - } - return validator.Validate(c) -} - -func (p *ResourceProvisioner) copyOutput( - o terraform.UIOutput, r io.Reader, doneCh chan<- struct{}) { +func copyOutput(o terraform.UIOutput, r io.Reader, doneCh chan<- struct{}) { defer close(doneCh) lr := linereader.New(r) for line := range lr.Ch { diff --git a/builtin/provisioners/local-exec/resource_provisioner_test.go b/builtin/provisioners/local-exec/resource_provisioner_test.go index 9158c333e..6d04967ad 100644 --- a/builtin/provisioners/local-exec/resource_provisioner_test.go +++ b/builtin/provisioners/local-exec/resource_provisioner_test.go @@ -10,10 +10,6 @@ import ( "github.com/hashicorp/terraform/terraform" ) -func TestResourceProvisioner_impl(t *testing.T) { - var _ terraform.ResourceProvisioner = new(ResourceProvisioner) -} - func TestResourceProvider_Apply(t *testing.T) { defer os.Remove("test_out") c := testConfig(t, map[string]interface{}{ @@ -21,7 +17,7 @@ func TestResourceProvider_Apply(t *testing.T) { }) output := new(terraform.MockUIOutput) - p := new(ResourceProvisioner) + p := Provisioner() if err := p.Apply(output, nil, c); err != nil { t.Fatalf("err: %v", err) } @@ -43,7 +39,7 @@ func TestResourceProvider_Validate_good(t *testing.T) { c := testConfig(t, map[string]interface{}{ "command": "echo foo", }) - p := new(ResourceProvisioner) + p := Provisioner() warn, errs := p.Validate(c) if len(warn) > 0 { t.Fatalf("Warnings: %v", warn) @@ -55,7 +51,7 @@ func TestResourceProvider_Validate_good(t *testing.T) { func TestResourceProvider_Validate_missing(t *testing.T) { c := testConfig(t, map[string]interface{}{}) - p := new(ResourceProvisioner) + p := Provisioner() warn, errs := p.Validate(c) if len(warn) > 0 { t.Fatalf("Warnings: %v", warn)