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

     1  package service
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"reflect"
     7  
     8  	"github.com/docker/swarmkit/api"
     9  	"github.com/docker/swarmkit/cmd/swarmctl/common"
    10  	"github.com/docker/swarmkit/cmd/swarmctl/service/flagparser"
    11  	"github.com/spf13/cobra"
    12  )
    13  
    14  var (
    15  	updateCmd = &cobra.Command{
    16  		Use:   "update <service ID>",
    17  		Short: "Update a service",
    18  		RunE: func(cmd *cobra.Command, args []string) error {
    19  			if len(args) == 0 {
    20  				return errors.New("service ID missing")
    21  			}
    22  
    23  			if len(args) > 1 {
    24  				return errors.New("update command takes exactly 1 argument")
    25  			}
    26  
    27  			c, err := common.Dial(cmd)
    28  			if err != nil {
    29  				return err
    30  			}
    31  
    32  			service, err := getService(common.Context(cmd), c, args[0])
    33  			if err != nil {
    34  				return err
    35  			}
    36  
    37  			spec := service.Spec.Copy()
    38  
    39  			if err := flagparser.Merge(cmd, spec, c); err != nil {
    40  				return err
    41  			}
    42  
    43  			if err := flagparser.ParseAddSecret(cmd, spec, "add-secret"); err != nil {
    44  				return err
    45  			}
    46  			if err := flagparser.ParseRemoveSecret(cmd, spec, "rm-secret"); err != nil {
    47  				return err
    48  			}
    49  
    50  			if err := flagparser.ParseAddConfig(cmd, spec, "add-config"); err != nil {
    51  				return err
    52  			}
    53  			if err := flagparser.ParseRemoveConfig(cmd, spec, "rm-config"); err != nil {
    54  				return err
    55  			}
    56  
    57  			if err := flagparser.ParseAddCapability(cmd, spec, "add-capability"); err != nil {
    58  				return err
    59  			}
    60  			if err := flagparser.ParseDropCapability(cmd, spec, "rm-capability"); err != nil {
    61  				return err
    62  			}
    63  
    64  			if reflect.DeepEqual(spec, &service.Spec) {
    65  				return errors.New("no changes detected")
    66  			}
    67  
    68  			r, err := c.UpdateService(common.Context(cmd), &api.UpdateServiceRequest{
    69  				ServiceID:      service.ID,
    70  				ServiceVersion: &service.Meta.Version,
    71  				Spec:           spec,
    72  			})
    73  			if err != nil {
    74  				return err
    75  			}
    76  			fmt.Println(r.Service.ID)
    77  			return nil
    78  		},
    79  	}
    80  )
    81  
    82  func init() {
    83  	updateCmd.Flags().StringSlice("add-secret", nil, "add a new secret to the service")
    84  	updateCmd.Flags().StringSlice("rm-secret", nil, "remove a secret from the service")
    85  	updateCmd.Flags().StringSlice("add-config", nil, "add a new config to the service")
    86  	updateCmd.Flags().StringSlice("rm-config", nil, "remove a config from the service")
    87  	updateCmd.Flags().StringSlice("add-capability", nil, "add a new capability to the service")
    88  	updateCmd.Flags().StringSlice("rm-capability", nil, "remove a capability from the service")
    89  	updateCmd.Flags().Bool("force", false, "force tasks to restart even if nothing has changed")
    90  	flagparser.AddServiceFlags(updateCmd.Flags())
    91  }