mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Support a listen addr without a port, and add tests.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
(cherry picked from commit 595e79b805
)
This commit is contained in:
parent
6b2cd6e843
commit
e090e2dbd4
4 changed files with 81 additions and 16 deletions
|
@ -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(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,10 +35,10 @@ 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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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,36 +35,56 @@ 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
|
||||||
func (a *NodeAddrOption) Type() string {
|
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
|
||||||
|
|
35
api/client/swarm/opts_test.go
Normal file
35
api/client/swarm/opts_test.go
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
package swarm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/docker/docker/pkg/testutil/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
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")
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue