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 }