github.com/ssdev-go/moby@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  }