github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/swarmkit/cmd/swarmctl/cluster/update.go (about)

     1  package cluster
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"strings"
     7  	"time"
     8  
     9  	"github.com/docker/swarmkit/api"
    10  	"github.com/docker/swarmkit/cli"
    11  	"github.com/docker/swarmkit/cmd/swarmctl/common"
    12  	gogotypes "github.com/gogo/protobuf/types"
    13  	"github.com/spf13/cobra"
    14  )
    15  
    16  var (
    17  	externalCAOpt cli.ExternalCAOpt
    18  
    19  	updateCmd = &cobra.Command{
    20  		Use:   "update <cluster name>",
    21  		Short: "Update a cluster",
    22  		RunE: func(cmd *cobra.Command, args []string) error {
    23  			if len(args) == 0 {
    24  				return errors.New("cluster name missing")
    25  			}
    26  
    27  			if len(args) > 1 {
    28  				return errors.New("update command takes exactly 1 argument")
    29  			}
    30  
    31  			c, err := common.Dial(cmd)
    32  			if err != nil {
    33  				return err
    34  			}
    35  
    36  			cluster, err := getCluster(common.Context(cmd), c, args[0])
    37  			if err != nil {
    38  				return err
    39  			}
    40  
    41  			flags := cmd.Flags()
    42  			spec := &cluster.Spec
    43  			var rotation api.KeyRotation
    44  
    45  			if flags.Changed("certexpiry") {
    46  				cePeriod, err := flags.GetDuration("certexpiry")
    47  				if err != nil {
    48  					return err
    49  				}
    50  				ceProtoPeriod := gogotypes.DurationProto(cePeriod)
    51  				spec.CAConfig.NodeCertExpiry = ceProtoPeriod
    52  			}
    53  			if flags.Changed("external-ca") {
    54  				spec.CAConfig.ExternalCAs = externalCAOpt.Value()
    55  			}
    56  			if flags.Changed("taskhistory") {
    57  				taskHistory, err := flags.GetInt64("taskhistory")
    58  				if err != nil {
    59  					return err
    60  				}
    61  				spec.Orchestration.TaskHistoryRetentionLimit = taskHistory
    62  			}
    63  			if flags.Changed("heartbeatperiod") {
    64  				hbPeriod, err := flags.GetDuration("heartbeatperiod")
    65  				if err != nil {
    66  					return err
    67  				}
    68  				spec.Dispatcher.HeartbeatPeriod = gogotypes.DurationProto(hbPeriod)
    69  			}
    70  			if flags.Changed("rotate-join-token") {
    71  				rotateJoinToken, err := flags.GetString("rotate-join-token")
    72  				if err != nil {
    73  					return err
    74  				}
    75  				rotateJoinToken = strings.ToLower(rotateJoinToken)
    76  
    77  				switch rotateJoinToken {
    78  				case "worker":
    79  					rotation.WorkerJoinToken = true
    80  				case "manager":
    81  					rotation.ManagerJoinToken = true
    82  				default:
    83  					return errors.New("--rotate-join-token flag must be followed by 'worker' or 'manager'")
    84  				}
    85  			}
    86  			if flags.Changed("autolock") {
    87  				spec.EncryptionConfig.AutoLockManagers, err = flags.GetBool("autolock")
    88  				if err != nil {
    89  					return err
    90  				}
    91  			}
    92  			rotateUnlockKey, err := flags.GetBool("rotate-unlock-key")
    93  			if err != nil {
    94  				return err
    95  			}
    96  			rotation.ManagerUnlockKey = rotateUnlockKey
    97  
    98  			driver, err := common.ParseLogDriverFlags(flags)
    99  			if err != nil {
   100  				return err
   101  			}
   102  			spec.TaskDefaults.LogDriver = driver
   103  
   104  			r, err := c.UpdateCluster(common.Context(cmd), &api.UpdateClusterRequest{
   105  				ClusterID:      cluster.ID,
   106  				ClusterVersion: &cluster.Meta.Version,
   107  				Spec:           spec,
   108  				Rotation:       rotation,
   109  			})
   110  			if err != nil {
   111  				return err
   112  			}
   113  			fmt.Println(r.Cluster.ID)
   114  
   115  			if rotation.ManagerUnlockKey {
   116  				return displayUnlockKey(cmd)
   117  			}
   118  			return nil
   119  		},
   120  	}
   121  )
   122  
   123  func init() {
   124  	updateCmd.Flags().Int64("taskhistory", 0, "Number of historic task entries to retain per slot or node")
   125  	updateCmd.Flags().Duration("certexpiry", 24*30*3*time.Hour, "Duration node certificates will be valid for")
   126  	updateCmd.Flags().Var(&externalCAOpt, "external-ca", "Specifications of one or more certificate signing endpoints")
   127  	updateCmd.Flags().Duration("heartbeatperiod", 0, "Period when heartbeat is expected to receive from agent")
   128  
   129  	updateCmd.Flags().String("log-driver", "", "Set default log driver for cluster")
   130  	updateCmd.Flags().StringSlice("log-opt", nil, "Set options for default log driver")
   131  	updateCmd.Flags().String("rotate-join-token", "", "Rotate join token for worker or manager")
   132  	updateCmd.Flags().Bool("rotate-unlock-key", false, "Rotate manager unlock key")
   133  	updateCmd.Flags().Bool("autolock", false, "Enable or disable manager autolocking (requiring an unlock key to start a stopped manager)")
   134  }