packer-cn/packer/rpc/server_new.go

93 lines
2.1 KiB
Go
Raw Normal View History

package rpc
import (
"fmt"
"github.com/mitchellh/packer/packer"
"io"
"log"
"net/rpc"
"sync/atomic"
)
var endpointId uint64
const (
2013-12-09 19:22:11 -05:00
DefaultArtifactEndpoint string = "Artifact"
DefaultCacheEndpoint = "Cache"
DefaultPostProcessorEndpoint = "PostProcessor"
DefaultUiEndpoint = "Ui"
)
// Server represents an RPC server for Packer. This must be paired on
// the other side with a Client.
type Server struct {
2013-12-09 19:22:11 -05:00
mux *MuxConn
server *rpc.Server
}
// NewServer returns a new Packer RPC server.
2013-12-09 19:22:11 -05:00
func NewServer(conn io.ReadWriteCloser) *Server {
return &Server{
2013-12-09 19:22:11 -05:00
mux: NewMuxConn(conn),
server: rpc.NewServer(),
}
}
2013-12-09 19:22:11 -05:00
func (s *Server) Close() error {
return s.mux.Close()
}
func (s *Server) RegisterArtifact(a packer.Artifact) {
2013-12-09 19:22:11 -05:00
s.server.RegisterName(DefaultArtifactEndpoint, &ArtifactServer{
artifact: a,
})
}
2013-12-09 17:51:13 -05:00
func (s *Server) RegisterCache(c packer.Cache) {
2013-12-09 19:22:11 -05:00
s.server.RegisterName(DefaultCacheEndpoint, &CacheServer{
cache: c,
})
2013-12-09 17:51:13 -05:00
}
2013-12-09 17:57:18 -05:00
func (s *Server) RegisterPostProcessor(p packer.PostProcessor) {
2013-12-09 19:22:11 -05:00
s.server.RegisterName(DefaultPostProcessorEndpoint, &PostProcessorServer{
p: p,
})
}
func (s *Server) RegisterUi(ui packer.Ui) {
s.server.RegisterName(DefaultUiEndpoint, &UiServer{
ui: ui,
})
2013-12-09 17:57:18 -05:00
}
// ServeConn serves a single connection over the RPC server. It is up
// to the caller to obtain a proper io.ReadWriteCloser.
2013-12-09 19:22:11 -05:00
func (s *Server) Serve() {
2013-12-09 17:44:26 -05:00
// Accept a connection on stream ID 0, which is always used for
// normal client to server connections.
2013-12-09 19:22:11 -05:00
stream, err := s.mux.Accept(0)
defer stream.Close()
if err != nil {
log.Printf("[ERR] Error retrieving stream for serving: %s", err)
return
}
2013-12-09 19:22:11 -05:00
s.server.ServeConn(stream)
}
// registerComponent registers a single Packer RPC component onto
// the RPC server. If id is true, then a unique ID number will be appended
// onto the end of the endpoint.
//
// The endpoint name is returned.
func registerComponent(server *rpc.Server, name string, rcvr interface{}, id bool) string {
endpoint := name
if id {
fmt.Sprintf("%s.%d", endpoint, atomic.AddUint64(&endpointId, 1))
}
server.RegisterName(endpoint, rcvr)
return endpoint
}