mirror of https://github.com/docker/docs.git
add --strategy to choose the strategy to use
Signed-off-by: Victor Vieux <vieux@docker.com>
This commit is contained in:
parent
c85b0a9c39
commit
b1e80ce157
|
@ -0,0 +1,52 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "github.com/codegangsta/cli"
|
||||||
|
|
||||||
|
var (
|
||||||
|
flDiscovery = cli.StringFlag{
|
||||||
|
Name: "discovery",
|
||||||
|
Value: "",
|
||||||
|
Usage: "DiscoveryService to use [token://<token>, etcd://<ip1>,<ip2>/<path>, file://path/to/file]",
|
||||||
|
EnvVar: "SWARM_DISCOVERY",
|
||||||
|
}
|
||||||
|
flAddr = cli.StringFlag{
|
||||||
|
Name: "addr",
|
||||||
|
Value: "127.0.0.1:4243",
|
||||||
|
Usage: "ip to advertise",
|
||||||
|
EnvVar: "SWARM_ADDR",
|
||||||
|
}
|
||||||
|
flHeartBeat = cli.IntFlag{
|
||||||
|
Name: "heartbeat, hb",
|
||||||
|
Value: 25,
|
||||||
|
Usage: "time in second between each heartbeat",
|
||||||
|
}
|
||||||
|
flEnableCors = cli.BoolFlag{
|
||||||
|
Name: "api-enable-cors, cors",
|
||||||
|
Usage: "enable CORS headers in the remote API",
|
||||||
|
}
|
||||||
|
flTls = cli.BoolFlag{
|
||||||
|
Name: "tls",
|
||||||
|
Usage: "Use TLS; implied by --tlsverify=true",
|
||||||
|
}
|
||||||
|
flTlsCaCert = cli.StringFlag{
|
||||||
|
Name: "tlscacert",
|
||||||
|
Usage: "Trust only remotes providing a certificate signed by the CA given here",
|
||||||
|
}
|
||||||
|
flTlsCert = cli.StringFlag{
|
||||||
|
Name: "tlscert",
|
||||||
|
Usage: "Path to TLS certificate file",
|
||||||
|
}
|
||||||
|
flTlsKey = cli.StringFlag{
|
||||||
|
Name: "tlskey",
|
||||||
|
Usage: "Path to TLS key file",
|
||||||
|
}
|
||||||
|
flTlsVerify = cli.BoolFlag{
|
||||||
|
Name: "tlsverify",
|
||||||
|
Usage: "Use TLS and verify the remote",
|
||||||
|
}
|
||||||
|
flStrategy = cli.StringFlag{
|
||||||
|
Name: "strategy",
|
||||||
|
Usage: "PlacementStrategy to use [binpacking, random]",
|
||||||
|
Value: "binpacking:0.05",
|
||||||
|
}
|
||||||
|
)
|
44
main.go
44
main.go
|
@ -36,49 +36,6 @@ func main() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// flags
|
|
||||||
flDiscovery := cli.StringFlag{
|
|
||||||
Name: "discovery",
|
|
||||||
Value: "",
|
|
||||||
Usage: "token://<token>, file://path/to/file",
|
|
||||||
EnvVar: "SWARM_DISCOVERY",
|
|
||||||
}
|
|
||||||
flAddr := cli.StringFlag{
|
|
||||||
Name: "addr",
|
|
||||||
Value: "127.0.0.1:4243",
|
|
||||||
Usage: "ip to advertise",
|
|
||||||
EnvVar: "SWARM_ADDR",
|
|
||||||
}
|
|
||||||
flHeartBeat := cli.IntFlag{
|
|
||||||
Name: "heartbeat, hb",
|
|
||||||
Value: 25,
|
|
||||||
Usage: "time in second between each heartbeat",
|
|
||||||
}
|
|
||||||
flEnableCors := cli.BoolFlag{
|
|
||||||
Name: "api-enable-cors, cors",
|
|
||||||
Usage: "enable CORS headers in the remote API",
|
|
||||||
}
|
|
||||||
flTls := cli.BoolFlag{
|
|
||||||
Name: "tls",
|
|
||||||
Usage: "Use TLS; implied by --tlsverify=true",
|
|
||||||
}
|
|
||||||
flTlsCaCert := cli.StringFlag{
|
|
||||||
Name: "tlscacert",
|
|
||||||
Usage: "Trust only remotes providing a certificate signed by the CA given here",
|
|
||||||
}
|
|
||||||
flTlsCert := cli.StringFlag{
|
|
||||||
Name: "tlscert",
|
|
||||||
Usage: "Path to TLS certificate file",
|
|
||||||
}
|
|
||||||
flTlsKey := cli.StringFlag{
|
|
||||||
Name: "tlskey",
|
|
||||||
Usage: "Path to TLS key file",
|
|
||||||
}
|
|
||||||
flTlsVerify := cli.BoolFlag{
|
|
||||||
Name: "tlsverify",
|
|
||||||
Usage: "Use TLS and verify the remote",
|
|
||||||
}
|
|
||||||
|
|
||||||
app.Commands = []cli.Command{
|
app.Commands = []cli.Command{
|
||||||
{
|
{
|
||||||
Name: "create",
|
Name: "create",
|
||||||
|
@ -121,6 +78,7 @@ func main() {
|
||||||
ShortName: "m",
|
ShortName: "m",
|
||||||
Usage: "manage a docker cluster",
|
Usage: "manage a docker cluster",
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
|
flStrategy,
|
||||||
flDiscovery, flAddr, flHeartBeat,
|
flDiscovery, flAddr, flHeartBeat,
|
||||||
flTls, flTlsCaCert, flTlsCert, flTlsKey, flTlsVerify,
|
flTls, flTlsCaCert, flTlsCert, flTlsKey, flTlsVerify,
|
||||||
flEnableCors},
|
flEnableCors},
|
||||||
|
|
10
manage.go
10
manage.go
|
@ -123,9 +123,13 @@ func manage(c *cli.Context) {
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
s := scheduler.NewScheduler(
|
s, err := strategy.New(c.String("strategy"))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
sched := scheduler.NewScheduler(
|
||||||
cluster,
|
cluster,
|
||||||
&strategy.BinPackingPlacementStrategy{OvercommitRatio: 0.05},
|
s,
|
||||||
[]filter.Filter{
|
[]filter.Filter{
|
||||||
&filter.HealthFilter{},
|
&filter.HealthFilter{},
|
||||||
&filter.LabelFilter{},
|
&filter.LabelFilter{},
|
||||||
|
@ -133,5 +137,5 @@ func manage(c *cli.Context) {
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
log.Fatal(api.ListenAndServe(cluster, s, c.String("addr"), c.App.Version, c.Bool("cors"), tlsConfig))
|
log.Fatal(api.ListenAndServe(cluster, sched, c.String("addr"), c.App.Version, c.Bool("cors"), tlsConfig))
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package strategy
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"sort"
|
"sort"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"github.com/docker/swarm/cluster"
|
"github.com/docker/swarm/cluster"
|
||||||
"github.com/samalba/dockerclient"
|
"github.com/samalba/dockerclient"
|
||||||
|
@ -16,6 +17,11 @@ type BinPackingPlacementStrategy struct {
|
||||||
OvercommitRatio float64
|
OvercommitRatio float64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *BinPackingPlacementStrategy) Initialize(opts string) (err error) {
|
||||||
|
p.OvercommitRatio, err = strconv.ParseFloat(opts, 64)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func (p *BinPackingPlacementStrategy) PlaceContainer(config *dockerclient.ContainerConfig, nodes []*cluster.Node) (*cluster.Node, error) {
|
func (p *BinPackingPlacementStrategy) PlaceContainer(config *dockerclient.ContainerConfig, nodes []*cluster.Node) (*cluster.Node, error) {
|
||||||
scores := scores{}
|
scores := scores{}
|
||||||
|
|
||||||
|
|
|
@ -9,14 +9,15 @@ import (
|
||||||
"github.com/samalba/dockerclient"
|
"github.com/samalba/dockerclient"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
|
||||||
rand.Seed(time.Now().UTC().UnixNano())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Randomly place the container into the cluster.
|
// Randomly place the container into the cluster.
|
||||||
type RandomPlacementStrategy struct {
|
type RandomPlacementStrategy struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *RandomPlacementStrategy) Initialize(_ string) error {
|
||||||
|
rand.Seed(time.Now().UTC().UnixNano())
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (p *RandomPlacementStrategy) PlaceContainer(config *dockerclient.ContainerConfig, nodes []*cluster.Node) (*cluster.Node, error) {
|
func (p *RandomPlacementStrategy) PlaceContainer(config *dockerclient.ContainerConfig, nodes []*cluster.Node) (*cluster.Node, error) {
|
||||||
if size := len(nodes); size > 0 {
|
if size := len(nodes); size > 0 {
|
||||||
n := rand.Intn(len(nodes))
|
n := rand.Intn(len(nodes))
|
||||||
|
|
|
@ -1,12 +1,47 @@
|
||||||
package strategy
|
package strategy
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
log "github.com/Sirupsen/logrus"
|
||||||
"github.com/docker/swarm/cluster"
|
"github.com/docker/swarm/cluster"
|
||||||
"github.com/samalba/dockerclient"
|
"github.com/samalba/dockerclient"
|
||||||
)
|
)
|
||||||
|
|
||||||
type PlacementStrategy interface {
|
type PlacementStrategy interface {
|
||||||
|
Initialize(string) error
|
||||||
// Given a container configuration and a set of nodes, select the target
|
// Given a container configuration and a set of nodes, select the target
|
||||||
// node where the container should be scheduled.
|
// node where the container should be scheduled.
|
||||||
PlaceContainer(config *dockerclient.ContainerConfig, nodes []*cluster.Node) (*cluster.Node, error)
|
PlaceContainer(config *dockerclient.ContainerConfig, nodes []*cluster.Node) (*cluster.Node, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
strategies map[string]PlacementStrategy
|
||||||
|
ErrNotSupported = errors.New("strategy not supported")
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
strategies = make(map[string]PlacementStrategy)
|
||||||
|
strategies["binpacking"] = &BinPackingPlacementStrategy{}
|
||||||
|
strategies["random"] = &RandomPlacementStrategy{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(nameAndOpts string) (PlacementStrategy, error) {
|
||||||
|
var (
|
||||||
|
parts = strings.SplitN(nameAndOpts, ":", 2)
|
||||||
|
name = parts[0]
|
||||||
|
opts string
|
||||||
|
)
|
||||||
|
if len(parts) == 2 {
|
||||||
|
opts = parts[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
if strategy, exists := strategies[name]; exists {
|
||||||
|
log.Debugf("Initialising %q strategy with %q", name, opts)
|
||||||
|
err := strategy.Initialize(opts)
|
||||||
|
return strategy, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, ErrNotSupported
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue