85 lines
1.9 KiB
Go
85 lines
1.9 KiB
Go
package rpcproxy
|
|
|
|
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,
|
|
}
|
|
}
|
|
|
|
// NewServerEndpoint creates a new Server instance with a resolvable
|
|
// endpoint. `name` can be either an IP address or a DNS name. If `name` is
|
|
// a DNS name, it must be resolvable to an IP address (most inputs are IP
|
|
// addresses, not DNS names, but both work equally well when the name is
|
|
// resolvable).
|
|
func NewServerEndpoint(name string) (*ServerEndpoint, error) {
|
|
s := &ServerEndpoint{
|
|
Name: name,
|
|
}
|
|
|
|
var host, port string
|
|
var err error
|
|
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)
|
|
}
|