From 52c0032aedf1c3355ffbec1e566a2b0539ae019e Mon Sep 17 00:00:00 2001 From: James Bardin Date: Mon, 8 Oct 2018 12:25:16 -0400 Subject: [PATCH] update provisioners for multiple processes The "internal" provisioners are still run in a separate process, and need to be updated to restart on each walk. --- command/plugins.go | 13 ++++++------- helper/plugin/grpc_provisioner.go | 1 + plugin/grpc_provisioner.go | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/command/plugins.go b/command/plugins.go index 2c5b5cba7..bc0a02933 100644 --- a/command/plugins.go +++ b/command/plugins.go @@ -326,12 +326,7 @@ func (m *Meta) provisionerFactories() map[string]terraform.ProvisionerFactory { // Wire up the internal provisioners first. These might be overridden // by discovered provisioners below. for name := range InternalProvisioners { - client, err := internalPluginClient("provisioner", name) - if err != nil { - log.Printf("[WARN] failed to build command line for internal plugin %q: %s", name, err) - continue - } - factories[name] = internalProvisionerFactory(client) + factories[name] = internalProvisionerFactory(discovery.PluginMeta{Name: name}) } byName := plugins.ByName() @@ -397,8 +392,12 @@ func provisionerFactory(meta discovery.PluginMeta) terraform.ProvisionerFactory } } -func internalProvisionerFactory(client *plugin.Client) terraform.ProvisionerFactory { +func internalProvisionerFactory(meta discovery.PluginMeta) terraform.ProvisionerFactory { return func() (provisioners.Interface, error) { + client, err := internalPluginClient("provisioner", meta.Name) + if err != nil { + return nil, fmt.Errorf("[WARN] failed to build command line for internal plugin %q: %s", meta.Name, err) + } return newProvisionerClient(client) } } diff --git a/helper/plugin/grpc_provisioner.go b/helper/plugin/grpc_provisioner.go index ec0f130e4..e06fb6fd6 100644 --- a/helper/plugin/grpc_provisioner.go +++ b/helper/plugin/grpc_provisioner.go @@ -124,6 +124,7 @@ func (s *GRPCProvisionerServer) ProvisionResource(req *proto.ProvisionResource_R Ephemeral: terraform.EphemeralState{ ConnInfo: conn, }, + Meta: make(map[string]interface{}), } err = s.provisioner.Apply(uiOutput{srv}, instanceState, resourceConfig) diff --git a/plugin/grpc_provisioner.go b/plugin/grpc_provisioner.go index 712079286..7b85fbb43 100644 --- a/plugin/grpc_provisioner.go +++ b/plugin/grpc_provisioner.go @@ -64,6 +64,7 @@ func (p *GRPCProvisioner) GetSchema() (resp provisioners.GetSchemaResponse) { resp.Diagnostics = resp.Diagnostics.Append(err) return resp } + resp.Diagnostics = resp.Diagnostics.Append(convert.ProtoToDiagnostics(protoResp.Diagnostics)) if protoResp.Provisioner == nil { resp.Diagnostics = resp.Diagnostics.Append(errors.New("missing provisioner schema"))