github.com/adityamillind98/moby@v23.0.0-rc.4+incompatible/client/service_update.go (about) 1 package client // import "github.com/docker/docker/client" 2 3 import ( 4 "context" 5 "encoding/json" 6 "net/url" 7 8 "github.com/docker/docker/api/types" 9 "github.com/docker/docker/api/types/swarm" 10 ) 11 12 // ServiceUpdate updates a Service. The version number is required to avoid conflicting writes. 13 // It should be the value as set *before* the update. You can find this value in the Meta field 14 // of swarm.Service, which can be found using ServiceInspectWithRaw. 15 func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (types.ServiceUpdateResponse, error) { 16 var ( 17 query = url.Values{} 18 response = types.ServiceUpdateResponse{} 19 ) 20 21 headers := map[string][]string{ 22 "version": {cli.version}, 23 } 24 25 if options.EncodedRegistryAuth != "" { 26 headers["X-Registry-Auth"] = []string{options.EncodedRegistryAuth} 27 } 28 29 if options.RegistryAuthFrom != "" { 30 query.Set("registryAuthFrom", options.RegistryAuthFrom) 31 } 32 33 if options.Rollback != "" { 34 query.Set("rollback", options.Rollback) 35 } 36 37 query.Set("version", version.String()) 38 39 if err := validateServiceSpec(service); err != nil { 40 return response, err 41 } 42 43 // ensure that the image is tagged 44 var resolveWarning string 45 switch { 46 case service.TaskTemplate.ContainerSpec != nil: 47 if taggedImg := imageWithTagString(service.TaskTemplate.ContainerSpec.Image); taggedImg != "" { 48 service.TaskTemplate.ContainerSpec.Image = taggedImg 49 } 50 if options.QueryRegistry { 51 resolveWarning = resolveContainerSpecImage(ctx, cli, &service.TaskTemplate, options.EncodedRegistryAuth) 52 } 53 case service.TaskTemplate.PluginSpec != nil: 54 if taggedImg := imageWithTagString(service.TaskTemplate.PluginSpec.Remote); taggedImg != "" { 55 service.TaskTemplate.PluginSpec.Remote = taggedImg 56 } 57 if options.QueryRegistry { 58 resolveWarning = resolvePluginSpecRemote(ctx, cli, &service.TaskTemplate, options.EncodedRegistryAuth) 59 } 60 } 61 62 resp, err := cli.post(ctx, "/services/"+serviceID+"/update", query, service, headers) 63 defer ensureReaderClosed(resp) 64 if err != nil { 65 return response, err 66 } 67 68 err = json.NewDecoder(resp.body).Decode(&response) 69 if resolveWarning != "" { 70 response.Warnings = append(response.Warnings, resolveWarning) 71 } 72 73 return response, err 74 }