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 }