github.com/phobos182/packer@v0.2.3-0.20130819023704-c84d2aeffc68/packer/rpc/provisioner.go (about)

     1  package rpc
     2  
     3  import (
     4  	"github.com/mitchellh/packer/packer"
     5  	"net/rpc"
     6  )
     7  
     8  // An implementation of packer.Provisioner where the provisioner is actually
     9  // executed over an RPC connection.
    10  type provisioner struct {
    11  	client *rpc.Client
    12  }
    13  
    14  // ProvisionerServer wraps a packer.Provisioner implementation and makes it
    15  // exportable as part of a Golang RPC server.
    16  type ProvisionerServer struct {
    17  	p packer.Provisioner
    18  }
    19  
    20  type ProvisionerPrepareArgs struct {
    21  	Configs []interface{}
    22  }
    23  
    24  type ProvisionerProvisionArgs struct {
    25  	RPCAddress string
    26  }
    27  
    28  func Provisioner(client *rpc.Client) *provisioner {
    29  	return &provisioner{client}
    30  }
    31  func (p *provisioner) Prepare(configs ...interface{}) (err error) {
    32  	args := &ProvisionerPrepareArgs{configs}
    33  	if cerr := p.client.Call("Provisioner.Prepare", args, &err); cerr != nil {
    34  		err = cerr
    35  	}
    36  
    37  	return
    38  }
    39  
    40  func (p *provisioner) Provision(ui packer.Ui, comm packer.Communicator) error {
    41  	// TODO: Error handling
    42  	server := rpc.NewServer()
    43  	RegisterCommunicator(server, comm)
    44  	RegisterUi(server, ui)
    45  
    46  	args := &ProvisionerProvisionArgs{serveSingleConn(server)}
    47  	return p.client.Call("Provisioner.Provision", args, new(interface{}))
    48  }
    49  
    50  func (p *ProvisionerServer) Prepare(args *ProvisionerPrepareArgs, reply *error) error {
    51  	*reply = p.p.Prepare(args.Configs...)
    52  	if *reply != nil {
    53  		*reply = NewBasicError(*reply)
    54  	}
    55  
    56  	return nil
    57  }
    58  
    59  func (p *ProvisionerServer) Provision(args *ProvisionerProvisionArgs, reply *interface{}) error {
    60  	client, err := rpc.Dial("tcp", args.RPCAddress)
    61  	if err != nil {
    62  		return err
    63  	}
    64  
    65  	comm := Communicator(client)
    66  	ui := &Ui{client}
    67  
    68  	if err := p.p.Provision(ui, comm); err != nil {
    69  		return NewBasicError(err)
    70  	}
    71  
    72  	return nil
    73  }