github.com/kobeld/docker@v1.12.0-rc1/api/client/swarm/update.go (about)

     1  package swarm
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"golang.org/x/net/context"
     8  
     9  	"github.com/docker/docker/api/client"
    10  	"github.com/docker/docker/cli"
    11  	"github.com/docker/engine-api/types/swarm"
    12  	"github.com/spf13/cobra"
    13  	"github.com/spf13/pflag"
    14  )
    15  
    16  type updateOptions struct {
    17  	autoAccept          AutoAcceptOption
    18  	secret              string
    19  	taskHistoryLimit    int64
    20  	dispatcherHeartbeat time.Duration
    21  }
    22  
    23  func newUpdateCommand(dockerCli *client.DockerCli) *cobra.Command {
    24  	opts := updateOptions{autoAccept: NewAutoAcceptOption()}
    25  	var flags *pflag.FlagSet
    26  
    27  	cmd := &cobra.Command{
    28  		Use:   "update",
    29  		Short: "update the Swarm.",
    30  		Args:  cli.NoArgs,
    31  		RunE: func(cmd *cobra.Command, args []string) error {
    32  			return runUpdate(dockerCli, flags, opts)
    33  		},
    34  	}
    35  
    36  	flags = cmd.Flags()
    37  	flags.Var(&opts.autoAccept, "auto-accept", "Auto acceptance policy (worker, manager or none)")
    38  	flags.StringVar(&opts.secret, "secret", "", "Set secret value needed to accept nodes into cluster")
    39  	flags.Int64Var(&opts.taskHistoryLimit, "task-history-limit", 10, "Task history retention limit")
    40  	flags.DurationVar(&opts.dispatcherHeartbeat, "dispatcher-heartbeat", time.Duration(5*time.Second), "Dispatcher heartbeat period")
    41  	return cmd
    42  }
    43  
    44  func runUpdate(dockerCli *client.DockerCli, flags *pflag.FlagSet, opts updateOptions) error {
    45  	client := dockerCli.Client()
    46  	ctx := context.Background()
    47  
    48  	swarm, err := client.SwarmInspect(ctx)
    49  	if err != nil {
    50  		return err
    51  	}
    52  
    53  	err = mergeSwarm(&swarm, flags)
    54  	if err != nil {
    55  		return err
    56  	}
    57  	err = client.SwarmUpdate(ctx, swarm.Version, swarm.Spec)
    58  	if err != nil {
    59  		return err
    60  	}
    61  
    62  	fmt.Println("Swarm updated.")
    63  	return nil
    64  }
    65  
    66  func mergeSwarm(swarm *swarm.Swarm, flags *pflag.FlagSet) error {
    67  	spec := &swarm.Spec
    68  
    69  	if flags.Changed("auto-accept") {
    70  		value := flags.Lookup("auto-accept").Value.(*AutoAcceptOption)
    71  		if len(spec.AcceptancePolicy.Policies) > 0 {
    72  			spec.AcceptancePolicy.Policies = value.Policies(spec.AcceptancePolicy.Policies[0].Secret)
    73  		} else {
    74  			spec.AcceptancePolicy.Policies = value.Policies("")
    75  		}
    76  	}
    77  
    78  	if flags.Changed("secret") {
    79  		secret, _ := flags.GetString("secret")
    80  		for _, policy := range spec.AcceptancePolicy.Policies {
    81  			policy.Secret = secret
    82  		}
    83  	}
    84  
    85  	if flags.Changed("task-history-limit") {
    86  		spec.Orchestration.TaskHistoryRetentionLimit, _ = flags.GetInt64("task-history-limit")
    87  	}
    88  
    89  	if flags.Changed("dispatcher-heartbeat") {
    90  		if v, err := flags.GetDuration("dispatcher-heartbeat"); err == nil {
    91  			spec.Dispatcher.HeartbeatPeriod = uint64(v.Nanoseconds())
    92  		}
    93  	}
    94  
    95  	return nil
    96  }