2015-08-25 23:13:33 +00:00
|
|
|
package config
|
|
|
|
|
|
|
|
import (
|
2015-11-17 03:30:37 +00:00
|
|
|
"fmt"
|
2015-08-25 23:13:33 +00:00
|
|
|
"io"
|
2015-11-17 03:30:37 +00:00
|
|
|
"strconv"
|
2015-11-24 15:18:49 +00:00
|
|
|
"strings"
|
2015-12-23 00:10:30 +00:00
|
|
|
"time"
|
2015-08-25 23:13:33 +00:00
|
|
|
|
|
|
|
"github.com/hashicorp/nomad/nomad/structs"
|
|
|
|
)
|
|
|
|
|
|
|
|
// RPCHandler can be provided to the Client if there is a local server
|
|
|
|
// to avoid going over the network. If not provided, the Client will
|
|
|
|
// maintain a connection pool to the servers
|
|
|
|
type RPCHandler interface {
|
|
|
|
RPC(method string, args interface{}, reply interface{}) error
|
|
|
|
}
|
|
|
|
|
|
|
|
// Config is used to parameterize and configure the behavior of the client
|
|
|
|
type Config struct {
|
|
|
|
// DevMode controls if we are in a development mode which
|
|
|
|
// avoids persistent storage.
|
|
|
|
DevMode bool
|
|
|
|
|
|
|
|
// StateDir is where we store our state
|
|
|
|
StateDir string
|
|
|
|
|
|
|
|
// AllocDir is where we store data for allocations
|
|
|
|
AllocDir string
|
|
|
|
|
|
|
|
// LogOutput is the destination for logs
|
|
|
|
LogOutput io.Writer
|
|
|
|
|
|
|
|
// Region is the clients region
|
|
|
|
Region string
|
|
|
|
|
2015-10-01 15:31:47 +00:00
|
|
|
// Network interface to be used in network fingerprinting
|
2015-10-02 07:29:18 +00:00
|
|
|
NetworkInterface string
|
2015-10-01 15:31:47 +00:00
|
|
|
|
2015-10-03 00:32:11 +00:00
|
|
|
// Network speed is the default speed of network interfaces if they can not
|
|
|
|
// be determined dynamically.
|
|
|
|
NetworkSpeed int
|
|
|
|
|
2015-12-23 00:10:30 +00:00
|
|
|
// MaxKillTimeout allows capping the user-specifiable KillTimeout. If the
|
|
|
|
// task's KillTimeout is greater than the MaxKillTimeout, MaxKillTimeout is
|
|
|
|
// used.
|
|
|
|
MaxKillTimeout time.Duration
|
|
|
|
|
2015-08-25 23:13:33 +00:00
|
|
|
// Servers is a list of known server addresses. These are as "host:port"
|
|
|
|
Servers []string
|
|
|
|
|
|
|
|
// RPCHandler can be provided to avoid network traffic if the
|
|
|
|
// server is running locally.
|
|
|
|
RPCHandler RPCHandler
|
|
|
|
|
|
|
|
// Node provides the base node
|
|
|
|
Node *structs.Node
|
2015-09-01 02:48:59 +00:00
|
|
|
|
2016-02-08 21:29:53 +00:00
|
|
|
// ClientMaxPort is the upper range of the ports that the client uses for
|
|
|
|
// communicating with plugin subsystems
|
|
|
|
ClientMaxPort uint
|
2016-02-05 23:17:15 +00:00
|
|
|
|
2016-02-08 21:29:53 +00:00
|
|
|
// ClientMinPort is the lower range of the ports that the client uses for
|
|
|
|
// communicating with plugin subsystems
|
|
|
|
ClientMinPort uint
|
2016-02-05 23:17:15 +00:00
|
|
|
|
2015-09-01 02:48:59 +00:00
|
|
|
// Options provides arbitrary key-value configuration for nomad internals,
|
|
|
|
// like fingerprinters and drivers. The format is:
|
|
|
|
//
|
|
|
|
// namespace.option = value
|
|
|
|
Options map[string]string
|
|
|
|
}
|
|
|
|
|
2016-02-10 21:44:53 +00:00
|
|
|
func (c *Config) Copy() *Config {
|
2016-02-11 01:54:43 +00:00
|
|
|
nc := new(Config)
|
|
|
|
*nc = *c
|
|
|
|
nc.Node = nc.Node.Copy()
|
|
|
|
nc.Servers = structs.CopySliceString(nc.Servers)
|
|
|
|
nc.Options = structs.CopyMapStringString(nc.Options)
|
|
|
|
return nc
|
2016-02-10 21:44:53 +00:00
|
|
|
}
|
|
|
|
|
2015-09-01 02:54:49 +00:00
|
|
|
// Read returns the specified configuration value or "".
|
2015-09-01 02:48:59 +00:00
|
|
|
func (c *Config) Read(id string) string {
|
|
|
|
val, ok := c.Options[id]
|
|
|
|
if !ok {
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
return val
|
2015-08-25 23:13:33 +00:00
|
|
|
}
|
2015-09-01 02:54:49 +00:00
|
|
|
|
|
|
|
// ReadDefault returns the specified configuration value, or the specified
|
|
|
|
// default value if none is set.
|
|
|
|
func (c *Config) ReadDefault(id string, defaultValue string) string {
|
|
|
|
val := c.Read(id)
|
|
|
|
if val != "" {
|
|
|
|
return val
|
|
|
|
}
|
|
|
|
return defaultValue
|
|
|
|
}
|
2015-11-17 03:30:37 +00:00
|
|
|
|
|
|
|
// ReadBool parses the specified option as a boolean.
|
|
|
|
func (c *Config) ReadBool(id string) (bool, error) {
|
|
|
|
val, ok := c.Options[id]
|
|
|
|
if !ok {
|
2015-11-17 03:55:08 +00:00
|
|
|
return false, fmt.Errorf("Specified config is missing from options")
|
2015-11-17 03:30:37 +00:00
|
|
|
}
|
|
|
|
bval, err := strconv.ParseBool(val)
|
|
|
|
if err != nil {
|
|
|
|
return false, fmt.Errorf("Failed to parse %s as bool: %s", val, err)
|
|
|
|
}
|
|
|
|
return bval, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// ReadBoolDefault tries to parse the specified option as a boolean. If there is
|
|
|
|
// an error in parsing, the default option is returned.
|
|
|
|
func (c *Config) ReadBoolDefault(id string, defaultValue bool) bool {
|
2015-11-17 03:55:08 +00:00
|
|
|
val, err := c.ReadBool(id)
|
2015-11-17 03:30:37 +00:00
|
|
|
if err != nil {
|
|
|
|
return defaultValue
|
|
|
|
}
|
|
|
|
return val
|
|
|
|
}
|
2015-11-24 15:18:49 +00:00
|
|
|
|
|
|
|
// ReadStringListToMap tries to parse the specified option as a comma seperated list.
|
|
|
|
// If there is an error in parsing, an empty list is returned.
|
|
|
|
func (c *Config) ReadStringListToMap(key string) map[string]struct{} {
|
|
|
|
s := strings.TrimSpace(c.Read(key))
|
|
|
|
list := make(map[string]struct{})
|
|
|
|
if s != "" {
|
|
|
|
for _, e := range strings.Split(s, ",") {
|
|
|
|
trimmed := strings.TrimSpace(e)
|
|
|
|
list[trimmed] = struct{}{}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return list
|
|
|
|
}
|