diff --git a/components/engine/api/types/client.go b/components/engine/api/types/client.go index 8cc9b05c0e..b4d6a3c017 100644 --- a/components/engine/api/types/client.go +++ b/components/engine/api/types/client.go @@ -275,6 +275,12 @@ type ServiceCreateResponse struct { ID string } +// Values for RegistryAuthFrom in ServiceUpdateOptions +const ( + RegistryAuthFromSpec = "spec" + RegistryAuthFromPreviousSpec = "previous-spec" +) + // ServiceUpdateOptions contains the options to be used for updating services. type ServiceUpdateOptions struct { // EncodedRegistryAuth is the encoded registry authorization credentials to @@ -286,6 +292,11 @@ type ServiceUpdateOptions struct { // TODO(stevvooe): Consider moving the version parameter of ServiceUpdate // into this field. While it does open API users up to racy writes, most // users may not need that level of consistency in practice. + + // RegistryAuthFrom specifies where to find the registry authorization + // credentials if they are not given in EncodedRegistryAuth. Valid + // values are "spec" and "previous-spec". + RegistryAuthFrom string } // ServiceListOptions holds parameters to list services with. diff --git a/components/engine/api/types/swarm/service.go b/components/engine/api/types/swarm/service.go index d5048013b2..c23f68327f 100644 --- a/components/engine/api/types/swarm/service.go +++ b/components/engine/api/types/swarm/service.go @@ -7,6 +7,7 @@ type Service struct { ID string Meta Spec ServiceSpec `json:",omitempty"` + PreviousSpec *ServiceSpec `json:",omitempty"` Endpoint Endpoint `json:",omitempty"` UpdateStatus UpdateStatus `json:",omitempty"` } @@ -71,7 +72,34 @@ const ( // UpdateConfig represents the update configuration. type UpdateConfig struct { - Parallelism uint64 `json:",omitempty"` - Delay time.Duration `json:",omitempty"` - FailureAction string `json:",omitempty"` + // Maximum number of tasks to be updated in one iteration. + // 0 means unlimited parallelism. + Parallelism uint64 `json:",omitempty"` + + // Amount of time between updates. + Delay time.Duration `json:",omitempty"` + + // FailureAction is the action to take when an update failures. + FailureAction string `json:",omitempty"` + + // Monitor indicates how long to monitor a task for failure after it is + // created. If the task fails by ending up in one of the states + // REJECTED, COMPLETED, or FAILED, within Monitor from its creation, + // this counts as a failure. If it fails after Monitor, it does not + // count as a failure. If Monitor is unspecified, a default value will + // be used. + Monitor time.Duration `json:",omitempty"` + + // AllowedFailureFraction is the fraction of tasks that may fail during + // an update before the failure action is invoked. Any task created by + // the current update which ends up in one of the states REJECTED, + // COMPLETED or FAILED within Monitor from its creation counts as a + // failure. The number of failures is divided by the number of tasks + // being updated, and if this fraction is greater than + // AllowedFailureFraction, the failure action is invoked. + // + // If the failure action is CONTINUE, there is no effect. + // If the failure action is PAUSE, no more tasks will be updated until + // another update is started. + AllowedFailureFraction float32 } diff --git a/components/engine/client/service_update.go b/components/engine/client/service_update.go index c5d07e8394..8e03f7f483 100644 --- a/components/engine/client/service_update.go +++ b/components/engine/client/service_update.go @@ -22,6 +22,10 @@ func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version } } + if options.RegistryAuthFrom != "" { + query.Set("registryAuthFrom", options.RegistryAuthFrom) + } + query.Set("version", strconv.FormatUint(version.Index, 10)) resp, err := cli.post(ctx, "/services/"+serviceID+"/update", query, service, headers)