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  }