mirror of https://github.com/docker/docs.git
add engine options for refresh interval
Signed-off-by: Dong Chen <dongluo.chen@docker.com>
This commit is contained in:
parent
cb7ddd1fcb
commit
c9f3471dba
|
@ -26,6 +26,7 @@ var (
|
||||||
flHosts,
|
flHosts,
|
||||||
flLeaderElection, flLeaderTTL, flManageAdvertise,
|
flLeaderElection, flLeaderTTL, flManageAdvertise,
|
||||||
flTLS, flTLSCaCert, flTLSCert, flTLSKey, flTLSVerify,
|
flTLS, flTLSCaCert, flTLSCert, flTLSKey, flTLSVerify,
|
||||||
|
flRefreshIntervalMin, flRefreshIntervalMax, flRefreshRetry,
|
||||||
flHeartBeat,
|
flHeartBeat,
|
||||||
flEnableCors,
|
flEnableCors,
|
||||||
flCluster, flDiscoveryOpt, flClusterOpt},
|
flCluster, flDiscoveryOpt, flClusterOpt},
|
||||||
|
|
16
cli/flags.go
16
cli/flags.go
|
@ -61,6 +61,21 @@ var (
|
||||||
Value: "10s",
|
Value: "10s",
|
||||||
Usage: "timeout period",
|
Usage: "timeout period",
|
||||||
}
|
}
|
||||||
|
flRefreshIntervalMin = cli.StringFlag{
|
||||||
|
Name: "engine-refresh-min-interval",
|
||||||
|
Value: "30s",
|
||||||
|
Usage: "set engine refresh minimum interval",
|
||||||
|
}
|
||||||
|
flRefreshIntervalMax = cli.StringFlag{
|
||||||
|
Name: "engine-refresh-max-interval",
|
||||||
|
Value: "60s",
|
||||||
|
Usage: "set engine refresh maximum interval",
|
||||||
|
}
|
||||||
|
flRefreshRetry = cli.StringFlag{
|
||||||
|
Name: "engine-refresh-retry",
|
||||||
|
Value: "3",
|
||||||
|
Usage: "set engine refresh retry count on failure",
|
||||||
|
}
|
||||||
flEnableCors = cli.BoolFlag{
|
flEnableCors = cli.BoolFlag{
|
||||||
Name: "api-enable-cors, cors",
|
Name: "api-enable-cors, cors",
|
||||||
Usage: "enable CORS headers in the remote API",
|
Usage: "enable CORS headers in the remote API",
|
||||||
|
@ -117,7 +132,6 @@ var (
|
||||||
Usage: "discovery options",
|
Usage: "discovery options",
|
||||||
Value: &cli.StringSlice{},
|
Value: &cli.StringSlice{},
|
||||||
}
|
}
|
||||||
|
|
||||||
flLeaderElection = cli.BoolFlag{
|
flLeaderElection = cli.BoolFlag{
|
||||||
Name: "replication",
|
Name: "replication",
|
||||||
Usage: "Enable Swarm manager replication",
|
Usage: "Enable Swarm manager replication",
|
||||||
|
|
|
@ -232,6 +232,24 @@ func manage(c *cli.Context) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
refreshMinInterval := c.Duration("engine-refresh-min-interval")
|
||||||
|
refreshMaxInterval := c.Duration("engine-refresh-max-interval")
|
||||||
|
if refreshMinInterval == time.Duration(0) {
|
||||||
|
log.Fatal("minimum refresh interval should be a positive number")
|
||||||
|
}
|
||||||
|
if refreshMaxInterval < refreshMinInterval {
|
||||||
|
log.Fatal("max refresh interval cannot be less than min refresh interval")
|
||||||
|
}
|
||||||
|
refreshRetry := c.Int("engine-refresh-retry")
|
||||||
|
if refreshRetry <= 0 {
|
||||||
|
log.Fatal("invalid refresh retry count")
|
||||||
|
}
|
||||||
|
engineOpts := &cluster.EngineOpts{
|
||||||
|
RefreshMinInterval: refreshMinInterval,
|
||||||
|
RefreshMaxInterval: refreshMaxInterval,
|
||||||
|
RefreshRetry: refreshRetry,
|
||||||
|
}
|
||||||
|
|
||||||
uri := getDiscovery(c)
|
uri := getDiscovery(c)
|
||||||
if uri == "" {
|
if uri == "" {
|
||||||
log.Fatalf("discovery required to manage a cluster. See '%s manage --help'.", c.App.Name)
|
log.Fatalf("discovery required to manage a cluster. See '%s manage --help'.", c.App.Name)
|
||||||
|
@ -257,9 +275,9 @@ func manage(c *cli.Context) {
|
||||||
switch c.String("cluster-driver") {
|
switch c.String("cluster-driver") {
|
||||||
case "mesos-experimental":
|
case "mesos-experimental":
|
||||||
log.Warn("WARNING: the mesos driver is currently experimental, use at your own risks")
|
log.Warn("WARNING: the mesos driver is currently experimental, use at your own risks")
|
||||||
cl, err = mesos.NewCluster(sched, tlsConfig, uri, c.StringSlice("cluster-opt"))
|
cl, err = mesos.NewCluster(sched, tlsConfig, uri, c.StringSlice("cluster-opt"), engineOpts)
|
||||||
case "swarm":
|
case "swarm":
|
||||||
cl, err = swarm.NewCluster(sched, tlsConfig, discovery, c.StringSlice("cluster-opt"))
|
cl, err = swarm.NewCluster(sched, tlsConfig, discovery, c.StringSlice("cluster-opt"), engineOpts)
|
||||||
default:
|
default:
|
||||||
log.Fatalf("unsupported cluster %q", c.String("cluster-driver"))
|
log.Fatalf("unsupported cluster %q", c.String("cluster-driver"))
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,11 +19,6 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// Force-refresh the state of the engine this often.
|
|
||||||
stateRefreshMinRange = 30 * time.Second
|
|
||||||
stateRefreshMaxRange = 60 * time.Second
|
|
||||||
stateRefreshRetries = 3
|
|
||||||
|
|
||||||
// Timeout for requests sent out to the engine.
|
// Timeout for requests sent out to the engine.
|
||||||
requestTimeout = 10 * time.Second
|
requestTimeout = 10 * time.Second
|
||||||
|
|
||||||
|
@ -52,10 +47,21 @@ func (d *delayer) Wait() <-chan time.Time {
|
||||||
d.l.Lock()
|
d.l.Lock()
|
||||||
defer d.l.Unlock()
|
defer d.l.Unlock()
|
||||||
|
|
||||||
waitPeriod := int64(d.rangeMin) + d.r.Int63n(int64(d.rangeMax)-int64(d.rangeMin))
|
waitPeriod := int64(d.rangeMin)
|
||||||
|
if delta := int64(d.rangeMax) - int64(d.rangeMin); delta > 0 {
|
||||||
|
// Int63n panics if the parameter is 0
|
||||||
|
waitPeriod += d.r.Int63n(delta)
|
||||||
|
}
|
||||||
return time.After(time.Duration(waitPeriod))
|
return time.After(time.Duration(waitPeriod))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EngineOpts represents the options for an engine
|
||||||
|
type EngineOpts struct {
|
||||||
|
RefreshMinInterval time.Duration
|
||||||
|
RefreshMaxInterval time.Duration
|
||||||
|
RefreshRetry int
|
||||||
|
}
|
||||||
|
|
||||||
// Engine represents a docker engine
|
// Engine represents a docker engine
|
||||||
type Engine struct {
|
type Engine struct {
|
||||||
sync.RWMutex
|
sync.RWMutex
|
||||||
|
@ -78,14 +84,18 @@ type Engine struct {
|
||||||
eventHandler EventHandler
|
eventHandler EventHandler
|
||||||
healthy bool
|
healthy bool
|
||||||
overcommitRatio int64
|
overcommitRatio int64
|
||||||
|
opts *EngineOpts
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewEngine is exported
|
// NewEngine is exported
|
||||||
func NewEngine(addr string, overcommitRatio float64) *Engine {
|
func NewEngine(addr string, overcommitRatio float64, opts *EngineOpts) *Engine {
|
||||||
|
if opts == nil {
|
||||||
|
log.Fatal("EngineOpts is nil")
|
||||||
|
}
|
||||||
e := &Engine{
|
e := &Engine{
|
||||||
Addr: addr,
|
Addr: addr,
|
||||||
client: nopclient.NewNopClient(),
|
client: nopclient.NewNopClient(),
|
||||||
refreshDelayer: newDelayer(stateRefreshMinRange, stateRefreshMaxRange),
|
refreshDelayer: newDelayer(opts.RefreshMinInterval, opts.RefreshMaxInterval),
|
||||||
Labels: make(map[string]string),
|
Labels: make(map[string]string),
|
||||||
stopCh: make(chan struct{}),
|
stopCh: make(chan struct{}),
|
||||||
containers: make(map[string]*Container),
|
containers: make(map[string]*Container),
|
||||||
|
@ -93,6 +103,7 @@ func NewEngine(addr string, overcommitRatio float64) *Engine {
|
||||||
volumes: make(map[string]*Volume),
|
volumes: make(map[string]*Volume),
|
||||||
healthy: true,
|
healthy: true,
|
||||||
overcommitRatio: int64(overcommitRatio * 100),
|
overcommitRatio: int64(overcommitRatio * 100),
|
||||||
|
opts: opts,
|
||||||
}
|
}
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
|
@ -412,10 +423,8 @@ func (e *Engine) refreshLoop() {
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
failedAttempts++
|
failedAttempts++
|
||||||
if failedAttempts >= stateRefreshRetries {
|
if failedAttempts >= e.opts.RefreshRetry && e.healthy {
|
||||||
if e.healthy {
|
|
||||||
e.emitEvent("engine_disconnect")
|
e.emitEvent("engine_disconnect")
|
||||||
}
|
|
||||||
e.healthy = false
|
e.healthy = false
|
||||||
log.WithFields(log.Fields{"name": e.Name, "id": e.ID}).Errorf("Flagging engine as dead. Updated state failed %d times: %v", failedAttempts, err)
|
log.WithFields(log.Fields{"name": e.Name, "id": e.ID}).Errorf("Flagging engine as dead. Updated state failed %d times: %v", failedAttempts, err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/samalba/dockerclient"
|
"github.com/samalba/dockerclient"
|
||||||
"github.com/samalba/dockerclient/mockclient"
|
"github.com/samalba/dockerclient/mockclient"
|
||||||
|
@ -32,7 +33,12 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestEngineConnectionFailure(t *testing.T) {
|
func TestEngineConnectionFailure(t *testing.T) {
|
||||||
engine := NewEngine("test", 0)
|
opts := &EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
|
engine := NewEngine("test", 0, opts)
|
||||||
assert.False(t, engine.isConnected())
|
assert.False(t, engine.isConnected())
|
||||||
|
|
||||||
// Always fail.
|
// Always fail.
|
||||||
|
@ -51,7 +57,12 @@ func TestEngineConnectionFailure(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestOutdatedEngine(t *testing.T) {
|
func TestOutdatedEngine(t *testing.T) {
|
||||||
engine := NewEngine("test", 0)
|
opts := &EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
|
engine := NewEngine("test", 0, opts)
|
||||||
client := mockclient.NewMockClient()
|
client := mockclient.NewMockClient()
|
||||||
client.On("Info").Return(&dockerclient.Info{}, nil)
|
client.On("Info").Return(&dockerclient.Info{}, nil)
|
||||||
|
|
||||||
|
@ -65,7 +76,12 @@ func TestOutdatedEngine(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestEngineCpusMemory(t *testing.T) {
|
func TestEngineCpusMemory(t *testing.T) {
|
||||||
engine := NewEngine("test", 0)
|
opts := &EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
|
engine := NewEngine("test", 0, opts)
|
||||||
assert.False(t, engine.isConnected())
|
assert.False(t, engine.isConnected())
|
||||||
|
|
||||||
client := mockclient.NewMockClient()
|
client := mockclient.NewMockClient()
|
||||||
|
@ -88,7 +104,12 @@ func TestEngineCpusMemory(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestEngineSpecs(t *testing.T) {
|
func TestEngineSpecs(t *testing.T) {
|
||||||
engine := NewEngine("test", 0)
|
opts := &EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
|
engine := NewEngine("test", 0, opts)
|
||||||
assert.False(t, engine.isConnected())
|
assert.False(t, engine.isConnected())
|
||||||
|
|
||||||
client := mockclient.NewMockClient()
|
client := mockclient.NewMockClient()
|
||||||
|
@ -116,7 +137,12 @@ func TestEngineSpecs(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestEngineState(t *testing.T) {
|
func TestEngineState(t *testing.T) {
|
||||||
engine := NewEngine("test", 0)
|
opts := &EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
|
engine := NewEngine("test", 0, opts)
|
||||||
assert.False(t, engine.isConnected())
|
assert.False(t, engine.isConnected())
|
||||||
|
|
||||||
client := mockclient.NewMockClient()
|
client := mockclient.NewMockClient()
|
||||||
|
@ -158,6 +184,11 @@ func TestEngineState(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCreateContainer(t *testing.T) {
|
func TestCreateContainer(t *testing.T) {
|
||||||
|
opts := &EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
var (
|
var (
|
||||||
config = &ContainerConfig{dockerclient.ContainerConfig{
|
config = &ContainerConfig{dockerclient.ContainerConfig{
|
||||||
Image: "busybox",
|
Image: "busybox",
|
||||||
|
@ -165,7 +196,7 @@ func TestCreateContainer(t *testing.T) {
|
||||||
Cmd: []string{"date"},
|
Cmd: []string{"date"},
|
||||||
Tty: false,
|
Tty: false,
|
||||||
}}
|
}}
|
||||||
engine = NewEngine("test", 0)
|
engine = NewEngine("test", 0, opts)
|
||||||
client = mockclient.NewMockClient()
|
client = mockclient.NewMockClient()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -224,7 +255,12 @@ func TestCreateContainer(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestImages(t *testing.T) {
|
func TestImages(t *testing.T) {
|
||||||
engine := NewEngine("test", 0)
|
opts := &EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
|
engine := NewEngine("test", 0, opts)
|
||||||
engine.images = []*Image{
|
engine.images = []*Image{
|
||||||
{dockerclient.Image{Id: "a"}, engine},
|
{dockerclient.Image{Id: "a"}, engine},
|
||||||
{dockerclient.Image{Id: "b"}, engine},
|
{dockerclient.Image{Id: "b"}, engine},
|
||||||
|
@ -234,22 +270,33 @@ func TestImages(t *testing.T) {
|
||||||
result := engine.Images()
|
result := engine.Images()
|
||||||
assert.Equal(t, len(result), 3)
|
assert.Equal(t, len(result), 3)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTotalMemory(t *testing.T) {
|
func TestTotalMemory(t *testing.T) {
|
||||||
engine := NewEngine("test", 0.05)
|
opts := &EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
|
engine := NewEngine("test", 0.05, opts)
|
||||||
engine.Memory = 1024
|
engine.Memory = 1024
|
||||||
assert.Equal(t, engine.TotalMemory(), int64(1024+1024*5/100))
|
assert.Equal(t, engine.TotalMemory(), int64(1024+1024*5/100))
|
||||||
|
|
||||||
engine = NewEngine("test", 0)
|
engine = NewEngine("test", 0, opts)
|
||||||
engine.Memory = 1024
|
engine.Memory = 1024
|
||||||
assert.Equal(t, engine.TotalMemory(), int64(1024))
|
assert.Equal(t, engine.TotalMemory(), int64(1024))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTotalCpus(t *testing.T) {
|
func TestTotalCpus(t *testing.T) {
|
||||||
engine := NewEngine("test", 0.05)
|
opts := &EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
|
engine := NewEngine("test", 0.05, opts)
|
||||||
engine.Cpus = 2
|
engine.Cpus = 2
|
||||||
assert.Equal(t, engine.TotalCpus(), int64(2+2*5/100))
|
assert.Equal(t, engine.TotalCpus(), int64(2+2*5/100))
|
||||||
|
|
||||||
engine = NewEngine("test", 0)
|
engine = NewEngine("test", 0, opts)
|
||||||
engine.Cpus = 2
|
engine.Cpus = 2
|
||||||
assert.Equal(t, engine.TotalCpus(), int64(2))
|
assert.Equal(t, engine.TotalCpus(), int64(2))
|
||||||
}
|
}
|
||||||
|
@ -260,7 +307,12 @@ func TestUsedCpus(t *testing.T) {
|
||||||
hostNcpu = []int64{1, 2, 4, 8, 10, 12, 16, 20, 32, 36, 40, 48}
|
hostNcpu = []int64{1, 2, 4, 8, 10, 12, 16, 20, 32, 36, 40, 48}
|
||||||
)
|
)
|
||||||
|
|
||||||
engine := NewEngine("test", 0)
|
opts := &EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
|
engine := NewEngine("test", 0, opts)
|
||||||
client := mockclient.NewMockClient()
|
client := mockclient.NewMockClient()
|
||||||
|
|
||||||
for _, hn := range hostNcpu {
|
for _, hn := range hostNcpu {
|
||||||
|
@ -293,7 +345,12 @@ func TestContainerRemovedDuringRefresh(t *testing.T) {
|
||||||
info2 = &dockerclient.ContainerInfo{Id: "c2", Config: &dockerclient.ContainerConfig{}}
|
info2 = &dockerclient.ContainerInfo{Id: "c2", Config: &dockerclient.ContainerConfig{}}
|
||||||
)
|
)
|
||||||
|
|
||||||
engine := NewEngine("test", 0)
|
opts := &EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
|
engine := NewEngine("test", 0, opts)
|
||||||
assert.False(t, engine.isConnected())
|
assert.False(t, engine.isConnected())
|
||||||
|
|
||||||
// A container is removed before it can be inspected.
|
// A container is removed before it can be inspected.
|
||||||
|
|
|
@ -2,6 +2,7 @@ package cluster
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
dockerfilters "github.com/docker/docker/pkg/parsers/filters"
|
dockerfilters "github.com/docker/docker/pkg/parsers/filters"
|
||||||
"github.com/samalba/dockerclient"
|
"github.com/samalba/dockerclient"
|
||||||
|
@ -52,7 +53,12 @@ func TestMatchPrivateRepo(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestImagesFilterWithLabelFilter(t *testing.T) {
|
func TestImagesFilterWithLabelFilter(t *testing.T) {
|
||||||
engine := NewEngine("test", 0)
|
opts := &EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
|
engine := NewEngine("test", 0, opts)
|
||||||
images := Images{
|
images := Images{
|
||||||
{dockerclient.Image{Id: "a"}, engine},
|
{dockerclient.Image{Id: "a"}, engine},
|
||||||
{dockerclient.Image{
|
{dockerclient.Image{
|
||||||
|
@ -69,7 +75,12 @@ func TestImagesFilterWithLabelFilter(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestImagesFilterWithNameFilter(t *testing.T) {
|
func TestImagesFilterWithNameFilter(t *testing.T) {
|
||||||
engine := NewEngine("test", 0)
|
opts := &EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
|
engine := NewEngine("test", 0, opts)
|
||||||
images := Images{
|
images := Images{
|
||||||
{
|
{
|
||||||
dockerclient.Image{
|
dockerclient.Image{
|
||||||
|
@ -93,7 +104,12 @@ func TestImagesFilterWithNameFilter(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestImagesFilterWithNameFilterWithTag(t *testing.T) {
|
func TestImagesFilterWithNameFilterWithTag(t *testing.T) {
|
||||||
engine := NewEngine("test", 0)
|
opts := &EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
|
engine := NewEngine("test", 0, opts)
|
||||||
images := Images{
|
images := Images{
|
||||||
{
|
{
|
||||||
dockerclient.Image{
|
dockerclient.Image{
|
||||||
|
|
|
@ -37,6 +37,7 @@ type Cluster struct {
|
||||||
offerTimeout time.Duration
|
offerTimeout time.Duration
|
||||||
taskCreationTimeout time.Duration
|
taskCreationTimeout time.Duration
|
||||||
pendingTasks *queue.Queue
|
pendingTasks *queue.Queue
|
||||||
|
engineOpts *cluster.EngineOpts
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -54,7 +55,7 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewCluster for mesos Cluster creation
|
// NewCluster for mesos Cluster creation
|
||||||
func NewCluster(scheduler *scheduler.Scheduler, TLSConfig *tls.Config, master string, options cluster.DriverOpts) (cluster.Cluster, error) {
|
func NewCluster(scheduler *scheduler.Scheduler, TLSConfig *tls.Config, master string, options cluster.DriverOpts, engineOptions *cluster.EngineOpts) (cluster.Cluster, error) {
|
||||||
log.WithFields(log.Fields{"name": "mesos"}).Debug("Initializing cluster")
|
log.WithFields(log.Fields{"name": "mesos"}).Debug("Initializing cluster")
|
||||||
|
|
||||||
cluster := &Cluster{
|
cluster := &Cluster{
|
||||||
|
@ -66,6 +67,7 @@ func NewCluster(scheduler *scheduler.Scheduler, TLSConfig *tls.Config, master st
|
||||||
options: &options,
|
options: &options,
|
||||||
offerTimeout: defaultOfferTimeout,
|
offerTimeout: defaultOfferTimeout,
|
||||||
taskCreationTimeout: defaultTaskCreationTimeout,
|
taskCreationTimeout: defaultTaskCreationTimeout,
|
||||||
|
engineOpts: engineOptions,
|
||||||
}
|
}
|
||||||
|
|
||||||
cluster.pendingTasks = queue.NewQueue()
|
cluster.pendingTasks = queue.NewQueue()
|
||||||
|
|
|
@ -2,6 +2,7 @@ package mesos
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/docker/swarm/cluster"
|
"github.com/docker/swarm/cluster"
|
||||||
"github.com/samalba/dockerclient"
|
"github.com/samalba/dockerclient"
|
||||||
|
@ -9,7 +10,12 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func createSlave(t *testing.T, ID string, containers ...*cluster.Container) *slave {
|
func createSlave(t *testing.T, ID string, containers ...*cluster.Container) *slave {
|
||||||
engine := cluster.NewEngine(ID, 0)
|
opts := &cluster.EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
|
engine := cluster.NewEngine(ID, 0, opts)
|
||||||
engine.Name = ID
|
engine.Name = ID
|
||||||
engine.ID = ID
|
engine.ID = ID
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ func (c *Cluster) ResourceOffers(_ mesosscheduler.SchedulerDriver, offers []*mes
|
||||||
}
|
}
|
||||||
s, ok := c.slaves[slaveID]
|
s, ok := c.slaves[slaveID]
|
||||||
if !ok {
|
if !ok {
|
||||||
engine := cluster.NewEngine(*offer.Hostname+":"+dockerPort, 0)
|
engine := cluster.NewEngine(*offer.Hostname+":"+dockerPort, 0, c.engineOpts)
|
||||||
if err := engine.Connect(c.TLSConfig); err != nil {
|
if err := engine.Connect(c.TLSConfig); err != nil {
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -54,11 +54,12 @@ type Cluster struct {
|
||||||
pendingContainers map[string]*pendingContainer
|
pendingContainers map[string]*pendingContainer
|
||||||
|
|
||||||
overcommitRatio float64
|
overcommitRatio float64
|
||||||
|
engineOpts *cluster.EngineOpts
|
||||||
TLSConfig *tls.Config
|
TLSConfig *tls.Config
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewCluster is exported
|
// NewCluster is exported
|
||||||
func NewCluster(scheduler *scheduler.Scheduler, TLSConfig *tls.Config, discovery discovery.Discovery, options cluster.DriverOpts) (cluster.Cluster, error) {
|
func NewCluster(scheduler *scheduler.Scheduler, TLSConfig *tls.Config, discovery discovery.Discovery, options cluster.DriverOpts, engineOptions *cluster.EngineOpts) (cluster.Cluster, error) {
|
||||||
log.WithFields(log.Fields{"name": "swarm"}).Debug("Initializing cluster")
|
log.WithFields(log.Fields{"name": "swarm"}).Debug("Initializing cluster")
|
||||||
|
|
||||||
cluster := &Cluster{
|
cluster := &Cluster{
|
||||||
|
@ -68,6 +69,7 @@ func NewCluster(scheduler *scheduler.Scheduler, TLSConfig *tls.Config, discovery
|
||||||
discovery: discovery,
|
discovery: discovery,
|
||||||
pendingContainers: make(map[string]*pendingContainer),
|
pendingContainers: make(map[string]*pendingContainer),
|
||||||
overcommitRatio: 0.05,
|
overcommitRatio: 0.05,
|
||||||
|
engineOpts: engineOptions,
|
||||||
}
|
}
|
||||||
|
|
||||||
if val, ok := options.Float("swarm.overcommit", ""); ok {
|
if val, ok := options.Float("swarm.overcommit", ""); ok {
|
||||||
|
@ -209,7 +211,7 @@ func (c *Cluster) addEngine(addr string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
engine := cluster.NewEngine(addr, c.overcommitRatio)
|
engine := cluster.NewEngine(addr, c.overcommitRatio, c.engineOpts)
|
||||||
if err := engine.RegisterEventHandler(c); err != nil {
|
if err := engine.RegisterEventHandler(c); err != nil {
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/docker/swarm/cluster"
|
"github.com/docker/swarm/cluster"
|
||||||
"github.com/samalba/dockerclient"
|
"github.com/samalba/dockerclient"
|
||||||
|
@ -41,7 +42,12 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
func createEngine(t *testing.T, ID string, containers ...*cluster.Container) *cluster.Engine {
|
func createEngine(t *testing.T, ID string, containers ...*cluster.Container) *cluster.Engine {
|
||||||
engine := cluster.NewEngine(ID, 0)
|
opts := &cluster.EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
|
engine := cluster.NewEngine(ID, 0, opts)
|
||||||
engine.Name = ID
|
engine.Name = ID
|
||||||
engine.ID = ID
|
engine.ID = ID
|
||||||
|
|
||||||
|
@ -119,7 +125,12 @@ func TestImportImage(t *testing.T) {
|
||||||
|
|
||||||
// create engione
|
// create engione
|
||||||
id := "test-engine"
|
id := "test-engine"
|
||||||
engine := cluster.NewEngine(id, 0)
|
opts := &cluster.EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
|
engine := cluster.NewEngine(id, 0, opts)
|
||||||
engine.Name = id
|
engine.Name = id
|
||||||
engine.ID = id
|
engine.ID = id
|
||||||
|
|
||||||
|
@ -169,7 +180,12 @@ func TestLoadImage(t *testing.T) {
|
||||||
|
|
||||||
// create engione
|
// create engione
|
||||||
id := "test-engine"
|
id := "test-engine"
|
||||||
engine := cluster.NewEngine(id, 0)
|
opts := &cluster.EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
|
engine := cluster.NewEngine(id, 0, opts)
|
||||||
engine.Name = id
|
engine.Name = id
|
||||||
engine.ID = id
|
engine.ID = id
|
||||||
|
|
||||||
|
@ -222,7 +238,12 @@ func TestTagImage(t *testing.T) {
|
||||||
|
|
||||||
// create engine
|
// create engine
|
||||||
id := "test-engine"
|
id := "test-engine"
|
||||||
engine := cluster.NewEngine(id, 0)
|
opts := &cluster.EngineOpts{
|
||||||
|
RefreshMinInterval: time.Duration(30),
|
||||||
|
RefreshMaxInterval: time.Duration(60),
|
||||||
|
RefreshRetry: 3,
|
||||||
|
}
|
||||||
|
engine := cluster.NewEngine(id, 0, opts)
|
||||||
engine.Name = id
|
engine.Name = id
|
||||||
engine.ID = id
|
engine.ID = id
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue