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  }