1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

Merge pull request #23703 from tiborvass/carry-23694

Carry 23694: Default port for listen addr
This commit is contained in:
Arnaud Porterie 2016-06-18 06:25:57 +00:00 committed by GitHub
commit a3b6ab04f6
4 changed files with 166 additions and 18 deletions

View file

@ -22,7 +22,7 @@ type initOptions struct {
func newInitCommand(dockerCli *client.DockerCli) *cobra.Command { func newInitCommand(dockerCli *client.DockerCli) *cobra.Command {
var flags *pflag.FlagSet var flags *pflag.FlagSet
opts := initOptions{ opts := initOptions{
listenAddr: NewNodeAddrOption(), listenAddr: NewListenAddrOption(),
autoAccept: NewAutoAcceptOption(), autoAccept: NewAutoAcceptOption(),
} }
@ -36,9 +36,9 @@ func newInitCommand(dockerCli *client.DockerCli) *cobra.Command {
} }
flags = cmd.Flags() flags = cmd.Flags()
flags.Var(&opts.listenAddr, "listen-addr", "Listen address") flags.Var(&opts.listenAddr, flagListenAddr, "Listen address")
flags.Var(&opts.autoAccept, "auto-accept", "Auto acceptance policy (worker, manager, or none)") flags.Var(&opts.autoAccept, flagAutoAccept, "Auto acceptance policy (worker, manager, or none)")
flags.StringVar(&opts.secret, "secret", "", "Set secret value needed to accept nodes into cluster") flags.StringVar(&opts.secret, flagSecret, "", "Set secret value needed to accept nodes into cluster")
flags.BoolVar(&opts.forceNewCluster, "force-new-cluster", false, "Force create a new cluster from current state.") flags.BoolVar(&opts.forceNewCluster, "force-new-cluster", false, "Force create a new cluster from current state.")
return cmd return cmd
} }

View file

