Add readiness healthcheck generation by label (#1366)

This commit is contained in:
João Vitor Paes de Barros do Carmo
2021-03-17 18:02:50 +08:00
committed by GitHub
parent 76565d80b2
commit 0036f0c32b
6 changed files with 184 additions and 10 deletions
+12
View File
@@ -44,6 +44,18 @@ const (
LabelImagePullSecret = "kompose.image-pull-secret"
// LabelImagePullPolicy defines Kubernetes PodSpec imagePullPolicy.
LabelImagePullPolicy = "kompose.image-pull-policy"
// HealthCheckReadinessDisable defines readiness health check disable
HealthCheckReadinessDisable = "kompose.service.healthcheck.readiness.disable"
// HealthCheckReadinessTest defines readiness health check test
HealthCheckReadinessTest = "kompose.service.healthcheck.readiness.test"
// HealthCheckReadinessInterval defines readiness health check interval
HealthCheckReadinessInterval = "kompose.service.healthcheck.readiness.interval"
// HealthCheckReadinessTimeout defines readiness health check timeout
HealthCheckReadinessTimeout = "kompose.service.healthcheck.readiness.timeout"
// HealthCheckReadinessRetries defines readiness health check retries
HealthCheckReadinessRetries = "kompose.service.healthcheck.readiness.retries"
// HealthCheckReadinessStartPeriod defines readiness health check start period
HealthCheckReadinessStartPeriod = "kompose.service.healthcheck.readiness.start_period"
// ServiceTypeHeadless ...
ServiceTypeHeadless = "Headless"
+72 -2
View File
@@ -34,6 +34,7 @@ import (
"fmt"
shlex "github.com/google/shlex"
"github.com/kubernetes/kompose/pkg/kobject"
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
@@ -228,6 +229,66 @@ func loadV3Ports(ports []types.ServicePortConfig, expose []string) []kobject.Por
return komposePorts
}
/* Convert the HealthCheckConfig as designed by Docker to
a Kubernetes-compatible format.
*/
func parseHealthCheckReadiness(labels types.Labels) (kobject.HealthCheck, error) {
// initialize with CMD as default to not break at return (will be ignored if no test is informed)
test := []string{"CMD"}
var timeout, interval, retries, startPeriod int32
var disable bool
for key, value := range labels {
switch key {
case HealthCheckReadinessDisable:
disable = cast.ToBool(value)
case HealthCheckReadinessTest:
if len(value) > 0 {
test, _ = shlex.Split(value)
}
case HealthCheckReadinessInterval:
parse, err := time.ParseDuration(value)
if err != nil {
return kobject.HealthCheck{}, errors.Wrap(err, "unable to parse health check interval variable")
}
interval = int32(parse.Seconds())
case HealthCheckReadinessTimeout:
parse, err := time.ParseDuration(value)
if err != nil {
return kobject.HealthCheck{}, errors.Wrap(err, "unable to parse health check timeout variable")
}
timeout = int32(parse.Seconds())
case HealthCheckReadinessRetries:
retries = cast.ToInt32(value)
case HealthCheckReadinessStartPeriod:
parse, err := time.ParseDuration(value)
if err != nil {
return kobject.HealthCheck{}, errors.Wrap(err, "unable to parse health check startPeriod variable")
}
startPeriod = int32(parse.Seconds())
}
}
if test[0] == "NONE" {
disable = true
test = test[1:]
}
if test[0] == "CMD" || test[0] == "CMD-SHELL" {
test = test[1:]
}
// Due to docker/cli adding "CMD-SHELL" to the struct, we remove the first element of composeHealthCheck.Test
return kobject.HealthCheck{
Test: test,
Timeout: timeout,
Interval: interval,
Retries: retries,
StartPeriod: startPeriod,
Disable: disable,
}, nil
}
/* Convert the HealthCheckConfig as designed by Docker to
a Kubernetes-compatible format.
*/
@@ -327,15 +388,24 @@ func dockerComposeToKomposeMapping(composeObject *types.Config) (kobject.Kompose
// labels
serviceConfig.DeployLabels = composeServiceConfig.Deploy.Labels
// HealthCheck
// HealthCheck Liveness
if composeServiceConfig.HealthCheck != nil && !composeServiceConfig.HealthCheck.Disable {
var err error
serviceConfig.HealthChecks, err = parseHealthCheck(*composeServiceConfig.HealthCheck)
serviceConfig.HealthChecks.Liveness, err = parseHealthCheck(*composeServiceConfig.HealthCheck)
if err != nil {
return kobject.KomposeObject{}, errors.Wrap(err, "Unable to parse health check")
}
}
// HealthCheck Readiness
var readiness, errReadiness = parseHealthCheckReadiness(*&composeServiceConfig.Labels)
if readiness.Test != nil && len(readiness.Test) > 0 && len(readiness.Test[0]) > 0 && !readiness.Disable {
serviceConfig.HealthChecks.Readiness = readiness
if errReadiness != nil {
return kobject.KomposeObject{}, errors.Wrap(errReadiness, "Unable to parse health check")
}
}
// restart-policy: deploy.restart_policy.condition will rewrite restart option
// see: https://docs.docker.com/compose/compose-file/#restart_policy
serviceConfig.Restart = composeServiceConfig.Restart