github.com/HashDataInc/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  }