1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

Merge pull request #24943 from aaronlehmann/rolling-updates

Add failure action for rolling updates
This commit is contained in:
Tibor Vass 2016-07-25 10:15:28 -07:00 committed by GitHub
commit c65925f24b
13 changed files with 205 additions and 113 deletions

View file

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"io" "io"
"strings" "strings"
"time"
"golang.org/x/net/context" "golang.org/x/net/context"
@ -101,6 +102,17 @@ func printService(out io.Writer, service swarm.Service) {
fmt.Fprintf(out, " Replicas:\t%d\n", *service.Spec.Mode.Replicated.Replicas) fmt.Fprintf(out, " Replicas:\t%d\n", *service.Spec.Mode.Replicated.Replicas)
} }
} }
if service.UpdateStatus.State != "" {
fmt.Fprintln(out, "Update status:")
fmt.Fprintf(out, " State:\t\t%s\n", service.UpdateStatus.State)
fmt.Fprintf(out, " Started:\t%s ago\n", strings.ToLower(units.HumanDuration(time.Since(service.UpdateStatus.StartedAt))))
if service.UpdateStatus.State == swarm.UpdateStateCompleted {
fmt.Fprintf(out, " Completed:\t%s ago\n", strings.ToLower(units.HumanDuration(time.Since(service.UpdateStatus.CompletedAt))))
}
fmt.Fprintf(out, " Message:\t%s\n", service.UpdateStatus.Message)
}
fmt.Fprintln(out, "Placement:") fmt.Fprintln(out, "Placement:")
if service.Spec.TaskTemplate.Placement != nil && len(service.Spec.TaskTemplate.Placement.Constraints) > 0 { if service.Spec.TaskTemplate.Placement != nil && len(service.Spec.TaskTemplate.Placement.Constraints) > 0 {
ioutils.FprintfIfNotEmpty(out, " Constraints\t: %s\n", strings.Join(service.Spec.TaskTemplate.Placement.Constraints, ", ")) ioutils.FprintfIfNotEmpty(out, " Constraints\t: %s\n", strings.Join(service.Spec.TaskTemplate.Placement.Constraints, ", "))
@ -110,6 +122,7 @@ func printService(out io.Writer, service swarm.Service) {
if service.Spec.UpdateConfig.Delay.Nanoseconds() > 0 { if service.Spec.UpdateConfig.Delay.Nanoseconds() > 0 {
fmt.Fprintf(out, " Delay:\t\t%s\n", service.Spec.UpdateConfig.Delay) fmt.Fprintf(out, " Delay:\t\t%s\n", service.Spec.UpdateConfig.Delay)
} }
fmt.Fprintf(out, " On failure:\t%s\n", service.Spec.UpdateConfig.FailureAction)
fmt.Fprintf(out, "ContainerSpec:\n") fmt.Fprintf(out, "ContainerSpec:\n")
printContainerSpec(out, service.Spec.TaskTemplate.ContainerSpec) printContainerSpec(out, service.Spec.TaskTemplate.ContainerSpec)

View file

@ -274,6 +274,7 @@ func (m *MountOpt) Value() []swarm.Mount {
type updateOptions struct { type updateOptions struct {
parallelism uint64 parallelism uint64
delay time.Duration delay time.Duration
onFailure string
} }
type resourceOptions struct { type resourceOptions struct {
@ -455,8 +456,9 @@ func (opts *serviceOptions) ToService() (swarm.ServiceSpec, error) {
}, },
Mode: swarm.ServiceMode{}, Mode: swarm.ServiceMode{},
UpdateConfig: &swarm.UpdateConfig{ UpdateConfig: &swarm.UpdateConfig{
Parallelism: opts.update.parallelism, Parallelism: opts.update.parallelism,
Delay: opts.update.delay, Delay: opts.update.delay,
FailureAction: opts.update.onFailure,
}, },
Networks: convertNetworks(opts.networks), Networks: convertNetworks(opts.networks),
EndpointSpec: opts.endpoint.ToEndpointSpec(), EndpointSpec: opts.endpoint.ToEndpointSpec(),
@ -503,6 +505,7 @@ func addServiceFlags(cmd *cobra.Command, opts *serviceOptions) {
flags.Uint64Var(&opts.update.parallelism, flagUpdateParallelism, 1, "Maximum number of tasks updated simultaneously (0 to update all at once)") flags.Uint64Var(&opts.update.parallelism, flagUpdateParallelism, 1, "Maximum number of tasks updated simultaneously (0 to update all at once)")
flags.DurationVar(&opts.update.delay, flagUpdateDelay, time.Duration(0), "Delay between updates") flags.DurationVar(&opts.update.delay, flagUpdateDelay, time.Duration(0), "Delay between updates")
flags.StringVar(&opts.update.onFailure, flagUpdateFailureAction, "pause", "Action on update failure (pause|continue)")
flags.StringVar(&opts.endpoint.mode, flagEndpointMode, "", "Endpoint mode (vip or dnsrr)") flags.StringVar(&opts.endpoint.mode, flagEndpointMode, "", "Endpoint mode (vip or dnsrr)")
@ -513,41 +516,42 @@ func addServiceFlags(cmd *cobra.Command, opts *serviceOptions) {
} }
const ( const (
flagConstraint = "constraint" flagConstraint = "constraint"
flagConstraintRemove = "constraint-rm" flagConstraintRemove = "constraint-rm"
flagConstraintAdd = "constraint-add" flagConstraintAdd = "constraint-add"
flagEndpointMode = "endpoint-mode" flagEndpointMode = "endpoint-mode"
flagEnv = "env" flagEnv = "env"
flagEnvRemove = "env-rm" flagEnvRemove = "env-rm"
flagEnvAdd = "env-add" flagEnvAdd = "env-add"
flagLabel = "label" flagLabel = "label"
flagLabelRemove = "label-rm" flagLabelRemove = "label-rm"
flagLabelAdd = "label-add" flagLabelAdd = "label-add"
flagLimitCPU = "limit-cpu" flagLimitCPU = "limit-cpu"
flagLimitMemory = "limit-memory" flagLimitMemory = "limit-memory"
flagMode = "mode" flagMode = "mode"
flagMount = "mount" flagMount = "mount"
flagMountRemove = "mount-rm" flagMountRemove = "mount-rm"
flagMountAdd = "mount-add" flagMountAdd = "mount-add"
flagName = "name" flagName = "name"
flagNetwork = "network" flagNetwork = "network"
flagNetworkRemove = "network-rm" flagNetworkRemove = "network-rm"
flagNetworkAdd = "network-add" flagNetworkAdd = "network-add"
flagPublish = "publish" flagPublish = "publish"
flagPublishRemove = "publish-rm" flagPublishRemove = "publish-rm"
flagPublishAdd = "publish-add" flagPublishAdd = "publish-add"
flagReplicas = "replicas" flagReplicas = "replicas"
flagReserveCPU = "reserve-cpu" flagReserveCPU = "reserve-cpu"
flagReserveMemory = "reserve-memory" flagReserveMemory = "reserve-memory"
flagRestartCondition = "restart-condition" flagRestartCondition = "restart-condition"
flagRestartDelay = "restart-delay" flagRestartDelay = "restart-delay"
flagRestartMaxAttempts = "restart-max-attempts" flagRestartMaxAttempts = "restart-max-attempts"
flagRestartWindow = "restart-window" flagRestartWindow = "restart-window"
flagStopGracePeriod = "stop-grace-period" flagStopGracePeriod = "stop-grace-period"
flagUpdateDelay = "update-delay" flagUpdateDelay = "update-delay"
flagUpdateParallelism = "update-parallelism" flagUpdateFailureAction = "update-failure-action"
flagUser = "user" flagUpdateParallelism = "update-parallelism"
flagRegistryAuth = "with-registry-auth" flagUser = "user"
flagLogDriver = "log-driver" flagRegistryAuth = "with-registry-auth"
flagLogOpt = "log-opt" flagLogDriver = "log-driver"
flagLogOpt = "log-opt"
) )

View file

@ -191,12 +191,13 @@ func updateService(flags *pflag.FlagSet, spec *swarm.ServiceSpec) error {
return err return err
} }
if anyChanged(flags, flagUpdateParallelism, flagUpdateDelay) { if anyChanged(flags, flagUpdateParallelism, flagUpdateDelay, flagUpdateFailureAction) {
if spec.UpdateConfig == nil { if spec.UpdateConfig == nil {
spec.UpdateConfig = &swarm.UpdateConfig{} spec.UpdateConfig = &swarm.UpdateConfig{}
} }
updateUint64(flagUpdateParallelism, &spec.UpdateConfig.Parallelism) updateUint64(flagUpdateParallelism, &spec.UpdateConfig.Parallelism)
updateDuration(flagUpdateDelay, &spec.UpdateConfig.Delay) updateDuration(flagUpdateDelay, &spec.UpdateConfig.Delay)
updateString(flagUpdateFailureAction, &spec.UpdateConfig.FailureAction)
} }
updateNetworks(flags, &spec.Networks) updateNetworks(flags, &spec.Networks)

View file

@ -1726,6 +1726,7 @@ _docker_service_update() {
--restart-window --restart-window
--stop-grace-period --stop-grace-period
--update-delay --update-delay
--update-failure-action
--update-parallelism --update-parallelism
--user -u --user -u
--workdir -w --workdir -w

View file

@ -1094,6 +1094,7 @@ __docker_service_subcommand() {
"($help)--restart-window=[Window used to evaluate the restart policy]:window: " "($help)--restart-window=[Window used to evaluate the restart policy]:window: "
"($help)--stop-grace-period=[Time to wait before force killing a container]:grace period: " "($help)--stop-grace-period=[Time to wait before force killing a container]:grace period: "
"($help)--update-delay=[Delay between updates]:delay: " "($help)--update-delay=[Delay between updates]:delay: "
"($help)--update-failure-action=[Action on update failure]:mode:(pause continue)"
"($help)--update-parallelism=[Maximum number of tasks updated simultaneously]:number: " "($help)--update-parallelism=[Maximum number of tasks updated simultaneously]:number: "
"($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users"
"($help)--with-registry-auth[Send registry authentication details to swarm agents]" "($help)--with-registry-auth[Send registry authentication details to swarm agents]"

View file

@ -53,9 +53,16 @@ func ServiceFromGRPC(s swarmapi.Service) types.Service {
} }
service.Spec.UpdateConfig.Delay, _ = ptypes.Duration(&s.Spec.Update.Delay) service.Spec.UpdateConfig.Delay, _ = ptypes.Duration(&s.Spec.Update.Delay)
switch s.Spec.Update.FailureAction {
case swarmapi.UpdateConfig_PAUSE:
service.Spec.UpdateConfig.FailureAction = types.UpdateFailureActionPause
case swarmapi.UpdateConfig_CONTINUE:
service.Spec.UpdateConfig.FailureAction = types.UpdateFailureActionContinue
}
} }
//Mode // Mode
switch t := s.Spec.GetMode().(type) { switch t := s.Spec.GetMode().(type) {
case *swarmapi.ServiceSpec_Global: case *swarmapi.ServiceSpec_Global:
service.Spec.Mode.Global = &types.GlobalService{} service.Spec.Mode.Global = &types.GlobalService{}
@ -65,6 +72,23 @@ func ServiceFromGRPC(s swarmapi.Service) types.Service {
} }
} }
// UpdateStatus
service.UpdateStatus = types.UpdateStatus{}
if s.UpdateStatus != nil {
switch s.UpdateStatus.State {
case swarmapi.UpdateStatus_UPDATING:
service.UpdateStatus.State = types.UpdateStateUpdating
case swarmapi.UpdateStatus_PAUSED:
service.UpdateStatus.State = types.UpdateStatePaused
case swarmapi.UpdateStatus_COMPLETED:
service.UpdateStatus.State = types.UpdateStateCompleted
}
service.UpdateStatus.StartedAt, _ = ptypes.Timestamp(s.UpdateStatus.StartedAt)
service.UpdateStatus.CompletedAt, _ = ptypes.Timestamp(s.UpdateStatus.CompletedAt)
service.UpdateStatus.Message = s.UpdateStatus.Message
}
return service return service
} }
@ -111,9 +135,19 @@ func ServiceSpecToGRPC(s types.ServiceSpec) (swarmapi.ServiceSpec, error) {
} }
if s.UpdateConfig != nil { if s.UpdateConfig != nil {
var failureAction swarmapi.UpdateConfig_FailureAction
switch s.UpdateConfig.FailureAction {
case types.UpdateFailureActionPause, "":
failureAction = swarmapi.UpdateConfig_PAUSE
case types.UpdateFailureActionContinue:
failureAction = swarmapi.UpdateConfig_CONTINUE
default:
return swarmapi.ServiceSpec{}, fmt.Errorf("unrecongized update failure action %s", s.UpdateConfig.FailureAction)
}
spec.Update = &swarmapi.UpdateConfig{ spec.Update = &swarmapi.UpdateConfig{
Parallelism: s.UpdateConfig.Parallelism, Parallelism: s.UpdateConfig.Parallelism,
Delay: *ptypes.DurationProto(s.UpdateConfig.Delay), Delay: *ptypes.DurationProto(s.UpdateConfig.Delay),
FailureAction: failureAction,
} }
} }

