82 lines
1.6 KiB
Go
82 lines
1.6 KiB
Go
|
package rpc_proxy
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"net"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
defaultNomadRPCPort = "4647"
|
||
|
)
|
||
|
|
||
|
// EndpointKey is used in maps and for equality tests. A key is based on endpoints.
|
||
|
type EndpointKey struct {
|
||
|
name string
|
||
|
}
|
||
|
|
||
|
// Equal compares two EndpointKey objects
|
||
|
func (k *EndpointKey) Equal(x *EndpointKey) bool {
|
||
|
return k.name == x.name
|
||
|
}
|
||
|
|
||
|
// ServerEndpoint contains the address information for to connect to a Nomad
|
||
|
// server.
|
||
|
//
|
||
|
// TODO(sean@): Server is stubbed out so that in the future it can hold a
|
||
|
// reference to Node (and ultimately Node.ID).
|
||
|
type ServerEndpoint struct {
|
||
|
// Name is the unique lookup key for a Server instance
|
||
|
Name string
|
||
|
Host string
|
||
|
Port string
|
||
|
Addr net.Addr
|
||
|
}
|
||
|
|
||
|
// Key returns the corresponding Key
|
||
|
func (s *ServerEndpoint) Key() *EndpointKey {
|
||
|
return &EndpointKey{
|
||
|
name: s.Name,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// newServer creates a new Server instance with a resolvable endpoint
|
||
|
func newServer(name string) (s *ServerEndpoint, err error) {
|
||
|
s = &ServerEndpoint{
|
||
|
Name: name,
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
host, port string
|
||
|
)
|
||
|
host, port, err = net.SplitHostPort(name)
|
||
|
if err == nil {
|
||
|
s.Host = host
|
||
|
s.Port = port
|
||
|
} else {
|
||
|
if strings.Contains(err.Error(), "missing port") {
|
||
|
s.Host = name
|
||
|
s.Port = defaultNomadRPCPort
|
||
|
} else {
|
||
|
return nil, err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if s.Addr, err = net.ResolveTCPAddr("tcp", net.JoinHostPort(s.Host, s.Port)); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return s, err
|
||
|
}
|
||
|
|
||
|
// String returns a string representation of Server
|
||
|
func (s *ServerEndpoint) String() string {
|
||
|
var addrStr, networkStr string
|
||
|
if s.Addr != nil {
|
||
|
addrStr = s.Addr.String()
|
||
|
networkStr = s.Addr.Network()
|
||
|
}
|
||
|
|
||
|
return fmt.Sprintf("%s (%s:%s)", s.Name, networkStr, addrStr)
|
||
|
}
|