service_update.go 2.6 KB

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