2013-12-09 17:24:55 -05:00
|
|
|
package rpc
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io"
|
2013-12-11 19:33:43 -05:00
|
|
|
"log"
|
2013-12-09 17:24:55 -05:00
|
|
|
"net/rpc"
|
2015-10-12 16:50:24 -04:00
|
|
|
|
2017-04-04 16:39:01 -04:00
|
|
|
"github.com/hashicorp/packer/packer"
|
2015-10-12 16:50:24 -04:00
|
|
|
"github.com/ugorji/go/codec"
|
2013-12-09 17:24:55 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
// Client is the client end that communicates with a Packer RPC server.
|
|
|
|
// Establishing a connection is up to the user, the Client can just
|
|
|
|
// communicate over any ReadWriteCloser.
|
|
|
|
type Client struct {
|
2014-09-02 17:23:06 -04:00
|
|
|
mux *muxBroker
|
2013-12-11 19:33:43 -05:00
|
|
|
client *rpc.Client
|
|
|
|
closeMux bool
|
2013-12-09 17:24:55 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func NewClient(rwc io.ReadWriteCloser) (*Client, error) {
|
2014-09-02 17:23:06 -04:00
|
|
|
mux, err := newMuxBrokerClient(rwc)
|
2013-12-11 19:33:43 -05:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2014-09-02 17:23:06 -04:00
|
|
|
go mux.Run()
|
|
|
|
|
|
|
|
result, err := newClientWithMux(mux, 0)
|
|
|
|
if err != nil {
|
|
|
|
mux.Close()
|
|
|
|
return nil, err
|
|
|
|
}
|
2013-12-11 19:33:43 -05:00
|
|
|
|
|
|
|
result.closeMux = true
|
|
|
|
return result, err
|
2013-12-09 22:07:36 -05:00
|
|
|
}
|
|
|
|
|
2014-09-02 17:23:06 -04:00
|
|
|
func newClientWithMux(mux *muxBroker, streamId uint32) (*Client, error) {
|
2013-12-09 22:07:36 -05:00
|
|
|
clientConn, err := mux.Dial(streamId)
|
2013-12-09 17:24:55 -05:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2014-05-11 09:36:16 -04:00
|
|
|
h := &codec.MsgpackHandle{
|
|
|
|
RawToString: true,
|
|
|
|
WriteExt: true,
|
|
|
|
}
|
|
|
|
clientCodec := codec.GoRpc.ClientCodec(clientConn, h)
|
2014-04-26 16:31:22 -04:00
|
|
|
|
2013-12-09 17:24:55 -05:00
|
|
|
return &Client{
|
2013-12-11 19:33:43 -05:00
|
|
|
mux: mux,
|
2014-04-26 16:31:22 -04:00
|
|
|
client: rpc.NewClientWithCodec(clientCodec),
|
2013-12-11 19:33:43 -05:00
|
|
|
closeMux: false,
|
2013-12-09 17:24:55 -05:00
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
2013-12-09 17:51:13 -05:00
|
|
|
func (c *Client) Close() error {
|
|
|
|
if err := c.client.Close(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2013-12-11 19:33:43 -05:00
|
|
|
if c.closeMux {
|
|
|
|
log.Printf("[WARN] Client is closing mux")
|
|
|
|
return c.mux.Close()
|
|
|
|
}
|
|
|
|
|
2013-12-09 22:07:36 -05:00
|
|
|
return nil
|
2013-12-09 17:51:13 -05:00
|
|
|
}
|
|
|
|
|
2013-12-09 17:24:55 -05:00
|
|
|
func (c *Client) Artifact() packer.Artifact {
|
|
|
|
return &artifact{
|
2019-12-17 05:25:56 -05:00
|
|
|
commonClient: commonClient{
|
|
|
|
endpoint: DefaultArtifactEndpoint,
|
|
|
|
client: c.client,
|
|
|
|
},
|
2013-12-09 17:24:55 -05:00
|
|
|
}
|
|
|
|
}
|
2013-12-09 17:51:13 -05:00
|
|
|
|
2013-12-10 16:18:48 -05:00
|
|
|
func (c *Client) Build() packer.Build {
|
|
|
|
return &build{
|
2019-12-17 05:25:56 -05:00
|
|
|
commonClient: commonClient{
|
|
|
|
endpoint: DefaultBuildEndpoint,
|
|
|
|
client: c.client,
|
|
|
|
mux: c.mux,
|
|
|
|
},
|
2013-12-10 16:18:48 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-12-10 15:14:08 -05:00
|
|
|
func (c *Client) Builder() packer.Builder {
|
|
|
|
return &builder{
|
2019-12-17 05:25:56 -05:00
|
|
|
commonClient: commonClient{
|
|
|
|
endpoint: DefaultBuilderEndpoint,
|
|
|
|
client: c.client,
|
|
|
|
mux: c.mux,
|
|
|
|
},
|
2013-12-10 15:14:08 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-12-10 14:43:02 -05:00
|
|
|
func (c *Client) Communicator() packer.Communicator {
|
|
|
|
return &communicator{
|
2019-12-17 05:25:56 -05:00
|
|
|
commonClient: commonClient{
|
|
|
|
endpoint: DefaultCommunicatorEndpoint,
|
|
|
|
client: c.client,
|
|
|
|
mux: c.mux,
|
|
|
|
},
|
2013-12-10 14:43:02 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-12-10 14:50:30 -05:00
|
|
|
func (c *Client) Hook() packer.Hook {
|
|
|
|
return &hook{
|
2019-12-17 05:25:56 -05:00
|
|
|
commonClient: commonClient{
|
|
|
|
endpoint: DefaultHookEndpoint,
|
|
|
|
client: c.client,
|
|
|
|
mux: c.mux,
|
|
|
|
},
|
2013-12-10 14:50:30 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-12-09 17:57:18 -05:00
|
|
|
func (c *Client) PostProcessor() packer.PostProcessor {
|
|
|
|
return &postProcessor{
|
2019-12-17 05:25:56 -05:00
|
|
|
commonClient: commonClient{
|
|
|
|
endpoint: DefaultPostProcessorEndpoint,
|
|
|
|
client: c.client,
|
|
|
|
mux: c.mux,
|
|
|
|
},
|
2013-12-09 19:22:11 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-12-10 14:56:15 -05:00
|
|
|
func (c *Client) Provisioner() packer.Provisioner {
|
|
|
|
return &provisioner{
|
2019-12-17 05:25:56 -05:00
|
|
|
commonClient: commonClient{
|
|
|
|
endpoint: DefaultProvisionerEndpoint,
|
|
|
|
client: c.client,
|
|
|
|
mux: c.mux,
|
|
|
|
},
|
2013-12-10 14:56:15 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-12-09 19:22:11 -05:00
|
|
|
func (c *Client) Ui() packer.Ui {
|
|
|
|
return &Ui{
|
2019-12-17 05:25:56 -05:00
|
|
|
commonClient: commonClient{
|
|
|
|
endpoint: DefaultUiEndpoint,
|
|
|
|
client: c.client,
|
|
|
|
},
|
2013-12-09 19:22:11 -05:00
|
|
|
endpoint: DefaultUiEndpoint,
|
2013-12-09 17:57:18 -05:00
|
|
|
}
|
|
|
|
}
|