diff --git a/config.go b/config.go index 528f0b07a..9acd1347b 100644 --- a/config.go +++ b/config.go @@ -40,9 +40,10 @@ type config struct { PluginMinPort uint PluginMaxPort uint - Builders map[string]string - Commands map[string]string - Provisioners map[string]string + Builders map[string]string + Commands map[string]string + PostProcessors map[string]string `json:"post-processors"` + Provisioners map[string]string } // Decodes configuration in JSON format from the given io.Reader into @@ -94,6 +95,19 @@ func (c *config) LoadHook(name string) (packer.Hook, error) { return c.pluginClient(name).Hook() } +// This is a proper packer.PostProcessorFunc that can be used to load +// packer.PostProcessor implementations from defined plugins. +func (c *config) LoadPostProcessor(name string) (packer.PostProcessor, error) { + log.Printf("Loading post-processor: %s", name) + bin, ok := c.PostProcessors[name] + if !ok { + log.Printf("Post-processor not found: %s", name) + return nil, nil + } + + return c.pluginClient(bin).PostProcessor() +} + // This is a proper packer.ProvisionerFunc that can be used to load // packer.Provisioner implementations from defined plugins. func (c *config) LoadProvisioner(name string) (packer.Provisioner, error) { diff --git a/packer.go b/packer.go index c9d9a9015..43edc77d0 100644 --- a/packer.go +++ b/packer.go @@ -53,6 +53,7 @@ func main() { envConfig.Components.Builder = config.LoadBuilder envConfig.Components.Command = config.LoadCommand envConfig.Components.Hook = config.LoadHook + envConfig.Components.PostProcessor = config.LoadPostProcessor envConfig.Components.Provisioner = config.LoadProvisioner env, err := packer.NewEnvironment(envConfig) diff --git a/packer/plugin/client.go b/packer/plugin/client.go index d6ee966db..a7e698b91 100644 --- a/packer/plugin/client.go +++ b/packer/plugin/client.go @@ -140,6 +140,18 @@ func (c *Client) Hook() (packer.Hook, error) { return &cmdHook{packrpc.Hook(client), c}, nil } +// Returns a post-processor implementation that is communicating over +// this client. If the client hasn't been started, this will start it. +func (c *Client) PostProcessor() (packer.PostProcessor, error) { + _, err := c.rpcClient() + if err != nil { + return nil, err + } + + // TODO + return nil, nil +} + // Returns a provisioner implementation that is communicating over this // client. If the client hasn't been started, this will start it. func (c *Client) Provisioner() (packer.Provisioner, error) {