forked from LaconicNetwork/kompose
Add readiness healthcheck generation by label (#1366)
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user