@ -20,7 +20,7 @@ type joinOptions struct {
func newJoinCommand(dockerCli *client.DockerCli) *cobra.Command { func newJoinCommand(dockerCli *client.DockerCli) *cobra.Command {
opts := joinOptions{ opts := joinOptions{
listenAddr: NodeAddrOption{addr: defaultListenAddr}, listenAddr: NewListenAddrOption(),
} }
cmd := &cobra.Command{ cmd := &cobra.Command{
@ -34,7 +34,7 @@ func newJoinCommand(dockerCli *client.DockerCli) *cobra.Command {
} }
flags := cmd.Flags() flags := cmd.Flags()
flags.Var(&opts.listenAddr, "listen-addr", "Listen address") flags.Var(&opts.listenAddr, flagListenAddr, "Listen address")
flags.BoolVar(&opts.manager, "manager", false, "Try joining as a manager.") flags.BoolVar(&opts.manager, "manager", false, "Try joining as a manager.")
flags.StringVar(&opts.secret, "secret", "", "Secret for node acceptance") flags.StringVar(&opts.secret, "secret", "", "Secret for node acceptance")
flags.StringVar(&opts.CACertHash, "ca-hash", "", "Hash of the Root Certificate Authority certificate used for trusted join") flags.StringVar(&opts.CACertHash, "ca-hash", "", "Hash of the Root Certificate Authority certificate used for trusted join")

View file

@ -2,17 +2,27 @@ package swarm
import ( import (
"fmt" "fmt"
"net"
"strconv"
"strings" "strings"
"github.com/docker/engine-api/types/swarm" "github.com/docker/engine-api/types/swarm"
) )
const ( const (
defaultListenAddr = "0.0.0.0:2377" defaultListenAddr = "0.0.0.0"
defaultListenPort uint16 = 2377
// WORKER constant for worker name // WORKER constant for worker name
WORKER = "WORKER" WORKER = "WORKER"
// MANAGER constant for manager name // MANAGER constant for manager name
MANAGER = "MANAGER" MANAGER = "MANAGER"
flagAutoAccept = "auto-accept"
flagCertExpiry = "cert-expiry"
flagDispatcherHeartbeat = "dispatcher-heartbeat"
flagListenAddr = "listen-addr"
flagSecret = "secret"
flagTaskHistoryLimit = "task-history-limit"
) )
var ( var (
@ -25,26 +35,36 @@ var (
// NodeAddrOption is a pflag.Value for listen and remote addresses // NodeAddrOption is a pflag.Value for listen and remote addresses
type NodeAddrOption struct { type NodeAddrOption struct {
addr string addr string
port uint16
} }
// String prints the representation of this flag // String prints the representation of this flag
func (a *NodeAddrOption) String() string { func (a *NodeAddrOption) String() string {
return a.addr return a.Value()
} }
// Set the value for this flag // Set the value for this flag
func (a *NodeAddrOption) Set(value string) error { func (a *NodeAddrOption) Set(value string) error {
if !strings.Contains(value, ":") { if !strings.Contains(value, ":") {
return fmt.Errorf("Invalid url, a host and port are required")
}
parts := strings.Split(value, ":")
if len(parts) != 2 {
return fmt.Errorf("Invalid url, too many colons")
}
a.addr = value a.addr = value
return nil return nil
}
host, port, err := net.SplitHostPort(value)
if err != nil {
return fmt.Errorf("Invalid url, %v", err)
}
portInt, err := strconv.ParseUint(port, 10, 16)
if err != nil {
return fmt.Errorf("invalid url, %v", err)
}
a.port = uint16(portInt)
if host != "" {
a.addr = host
}
return nil
} }
// Type returns the type of this flag // Type returns the type of this flag
@ -52,9 +72,19 @@ func (a *NodeAddrOption) Type() string {
return "node-addr" return "node-addr"
} }
// Value returns the value of this option as addr:port
func (a *NodeAddrOption) Value() string {
return net.JoinHostPort(a.addr, strconv.Itoa(int(a.port)))
}
// NewNodeAddrOption returns a new node address option // NewNodeAddrOption returns a new node address option
func NewNodeAddrOption() NodeAddrOption { func NewNodeAddrOption(host string, port uint16) NodeAddrOption {
return NodeAddrOption{addr: defaultListenAddr} return NodeAddrOption{addr: host, port: port}
}
// NewListenAddrOption returns a NodeAddrOption with default values
func NewListenAddrOption() NodeAddrOption {
return NewNodeAddrOption(defaultListenAddr, defaultListenPort)
} }
// AutoAcceptOption is a value type for auto-accept policy // AutoAcceptOption is a value type for auto-accept policy
@ -65,10 +95,10 @@ type AutoAcceptOption struct {
// String prints a string representation of this option // String prints a string representation of this option
func (o *AutoAcceptOption) String() string { func (o *AutoAcceptOption) String() string {
keys := []string{} keys := []string{}
for key := range o.values { for key, value := range o.values {
keys = append(keys, key) keys = append(keys, fmt.Sprintf("%s=%v", strings.ToLower(key), value))
} }
return strings.Join(keys, " ") return strings.Join(keys, ", ")
} }
// Set sets a new value on this option // Set sets a new value on this option

View file

@ -0,0 +1,118 @@
package swarm
import (
"testing"
"github.com/docker/docker/pkg/testutil/assert"
"github.com/docker/engine-api/types/swarm"
)
func TestNodeAddrOptionSetHostAndPort(t *testing.T) {
opt := NewNodeAddrOption("old", 123)
addr := "newhost:5555"
assert.NilError(t, opt.Set(addr))
assert.Equal(t, opt.addr, "newhost")
assert.Equal(t, opt.port, uint16(5555))
assert.Equal(t, opt.Value(), addr)
}
func TestNodeAddrOptionSetHostOnly(t *testing.T) {
opt := NewListenAddrOption()
assert.NilError(t, opt.Set("newhost"))
assert.Equal(t, opt.addr, "newhost")
assert.Equal(t, opt.port, defaultListenPort)
}
func TestNodeAddrOptionSetPortOnly(t *testing.T) {
opt := NewListenAddrOption()
assert.NilError(t, opt.Set(":4545"))
assert.Equal(t, opt.addr, defaultListenAddr)
assert.Equal(t, opt.port, uint16(4545))
}
func TestNodeAddrOptionSetInvalidFormat(t *testing.T) {
opt := NewListenAddrOption()
assert.Error(t, opt.Set("http://localhost:4545"), "Invalid url")
}
func TestAutoAcceptOptionSetWorker(t *testing.T) {
opt := NewAutoAcceptOption()
assert.NilError(t, opt.Set("worker"))
assert.Equal(t, opt.values[WORKER], true)
}
func TestAutoAcceptOptionSetManager(t *testing.T) {
opt := NewAutoAcceptOption()
assert.NilError(t, opt.Set("manager"))
assert.Equal(t, opt.values[MANAGER], true)
}
func TestAutoAcceptOptionSetInvalid(t *testing.T) {
opt := NewAutoAcceptOption()
assert.Error(t, opt.Set("bogus"), "must be one of")
}
func TestAutoAcceptOptionSetNone(t *testing.T) {
opt := NewAutoAcceptOption()
assert.NilError(t, opt.Set("none"))
assert.Equal(t, opt.values[MANAGER], false)
assert.Equal(t, opt.values[WORKER], false)
}
func TestAutoAcceptOptionSetConflict(t *testing.T) {
opt := NewAutoAcceptOption()
assert.NilError(t, opt.Set("manager"))
assert.Error(t, opt.Set("none"), "value NONE is incompatible with MANAGER")
opt = NewAutoAcceptOption()
assert.NilError(t, opt.Set("none"))
assert.Error(t, opt.Set("worker"), "value NONE is incompatible with WORKER")
}
func TestAutoAcceptOptionPoliciesDefault(t *testing.T) {
opt := NewAutoAcceptOption()
secret := "thesecret"
policies := opt.Policies(&secret)
assert.Equal(t, len(policies), 2)
assert.Equal(t, policies[0], swarm.Policy{
Role: WORKER,
Autoaccept: true,
Secret: &secret,
})
assert.Equal(t, policies[1], swarm.Policy{
Role: MANAGER,
Autoaccept: false,
Secret: &secret,
})
}
func TestAutoAcceptOptionPoliciesWithManager(t *testing.T) {
opt := NewAutoAcceptOption()
secret := "thesecret"
assert.NilError(t, opt.Set("manager"))
policies := opt.Policies(&secret)
assert.Equal(t, len(policies), 2)
assert.Equal(t, policies[0], swarm.Policy{
Role: WORKER,
Autoaccept: false,
Secret: &secret,
})
assert.Equal(t, policies[1], swarm.Policy{
Role: MANAGER,
Autoaccept: true,
Secret: &secret,
})
}
func TestAutoAcceptOptionString(t *testing.T) {
opt := NewAutoAcceptOption()
assert.NilError(t, opt.Set("manager"))
assert.NilError(t, opt.Set("worker"))
repr := opt.String()
assert.Contains(t, repr, "worker=true")
assert.Contains(t, repr, "manager=true")
}