github.com/zhuohuang-hust/src-cbuild@v0.0.0-20230105071821-c7aab3e7c840/cli/command/swarm/update.go (about)

     1  package swarm
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"golang.org/x/net/context"
     7  
     8  	"github.com/docker/docker/api/types/swarm"
     9  	"github.com/docker/docker/cli"
    10  	"github.com/docker/docker/cli/command"
    11  	"github.com/pkg/errors"
    12  	"github.com/spf13/cobra"
    13  	"github.com/spf13/pflag"
    14  )
    15  
    16  func newUpdateCommand(dockerCli *command.DockerCli) *cobra.Command {
    17  	opts := swarmOptions{}
    18  
    19  	cmd := &cobra.Command{
    20  		Use:   "update [OPTIONS]",
    21  		Short: "Update the swarm",
    22  		Args:  cli.NoArgs,
    23  		RunE: func(cmd *cobra.Command, args []string) error {
    24  			return runUpdate(dockerCli, cmd.Flags(), opts)
    25  		},
    26  	}
    27  
    28  	cmd.Flags().BoolVar(&opts.autolock, flagAutolock, false, "Change manager autolocking setting (true|false)")
    29  	addSwarmFlags(cmd.Flags(), &opts)
    30  	return cmd
    31  }
    32  
    33  func runUpdate(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts swarmOptions) error {
    34  	client := dockerCli.Client()
    35  	ctx := context.Background()
    36  
    37  	var updateFlags swarm.UpdateFlags
    38  
    39  	swarm, err := client.SwarmInspect(ctx)
    40  	if err != nil {
    41  		return err
    42  	}
    43  
    44  	prevAutoLock := swarm.Spec.EncryptionConfig.AutoLockManagers
    45  
    46  	opts.mergeSwarmSpec(&swarm.Spec, flags)
    47  
    48  	curAutoLock := swarm.Spec.EncryptionConfig.AutoLockManagers
    49  
    50  	err = client.SwarmUpdate(ctx, swarm.Version, swarm.Spec, updateFlags)
    51  	if err != nil {
    52  		return err
    53  	}
    54  
    55  	fmt.Fprintln(dockerCli.Out(), "Swarm updated.")
    56  
    57  	if curAutoLock && !prevAutoLock {
    58  		unlockKeyResp, err := client.SwarmGetUnlockKey(ctx)
    59  		if err != nil {
    60  			return errors.Wrap(err, "could not fetch unlock key")
    61  		}
    62  		printUnlockCommand(ctx, dockerCli, unlockKeyResp.UnlockKey)
    63  	}
    64  
    65  	return nil
    66  }