This flag was added in Docker 17.06, API version 1.31 through
moby@8dc8cd4719f165c01c98e7d3ce1d6cea6a8f60b8, but didn't add
API-version annotations.
This patch adds the missing annotations to hide this flag if
the CLI is connected to an older version of the daemon that
doesn't support that API.
Before this patch:
DOCKER_API_VERSION=1.30 docker swarm init --help | grep data-path-addr
--data-path-addr string Address or interface to use for data path traffic (format: <ip|interface>)
DOCKER_API_VERSION=1.31 docker swarm init --help | grep data-path-addr
--data-path-addr string Address or interface to use for data path traffic (format: <ip|interface>)
With this patch applied:
DOCKER_API_VERSION=1.30 docker swarm init --help | grep data-path-addr
# (no result)
DOCKER_API_VERSION=1.31 docker swarm init --help | grep data-path-addr
--data-path-addr string Address or interface to use for data path traffic (format: <ip|interface>)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
89 lines
2.6 KiB
Go
89 lines
2.6 KiB
Go
package swarm
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/docker/cli/cli"
|
|
"github.com/docker/cli/cli/command"
|
|
"github.com/docker/docker/api/types/swarm"
|
|
"github.com/pkg/errors"
|
|
"github.com/spf13/cobra"
|
|
"github.com/spf13/pflag"
|
|
)
|
|
|
|
type joinOptions struct {
|
|
remote string
|
|
listenAddr NodeAddrOption
|
|
// Not a NodeAddrOption because it has no default port.
|
|
advertiseAddr string
|
|
dataPathAddr string
|
|
token string
|
|
availability string
|
|
}
|
|
|
|
func newJoinCommand(dockerCli command.Cli) *cobra.Command {
|
|
opts := joinOptions{
|
|
listenAddr: NewListenAddrOption(),
|
|
}
|
|
|
|
cmd := &cobra.Command{
|
|
Use: "join [OPTIONS] HOST:PORT",
|
|
Short: "Join a swarm as a node and/or manager",
|
|
Args: cli.ExactArgs(1),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
opts.remote = args[0]
|
|
return runJoin(dockerCli, cmd.Flags(), opts)
|
|
},
|
|
}
|
|
|
|
flags := cmd.Flags()
|
|
flags.Var(&opts.listenAddr, flagListenAddr, "Listen address (format: <ip|interface>[:port])")
|
|
flags.StringVar(&opts.advertiseAddr, flagAdvertiseAddr, "", "Advertised address (format: <ip|interface>[:port])")
|
|
flags.StringVar(&opts.dataPathAddr, flagDataPathAddr, "", "Address or interface to use for data path traffic (format: <ip|interface>)")
|
|
flags.SetAnnotation(flagDataPathAddr, "version", []string{"1.31"})
|
|
flags.StringVar(&opts.token, flagToken, "", "Token for entry into the swarm")
|
|
flags.StringVar(&opts.availability, flagAvailability, "active", `Availability of the node ("active"|"pause"|"drain")`)
|
|
return cmd
|
|
}
|
|
|
|
func runJoin(dockerCli command.Cli, flags *pflag.FlagSet, opts joinOptions) error {
|
|
client := dockerCli.Client()
|
|
ctx := context.Background()
|
|
|
|
req := swarm.JoinRequest{
|
|
JoinToken: opts.token,
|
|
ListenAddr: opts.listenAddr.String(),
|
|
AdvertiseAddr: opts.advertiseAddr,
|
|
DataPathAddr: opts.dataPathAddr,
|
|
RemoteAddrs: []string{opts.remote},
|
|
}
|
|
if flags.Changed(flagAvailability) {
|
|
availability := swarm.NodeAvailability(strings.ToLower(opts.availability))
|
|
switch availability {
|
|
case swarm.NodeAvailabilityActive, swarm.NodeAvailabilityPause, swarm.NodeAvailabilityDrain:
|
|
req.Availability = availability
|
|
default:
|
|
return errors.Errorf("invalid availability %q, only active, pause and drain are supported", opts.availability)
|
|
}
|
|
}
|
|
|
|
err := client.SwarmJoin(ctx, req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
info, err := client.Info(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if info.Swarm.ControlAvailable {
|
|
fmt.Fprintln(dockerCli.Out(), "This node joined a swarm as a manager.")
|
|
} else {
|
|
fmt.Fprintln(dockerCli.Out(), "This node joined a swarm as a worker.")
|
|
}
|
|
return nil
|
|
}
|