github.com/sams1990/dockerrepo@v17.12.1-ce-rc2+incompatible/client/service_update.go (about) 1 package client 2 3 import ( 4 "encoding/json" 5 "net/url" 6 "strconv" 7 8 "github.com/docker/docker/api/types" 9 "github.com/docker/docker/api/types/swarm" 10 "golang.org/x/net/context" 11 ) 12 13 // ServiceUpdate updates a Service. 14 func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (types.ServiceUpdateResponse, error) { 15 var ( 16 query = url.Values{} 17 distErr error 18 ) 19 20 headers := map[string][]string{ 21 "version": {cli.version}, 22 } 23 24 if options.EncodedRegistryAuth != "" { 25 headers["X-Registry-Auth"] = []string{options.EncodedRegistryAuth} 26 } 27 28 if options.RegistryAuthFrom != "" { 29 query.Set("registryAuthFrom", options.RegistryAuthFrom) 30 } 31 32 if options.Rollback != "" { 33 query.Set("rollback", options.Rollback) 34 } 35 36 query.Set("version", strconv.FormatUint(version.Index, 10)) 37 38 if err := validateServiceSpec(service); err != nil { 39 return types.ServiceUpdateResponse{}, err 40 } 41 42 var imgPlatforms []swarm.Platform 43 // ensure that the image is tagged 44 if service.TaskTemplate.ContainerSpec != nil { 45 if taggedImg := imageWithTagString(service.TaskTemplate.ContainerSpec.Image); taggedImg != "" { 46 service.TaskTemplate.ContainerSpec.Image = taggedImg 47 } 48 if options.QueryRegistry { 49 var img string 50 img, imgPlatforms, distErr = imageDigestAndPlatforms(ctx, cli, service.TaskTemplate.ContainerSpec.Image, options.EncodedRegistryAuth) 51 if img != "" { 52 service.TaskTemplate.ContainerSpec.Image = img 53 } 54 } 55 } 56 57 // ensure that the image is tagged 58 if service.TaskTemplate.PluginSpec != nil { 59 if taggedImg := imageWithTagString(service.TaskTemplate.PluginSpec.Remote); taggedImg != "" { 60 service.TaskTemplate.PluginSpec.Remote = taggedImg 61 } 62 if options.QueryRegistry { 63 var img string 64 img, imgPlatforms, distErr = imageDigestAndPlatforms(ctx, cli, service.TaskTemplate.PluginSpec.Remote, options.EncodedRegistryAuth) 65 if img != "" { 66 service.TaskTemplate.PluginSpec.Remote = img 67 } 68 } 69 } 70 71 if service.TaskTemplate.Placement == nil && len(imgPlatforms) > 0 { 72 service.TaskTemplate.Placement = &swarm.Placement{} 73 } 74 if len(imgPlatforms) > 0 { 75 service.TaskTemplate.Placement.Platforms = imgPlatforms 76 } 77 78 var response types.ServiceUpdateResponse 79 resp, err := cli.post(ctx, "/services/"+serviceID+"/update", query, service, headers) 80 if err != nil { 81 return response, err 82 } 83 84 err = json.NewDecoder(resp.body).Decode(&response) 85 86 if distErr != nil { 87 response.Warnings = append(response.Warnings, digestWarning(service.TaskTemplate.ContainerSpec.Image)) 88 } 89 90 ensureReaderClosed(resp) 91 return response, err 92 }