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