in swarm. Also, fix some CLI command confusions: 1. If the --external-ca flag is provided, require a --ca-cert flag as well, otherwise the external CA is set but the CA certificate is actually rotated to an internal cert 2. If a --ca-cert flag is provided, require a --ca-key or --external-ca flag be provided as well, otherwise either the server will say that the request is invalid, or if there was previously an external CA corresponding to the cert, it will succeed. While that works, it's better to require the user to explicitly set all the parameters of the new desired root CA. This also changes the `swarm update` function to set the external CA's CACert field, which while not strictly necessary, makes the CA list more explicit. Signed-off-by: Ying Li <ying.li@docker.com>
72 lines
1.7 KiB
Go
72 lines
1.7 KiB
Go
package swarm
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"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"
|
|
)
|
|
|
|
func newUpdateCommand(dockerCli command.Cli) *cobra.Command {
|
|
opts := swarmOptions{}
|
|
|
|
cmd := &cobra.Command{
|
|
Use: "update [OPTIONS]",
|
|
Short: "Update the swarm",
|
|
Args: cli.NoArgs,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
return runUpdate(dockerCli, cmd.Flags(), opts)
|
|
},
|
|
PreRunE: func(cmd *cobra.Command, args []string) error {
|
|
if cmd.Flags().NFlag() == 0 {
|
|
return pflag.ErrHelp
|
|
}
|
|
return nil
|
|
},
|
|
}
|
|
|
|
cmd.Flags().BoolVar(&opts.autolock, flagAutolock, false, "Change manager autolocking setting (true|false)")
|
|
addSwarmFlags(cmd.Flags(), &opts)
|
|
return cmd
|
|
}
|
|
|
|
func runUpdate(dockerCli command.Cli, flags *pflag.FlagSet, opts swarmOptions) error {
|
|
client := dockerCli.Client()
|
|
ctx := context.Background()
|
|
|
|
var updateFlags swarm.UpdateFlags
|
|
|
|
swarmInspect, err := client.SwarmInspect(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
prevAutoLock := swarmInspect.Spec.EncryptionConfig.AutoLockManagers
|
|
|
|
opts.mergeSwarmSpec(&swarmInspect.Spec, flags, swarmInspect.ClusterInfo.TLSInfo.TrustRoot)
|
|
|
|
curAutoLock := swarmInspect.Spec.EncryptionConfig.AutoLockManagers
|
|
|
|
err = client.SwarmUpdate(ctx, swarmInspect.Version, swarmInspect.Spec, updateFlags)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
fmt.Fprintln(dockerCli.Out(), "Swarm updated.")
|
|
|
|
if curAutoLock && !prevAutoLock {
|
|
unlockKeyResp, err := client.SwarmGetUnlockKey(ctx)
|
|
if err != nil {
|
|
return errors.Wrap(err, "could not fetch unlock key")
|
|
}
|
|
printUnlockCommand(dockerCli.Out(), unlockKeyResp.UnlockKey)
|
|
}
|
|
|
|
return nil
|
|
}
|