View file

@ -3966,7 +3966,8 @@ Create a service
}, },
"UpdateConfig": { "UpdateConfig": {
"Delay": 30000000000.0, "Delay": 30000000000.0,
"Parallelism": 2 "Parallelism": 2,
"FailureAction": "pause"
}, },
"EndpointSpec": { "EndpointSpec": {
"Ports": [ "Ports": [
@ -4056,6 +4057,8 @@ JSON Parameters:
- **Parallelism** Maximum number of tasks to be updated in one iteration (0 means unlimited - **Parallelism** Maximum number of tasks to be updated in one iteration (0 means unlimited
parallelism). parallelism).
- **Delay** Amount of time between updates. - **Delay** Amount of time between updates.
- **FailureAction** - Action to take if an updated task fails to run, or stops running during the
update. Values are `continue` and `pause`.
- **Networks** Array of network names or IDs to attach the service to. - **Networks** Array of network names or IDs to attach the service to.
- **Endpoint** Properties that can be configured to access and load balance a service. - **Endpoint** Properties that can be configured to access and load balance a service.
- **Spec** - **Spec**

View file

@ -3967,7 +3967,8 @@ Create a service
}, },
"UpdateConfig": { "UpdateConfig": {
"Delay": 30000000000.0, "Delay": 30000000000.0,
"Parallelism": 2 "Parallelism": 2,
"FailureAction": "pause"
}, },
"EndpointSpec": { "EndpointSpec": {
"Ports": [ "Ports": [
@ -4057,6 +4058,8 @@ JSON Parameters:
- **Parallelism** Maximum number of tasks to be updated in one iteration (0 means unlimited - **Parallelism** Maximum number of tasks to be updated in one iteration (0 means unlimited
parallelism). parallelism).
- **Delay** Amount of time between updates. - **Delay** Amount of time between updates.
- **FailureAction** - Action to take if an updated task fails to run, or stops running during the
update. Values are `continue` and `pause`.
- **Networks** Array of network names or IDs to attach the service to. - **Networks** Array of network names or IDs to attach the service to.
- **Endpoint** Properties that can be configured to access and load balance a service. - **Endpoint** Properties that can be configured to access and load balance a service.
- **Spec** - **Spec**

View file

@ -17,33 +17,34 @@ Usage: docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
Create a new service Create a new service
Options: Options:
--constraint value Placement constraints (default []) --constraint value Placement constraints (default [])
--endpoint-mode string Endpoint mode (vip or dnsrr) --endpoint-mode string Endpoint mode (vip or dnsrr)
-e, --env value Set environment variables (default []) -e, --env value Set environment variables (default [])
--help Print usage --help Print usage
-l, --label value Service labels (default []) -l, --label value Service labels (default [])
--limit-cpu value Limit CPUs (default 0.000) --limit-cpu value Limit CPUs (default 0.000)
--limit-memory value Limit Memory (default 0 B) --limit-memory value Limit Memory (default 0 B)
--log-driver string Logging driver for service --log-driver string Logging driver for service
--log-opt value Logging driver options (default []) --log-opt value Logging driver options (default [])
--mode string Service mode (replicated or global) (default "replicated") --mode string Service mode (replicated or global) (default "replicated")
--mount value Attach a mount to the service --mount value Attach a mount to the service
--name string Service name --name string Service name
--network value Network attachments (default []) --network value Network attachments (default [])
-p, --publish value Publish a port as a node port (default []) -p, --publish value Publish a port as a node port (default [])
--replicas value Number of tasks (default none) --replicas value Number of tasks (default none)
--reserve-cpu value Reserve CPUs (default 0.000) --reserve-cpu value Reserve CPUs (default 0.000)
--reserve-memory value Reserve Memory (default 0 B) --reserve-memory value Reserve Memory (default 0 B)
--restart-condition string Restart when condition is met (none, on-failure, or any) --restart-condition string Restart when condition is met (none, on-failure, or any)
--restart-delay value Delay between restart attempts (default none) --restart-delay value Delay between restart attempts (default none)
--restart-max-attempts value Maximum number of restarts before giving up (default none) --restart-max-attempts value Maximum number of restarts before giving up (default none)
--restart-window value Window used to evaluate the restart policy (default none) --restart-window value Window used to evaluate the restart policy (default none)
--stop-grace-period value Time to wait before force killing a container (default none) --stop-grace-period value Time to wait before force killing a container (default none)
--update-delay duration Delay between updates --update-delay duration Delay between updates
--update-parallelism uint Maximum number of tasks updated simultaneously (0 to update all at once) (default 1) --update-failure-action string Action on update failure (pause|continue) (default "pause")
-u, --user string Username or UID --update-parallelism uint Maximum number of tasks updated simultaneously (0 to update all at once) (default 1)
--with-registry-auth Send registry authentication details to Swarm agents -u, --user string Username or UID
-w, --workdir string Working directory inside the container --with-registry-auth Send registry authentication details to Swarm agents
-w, --workdir string Working directory inside the container
``` ```
Creates a service as described by the specified parameters. This command has to Creates a service as described by the specified parameters. This command has to

View file

@ -17,40 +17,41 @@ Usage: docker service update [OPTIONS] SERVICE
Update a service Update a service
Options: Options:
--args string Service command args --args string Service command args
--constraint-add value Add or update placement constraints (default []) --constraint-add value Add or update placement constraints (default [])
--constraint-rm value Remove a constraint (default []) --constraint-rm value Remove a constraint (default [])
--endpoint-mode string Endpoint mode (vip or dnsrr) --endpoint-mode string Endpoint mode (vip or dnsrr)
--env-add value Add or update environment variables (default []) --env-add value Add or update environment variables (default [])
--env-rm value Remove an environment variable (default []) --env-rm value Remove an environment variable (default [])
--help Print usage --help Print usage
--image string Service image tag --image string Service image tag
--label-add value Add or update service labels (default []) --label-add value Add or update service labels (default [])
--label-rm value Remove a label by its key (default []) --label-rm value Remove a label by its key (default [])
--limit-cpu value Limit CPUs (default 0.000) --limit-cpu value Limit CPUs (default 0.000)
--limit-memory value Limit Memory (default 0 B) --limit-memory value Limit Memory (default 0 B)
--log-driver string Logging driver for service --log-driver string Logging driver for service
--log-opt value Logging driver options (default []) --log-opt value Logging driver options (default [])
--mount-add value Add or update a mount on a service --mount-add value Add or update a mount on a service
--mount-rm value Remove a mount by its target path (default []) --mount-rm value Remove a mount by its target path (default [])
--name string Service name --name string Service name
--network-add value Add or update network attachments (default []) --network-add value Add or update network attachments (default [])
--network-rm value Remove a network by name (default []) --network-rm value Remove a network by name (default [])
--publish-add value Add or update a published port (default []) --publish-add value Add or update a published port (default [])
--publish-rm value Remove a published port by its target port (default []) --publish-rm value Remove a published port by its target port (default [])
--replicas value Number of tasks (default none) --replicas value Number of tasks (default none)
--reserve-cpu value Reserve CPUs (default 0.000) --reserve-cpu value Reserve CPUs (default 0.000)
--reserve-memory value Reserve Memory (default 0 B) --reserve-memory value Reserve Memory (default 0 B)
--restart-condition string Restart when condition is met (none, on-failure, or any) --restart-condition string Restart when condition is met (none, on-failure, or any)
--restart-delay value Delay between restart attempts (default none) --restart-delay value Delay between restart attempts (default none)
--restart-max-attempts value Maximum number of restarts before giving up (default none) --restart-max-attempts value Maximum number of restarts before giving up (default none)
--restart-window value Window used to evaluate the restart policy (default none) --restart-window value Window used to evaluate the restart policy (default none)
--stop-grace-period value Time to wait before force killing a container (default none) --stop-grace-period value Time to wait before force killing a container (default none)
--update-delay duration Delay between updates --update-delay duration Delay between updates
--update-parallelism uint Maximum number of tasks updated simultaneously (0 to update all at once) (default 1) --update-failure-action string Action on update failure (pause|continue) (default "pause")
-u, --user string Username or UID --update-parallelism uint Maximum number of tasks updated simultaneously (0 to update all at once) (default 1)
--with-registry-auth Send registry authentication details to Swarm agents -u, --user string Username or UID
-w, --workdir string Working directory inside the container --with-registry-auth Send registry authentication details to Swarm agents
-w, --workdir string Working directory inside the container
``` ```
Updates a service as described by the specified parameters. This command has to be run targeting a manager node. Updates a service as described by the specified parameters. This command has to be run targeting a manager node.

View file

@ -60,7 +60,7 @@ clone git golang.org/x/net 2beffdc2e92c8a3027590f898fe88f69af48a3f8 https://gith
clone git golang.org/x/sys eb2c74142fd19a79b3f237334c7384d5167b1b46 https://github.com/golang/sys.git clone git golang.org/x/sys eb2c74142fd19a79b3f237334c7384d5167b1b46 https://github.com/golang/sys.git
clone git github.com/docker/go-units 651fc226e7441360384da338d0fd37f2440ffbe3 clone git github.com/docker/go-units 651fc226e7441360384da338d0fd37f2440ffbe3
clone git github.com/docker/go-connections fa2850ff103453a9ad190da0df0af134f0314b3d clone git github.com/docker/go-connections fa2850ff103453a9ad190da0df0af134f0314b3d
clone git github.com/docker/engine-api ebb728a1346926edc2ad9418f9b6045901810b20 clone git github.com/docker/engine-api 53b6b19ee622c8584c28fdde0e3893383b290da3
clone git github.com/RackSec/srslog 259aed10dfa74ea2961eddd1d9847619f6e98837 clone git github.com/RackSec/srslog 259aed10dfa74ea2961eddd1d9847619f6e98837
clone git github.com/imdario/mergo 0.2.1 clone git github.com/imdario/mergo 0.2.1

View file

@ -791,8 +791,9 @@ func serviceForUpdate(s *swarm.Service) {
}, },
}, },
UpdateConfig: &swarm.UpdateConfig{ UpdateConfig: &swarm.UpdateConfig{
Parallelism: 2, Parallelism: 2,
Delay: 8 * time.Second, Delay: 8 * time.Second,
FailureAction: swarm.UpdateFailureActionContinue,
}, },
} }
s.Spec.Name = "updatetest" s.Spec.Name = "updatetest"

View file

@ -6,8 +6,9 @@ import "time"
type Service struct { type Service struct {
ID string ID string
Meta Meta
Spec ServiceSpec `json:",omitempty"` Spec ServiceSpec `json:",omitempty"`
Endpoint Endpoint `json:",omitempty"` Endpoint Endpoint `json:",omitempty"`
UpdateStatus UpdateStatus `json:",omitempty"`
} }
// ServiceSpec represents the spec of a service. // ServiceSpec represents the spec of a service.
@ -29,6 +30,26 @@ type ServiceMode struct {
Global *GlobalService `json:",omitempty"` Global *GlobalService `json:",omitempty"`
} }
// UpdateState is the state of a service update.
type UpdateState string
const (
// UpdateStateUpdating is the updating state.
UpdateStateUpdating UpdateState = "updating"
// UpdateStatePaused is the paused state.
UpdateStatePaused UpdateState = "paused"
// UpdateStateCompleted is the completed state.
UpdateStateCompleted UpdateState = "completed"
)
// UpdateStatus reports the status of a service update.
type UpdateStatus struct {
State UpdateState `json:",omitempty"`
StartedAt time.Time `json:",omitempty"`
CompletedAt time.Time `json:",omitempty"`
Message string `json:",omitempty"`
}
// ReplicatedService is a kind of ServiceMode. // ReplicatedService is a kind of ServiceMode.
type ReplicatedService struct { type ReplicatedService struct {
Replicas *uint64 `json:",omitempty"` Replicas *uint64 `json:",omitempty"`
@ -37,8 +58,16 @@ type ReplicatedService struct {
// GlobalService is a kind of ServiceMode. // GlobalService is a kind of ServiceMode.
type GlobalService struct{} type GlobalService struct{}
const (
// UpdateFailureActionPause PAUSE
UpdateFailureActionPause = "pause"
// UpdateFailureActionContinue CONTINUE
UpdateFailureActionContinue = "continue"
)
// UpdateConfig represents the update configuration. // UpdateConfig represents the update configuration.
type UpdateConfig struct { type UpdateConfig struct {
Parallelism uint64 `json:",omitempty"` Parallelism uint64 `json:",omitempty"`
Delay time.Duration `json:",omitempty"` Delay time.Duration `json:",omitempty"`
FailureAction string `json:",omitempty"`
} }