Merge pull request #907 from docker/aci_healthcheck_threshold

This commit is contained in:
Nicolas De loof 2020-11-17 13:35:01 +01:00 committed by GitHub
commit 38d2dd9b41
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 54 additions and 20 deletions

View file

@ -62,7 +62,7 @@ func Command(contextType string) *cobra.Command {
cmd.Flags().BoolVar(&opts.Rm, "rm", false, "Automatically remove the container when it exits")
cmd.Flags().StringVar(&opts.HealthCmd, "health-cmd", "", "Command to run to check health")
cmd.Flags().DurationVar(&opts.HealthInterval, "health-interval", time.Duration(0), "Time between running the check (ms|s|m|h) (default 0s)")
cmd.Flags().IntVar(&opts.HealthRetries, "health-retries", 10, "Consecutive failures needed to report unhealthy")
cmd.Flags().IntVar(&opts.HealthRetries, "health-retries", 0, "Consecutive failures needed to report unhealthy")
cmd.Flags().DurationVar(&opts.HealthStartPeriod, "health-start-period", time.Duration(0), "Start period for the container to initialize before starting "+
"health-retries countdown (ms|s|m|h) (default 0s)")
cmd.Flags().DurationVar(&opts.HealthTimeout, "health-timeout", time.Duration(0), "Maximum time to allow one check to run (ms|s|m|h) (default 0s)")

View file

@ -11,7 +11,7 @@ Flags:
--env-file stringArray Path to environment files to be translated as environment variables
--health-cmd string Command to run to check health
--health-interval duration Time between running the check (ms|s|m|h) (default 0s)
--health-retries int Consecutive failures needed to report unhealthy (default 10)
--health-retries int Consecutive failures needed to report unhealthy
--health-start-period duration Start period for the container to initialize before starting health-retries countdown (ms|s|m|h) (default 0s)
--health-timeout duration Maximum time to allow one check to run (ms|s|m|h) (default 0s)
-l, --label stringArray Set meta data on a container

View file

@ -86,13 +86,6 @@ func (r *Opts) ToContainerConfig(image string) (containers.ContainerConfig, erro
envVars = append(envVars, vars...)
}
var healthCmd []string
var healthInterval types.Duration
if len(r.HealthCmd) > 0 {
healthCmd = strings.Split(r.HealthCmd, " ")
healthInterval = types.Duration(r.HealthInterval)
}
return containers.ContainerConfig{
ID: r.Name,
Image: image,
@ -106,14 +99,26 @@ func (r *Opts) ToContainerConfig(image string) (containers.ContainerConfig, erro
RestartPolicyCondition: restartPolicy,
DomainName: r.DomainName,
AutoRemove: r.Rm,
Healthcheck: containers.Healthcheck{
Disable: len(healthCmd) == 0,
Test: healthCmd,
Interval: healthInterval,
},
Healthcheck: r.toHealthcheck(),
}, nil
}
func (r *Opts) toHealthcheck() containers.Healthcheck {
var healthCmd []string
if len(r.HealthCmd) > 0 {
healthCmd = strings.Split(r.HealthCmd, " ")
}
return containers.Healthcheck{
Disable: len(healthCmd) == 0,
Test: healthCmd,
Interval: types.Duration(r.HealthInterval),
StartPeriod: types.Duration(r.HealthStartPeriod),
Timeout: types.Duration(r.HealthTimeout),
Retries: r.HealthRetries,
}
}
var restartPolicyMap = map[string]string{
"": containers.RestartPolicyNone,
containers.RestartPolicyNone: containers.RestartPolicyNone,

View file

@ -20,7 +20,9 @@ import (
"errors"
"regexp"
"testing"
"time"
"github.com/compose-spec/compose-go/types"
"github.com/google/go-cmp/cmp/cmpopts"
"gotest.tools/v3/assert"
"gotest.tools/v3/assert/cmp"
@ -227,3 +229,31 @@ func TestValidateRestartPolicy(t *testing.T) {
assert.Equal(t, testCase.expected, result)
}
}
func TestToHealthcheck(t *testing.T) {
testOpt := Opts{
HealthCmd: "curl",
}
assert.DeepEqual(t, testOpt.toHealthcheck(), containers.Healthcheck{
Disable: false,
Test: []string{"curl"},
})
testOpt = Opts{
HealthCmd: "curl",
HealthRetries: 3,
HealthInterval: 5 * time.Second,
HealthTimeout: 2 * time.Second,
HealthStartPeriod: 10 * time.Second,
}
assert.DeepEqual(t, testOpt.toHealthcheck(), containers.Healthcheck{
Disable: false,
Test: []string{"curl"},
Retries: 3,
Interval: types.Duration(5 * time.Second),
StartPeriod: types.Duration(10 * time.Second),
Timeout: types.Duration(2 * time.Second),
})
}