Reserving ports for client in every platform

This commit is contained in:
Diptanu Choudhury
2016-02-12 13:21:56 -08:00
parent e8d3da2b2f
commit 7c4dbbf7da

View File

@@ -7,11 +7,11 @@ import (
"net"
"os"
"path/filepath"
"runtime"
"sync"
"time"
"github.com/hashicorp/nomad/client"
clientconfig "github.com/hashicorp/nomad/client/config"
"github.com/hashicorp/nomad/nomad"
"github.com/hashicorp/nomad/nomad/structs"
)
@@ -242,26 +242,8 @@ func (a *Agent) setupClient() error {
conf.Node.HTTPAddr = httpAddr
// Reserve some ports for the plugins
if runtime.GOOS == "windows" {
deviceName, err := a.findLoopbackDevice()
if err != nil {
return fmt.Errorf("error finding the device name for loopback: %v", err)
}
var nr *structs.NetworkResource
for _, n := range conf.Node.Reserved.Networks {
if n.Device == deviceName {
nr = n
}
}
if nr == nil {
nr = &structs.NetworkResource{
Device: deviceName,
ReservedPorts: make([]structs.Port, 0),
}
}
for i := conf.ClientMinPort; i <= conf.ClientMaxPort; i++ {
nr.ReservedPorts = append(nr.ReservedPorts, structs.Port{Label: fmt.Sprintf("plugin-%d", i), Value: int(i)})
}
if err := a.reservePortsForClient(conf); err != nil {
return err
}
// Create the client
@@ -273,26 +255,63 @@ func (a *Agent) setupClient() error {
return nil
}
func (a *Agent) findLoopbackDevice() (string, error) {
func (a *Agent) reservePortsForClient(conf *clientconfig.Config) error {
deviceName, addr, mask, err := a.findLoopbackDevice()
if err != nil {
return fmt.Errorf("error finding the device name for loopback: %v", err)
}
var nr *structs.NetworkResource
if conf.Node.Reserved == nil {
conf.Node.Reserved = &structs.Resources{}
}
for _, n := range conf.Node.Reserved.Networks {
if n.Device == deviceName {
nr = n
}
}
if nr == nil {
nr = &structs.NetworkResource{
Device: deviceName,
IP: addr,
CIDR: mask,
ReservedPorts: make([]structs.Port, 0),
}
}
for i := conf.ClientMinPort; i <= conf.ClientMaxPort; i++ {
nr.ReservedPorts = append(nr.ReservedPorts, structs.Port{Label: fmt.Sprintf("plugin-%d", i), Value: int(i)})
}
conf.Node.Reserved.Networks = append(conf.Node.Reserved.Networks, nr)
return nil
}
func (a *Agent) findLoopbackDevice() (string, string, string, error) {
var ifcs []net.Interface
var err error
var deviceName string
ifcs, err = net.Interfaces()
if err != nil {
return "", err
return "", "", "", err
}
for _, ifc := range ifcs {
addrs, err := ifc.Addrs()
if err != nil {
return deviceName, err
return deviceName, "", "", err
}
for _, addr := range addrs {
if net.ParseIP(addr.String()).IsLoopback() {
return ifc.Name, nil
var ip net.IP
switch v := addr.(type) {
case *net.IPNet:
ip = v.IP
case *net.IPAddr:
ip = v.IP
}
if ip.IsLoopback() {
return ifc.Name, ip.String(), addr.String(), nil
}
}
}
return deviceName, err
return deviceName, "", "", err
}
// Leave is used gracefully exit. Clients will inform servers