mirror of
https://github.com/kemko/nomad.git
synced 2026-01-04 09:25:46 +03:00
Reserving ports for client in every platform
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user