packer-cn/packer/rpc/client.go

137 lines
2.3 KiB
Go
Raw Normal View History

package rpc
import (
2014-10-17 18:38:17 -07:00
"github.com/hashicorp/go-msgpack/codec"
2014-10-28 08:35:21 -07:00
"github.com/mitchellh/packer/packer"
"io"
2013-12-11 16:33:43 -08:00
"log"
"net/rpc"
)
// 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 14:23:06 -07:00
mux *muxBroker
2013-12-11 16:33:43 -08:00
client *rpc.Client
closeMux bool
}
func NewClient(rwc io.ReadWriteCloser) (*Client, error) {
2014-09-02 14:23:06 -07:00
mux, err := newMuxBrokerClient(rwc)
2013-12-11 16:33:43 -08:00
if err != nil {
return nil, err
}
2014-09-02 14:23:06 -07:00
go mux.Run()
result, err := newClientWithMux(mux, 0)
if err != nil {
mux.Close()
return nil, err
}
2013-12-11 16:33:43 -08:00
result.closeMux = true
return result, err
2013-12-09 19:07:36 -08:00
}
2014-09-02 14:23:06 -07:00
func newClientWithMux(mux *muxBroker, streamId uint32) (*Client, error) {
2013-12-09 19:07:36 -08:00
clientConn, err := mux.Dial(streamId)
if err != nil {
return nil, err
}
h := &codec.MsgpackHandle{
RawToString: true,
WriteExt: true,
}
clientCodec := codec.GoRpc.ClientCodec(clientConn, h)
2014-04-26 13:31:22 -07:00
return &Client{
2013-12-11 16:33:43 -08:00
mux: mux,
2014-04-26 13:31:22 -07:00
client: rpc.NewClientWithCodec(clientCodec),
2013-12-11 16:33:43 -08:00
closeMux: false,
}, nil
}
2013-12-09 14:51:13 -08:00
func (c *Client) Close() error {
if err := c.client.Close(); err != nil {
return err
}
2013-12-11 16:33:43 -08:00
if c.closeMux {
log.Printf("[WARN] Client is closing mux")
return c.mux.Close()
}
2013-12-09 19:07:36 -08:00
return nil
2013-12-09 14:51:13 -08:00
}
func (c *Client) Artifact() packer.Artifact {
return &artifact{
client: c.client,
endpoint: DefaultArtifactEndpoint,
}
}
2013-12-09 14:51:13 -08:00
2013-12-10 13:18:48 -08:00
func (c *Client) Build() packer.Build {
return &build{
client: c.client,
mux: c.mux,
}
}
2013-12-10 12:14:08 -08:00
func (c *Client) Builder() packer.Builder {
return &builder{
client: c.client,
mux: c.mux,
}
}
2013-12-09 14:51:13 -08:00
func (c *Client) Cache() packer.Cache {
return &cache{
client: c.client,
}
}
2013-12-09 14:57:18 -08:00
2013-12-10 11:43:02 -08:00
func (c *Client) Communicator() packer.Communicator {
return &communicator{
client: c.client,
mux: c.mux,
}
}
2013-12-10 12:23:42 -08:00
func (c *Client) Environment() packer.Environment {
return &Environment{
client: c.client,
mux: c.mux,
}
}
2013-12-10 11:50:30 -08:00
func (c *Client) Hook() packer.Hook {
return &hook{
client: c.client,
mux: c.mux,
}
}
2013-12-09 14:57:18 -08:00
func (c *Client) PostProcessor() packer.PostProcessor {
return &postProcessor{
client: c.client,
2013-12-09 19:07:36 -08:00
mux: c.mux,
2013-12-09 16:22:11 -08:00
}
}
2013-12-10 11:56:15 -08:00
func (c *Client) Provisioner() packer.Provisioner {
return &provisioner{
client: c.client,
mux: c.mux,
}
}
2013-12-09 16:22:11 -08:00
func (c *Client) Ui() packer.Ui {
return &Ui{
2013-12-09 19:07:36 -08:00
client: c.client,
2013-12-09 16:22:11 -08:00
endpoint: DefaultUiEndpoint,
2013-12-09 14:57:18 -08:00
}
}