github.com/ttysteale/packer@v0.8.2-0.20150708160520-e5f8ea386ed8/packer/rpc/client.go (about) 1 package rpc 2 3 import ( 4 "github.com/hashicorp/go-msgpack/codec" 5 "github.com/mitchellh/packer/packer" 6 "io" 7 "log" 8 "net/rpc" 9 ) 10 11 // Client is the client end that communicates with a Packer RPC server. 12 // Establishing a connection is up to the user, the Client can just 13 // communicate over any ReadWriteCloser. 14 type Client struct { 15 mux *muxBroker 16 client *rpc.Client 17 closeMux bool 18 } 19 20 func NewClient(rwc io.ReadWriteCloser) (*Client, error) { 21 mux, err := newMuxBrokerClient(rwc) 22 if err != nil { 23 return nil, err 24 } 25 go mux.Run() 26 27 result, err := newClientWithMux(mux, 0) 28 if err != nil { 29 mux.Close() 30 return nil, err 31 } 32 33 result.closeMux = true 34 return result, err 35 } 36 37 func newClientWithMux(mux *muxBroker, streamId uint32) (*Client, error) { 38 clientConn, err := mux.Dial(streamId) 39 if err != nil { 40 return nil, err 41 } 42 43 h := &codec.MsgpackHandle{ 44 RawToString: true, 45 WriteExt: true, 46 } 47 clientCodec := codec.GoRpc.ClientCodec(clientConn, h) 48 49 return &Client{ 50 mux: mux, 51 client: rpc.NewClientWithCodec(clientCodec), 52 closeMux: false, 53 }, nil 54 } 55 56 func (c *Client) Close() error { 57 if err := c.client.Close(); err != nil { 58 return err 59 } 60 61 if c.closeMux { 62 log.Printf("[WARN] Client is closing mux") 63 return c.mux.Close() 64 } 65 66 return nil 67 } 68 69 func (c *Client) Artifact() packer.Artifact { 70 return &artifact{ 71 client: c.client, 72 endpoint: DefaultArtifactEndpoint, 73 } 74 } 75 76 func (c *Client) Build() packer.Build { 77 return &build{ 78 client: c.client, 79 mux: c.mux, 80 } 81 } 82 83 func (c *Client) Builder() packer.Builder { 84 return &builder{ 85 client: c.client, 86 mux: c.mux, 87 } 88 } 89 90 func (c *Client) Cache() packer.Cache { 91 return &cache{ 92 client: c.client, 93 } 94 } 95 96 func (c *Client) Communicator() packer.Communicator { 97 return &communicator{ 98 client: c.client, 99 mux: c.mux, 100 } 101 } 102 103 func (c *Client) Hook() packer.Hook { 104 return &hook{ 105 client: c.client, 106 mux: c.mux, 107 } 108 } 109 110 func (c *Client) PostProcessor() packer.PostProcessor { 111 return &postProcessor{ 112 client: c.client, 113 mux: c.mux, 114 } 115 } 116 117 func (c *Client) Provisioner() packer.Provisioner { 118 return &provisioner{ 119 client: c.client, 120 mux: c.mux, 121 } 122 } 123 124 func (c *Client) Ui() packer.Ui { 125 return &Ui{ 126 client: c.client, 127 endpoint: DefaultUiEndpoint, 128 } 129 }