Repository: appvia/kev
Pull request #399 (2021-03-09 17:10:38)

pkg/config: add http probe


Patch:
diff --git a/pkg/kev/config/defaults.go b/pkg/kev/config/defaults.go
index 61097be..4e537a4 100644
--- a/pkg/kev/config/defaults.go
+++ b/pkg/kev/config/defaults.go
@@ -124,6 +124,9 @@ const (
 	// DefaultLivenessProbeCommand default command
 	DefaultLivenessProbeCommand = "Define healthcheck command for service %s"
 
+	// DefaultLivenessProbeType default probe type.
+	DefaultLivenessProbeType = "command"
+
 	// DefaultProbeTimeout default 10s
 	DefaultProbeTimeout = "10s"
 
diff --git a/pkg/kev/config/labels.go b/pkg/kev/config/labels.go
index 043bfc6..7e90bbc 100644
--- a/pkg/kev/config/labels.go
+++ b/pkg/kev/config/labels.go
@@ -73,9 +73,18 @@ const (
 	// LabelWorkloadServiceAccountName defines service account name to be used by the workload
 	LabelWorkloadServiceAccountName = LabelPrefix + "workload.service-account-name"
 
-	// LabelWorkloadLivenessProbeCommand defines the command for workload liveness probe
+	// LabelWorkloadLivenessProbeType defines the command for workload liveness probe.
+	LabelWorkloadLivenessProbeType = LabelPrefix + "workload.liveness-probe-type"
+
+	// LabelWorkloadLivenessProbeCommand defines the command for workload liveness probe.
 	LabelWorkloadLivenessProbeCommand = LabelPrefix + "workload.liveness-probe-command"
 
+	// LabelWorkloadLivenessProbeHTTPPort defines the port for the http liveness probes.
+	LabelWorkloadLivenessProbeHTTPPort = LabelPrefix + "workload.liveness-probe.http.port"
+
+	// LabelWorkloadLivenessProbeHTTPPath defines the path for the http liveness probe.
+	LabelWorkloadLivenessProbeHTTPPath = LabelPrefix + "workload.liveness-probe.http.path"
+
 	// LabelWorkloadLivenessProbeInterval defines the interval for workload liveness probe
 	LabelWorkloadLivenessProbeInterval = LabelPrefix + "workload.liveness-probe-interval"
 
@@ -88,9 +97,6 @@ const (
 	// LabelWorkloadLivenessProbeRetries defines number of times workload liveness probe will retry
 	LabelWorkloadLivenessProbeRetries = LabelPrefix + "workload.liveness-probe-retries"
 
-	// LabelWorkloadLivenessProbeDisabled disables workload liveness probe
-	LabelWorkloadLivenessProbeDisabled = LabelPrefix + "workload.liveness-probe-disabled"
-
 	// LabelWorkloadReadinessProbeCommand defines the command for workload liveness probe
 	LabelWorkloadReadinessProbeCommand = LabelPrefix + "workload.readiness-probe-command"
 
@@ -132,8 +138,9 @@ const (
 )
 
 var BaseServiceLabels = []string{
-	LabelWorkloadLivenessProbeCommand,
 	LabelWorkloadReplicas,
+	LabelWorkloadLivenessProbeType,
+	LabelWorkloadLivenessProbeCommand,
 }
 
 var BaseVolumeLabels = []string{
diff --git a/pkg/kev/config/schema.go b/pkg/kev/config/schema.go
index 69ab17f..00eebb0 100644
--- a/pkg/kev/config/schema.go
+++ b/pkg/kev/config/schema.go
@@ -27,14 +27,15 @@ var ServicesSchema = map[string]interface{}{
 		LabelWorkloadImagePullPolicy:                     map[string]interface{}{"type": "string", "pattern": `^(?i)(IfNotPresent|Always)$`},
 		LabelWorkloadImagePullSecret:                     map[string]interface{}{"type": "string"},
 		LabelWorkloadRestartPolicy:                       map[string]interface{}{"type": "string", "pattern": `^(?i)(Always|OnFailure|Never)$`},
+		LabelWorkloadLivenessProbeType:                   map[string]interface{}{"type": "string", "enum": []string{"none", "command", "http"}},
 		LabelWorkloadLivenessProbeCommand:                map[string]interface{}{"type": "string"},
-		LabelWorkloadLivenessProbeDisabled:               map[string]interface{}{"type": "string", "enum": []string{"false", "true"}},
+		LabelWorkloadLivenessProbeHTTPPort:               map[string]interface{}{"type": "string"},
+		LabelWorkloadLivenessProbeHTTPPath:               map[string]interface{}{"type": "string"},
 		LabelWorkloadLivenessProbeInitialDelay:           map[string]interface{}{"type": "string", "format": "duration"},
 		LabelWorkloadLivenessProbeInterval:               map[string]interface{}{"type": "string", "format": "duration"},
 		LabelWorkloadLivenessProbeRetries:                map[string]interface{}{"type": "string", "pattern": `^\d+$`},
 		LabelWorkloadLivenessProbeTimeout:                map[string]interface{}{"type": "string", "format": "duration"},
 		LabelWorkloadReadinessProbeCommand:               map[string]interface{}{"type": "string"},
-		LabelWorkloadReadinessProbeDisabled:              map[string]interface{}{"type": "string", "enum": []string{"false", "true"}},
 		LabelWorkloadReadinessProbeInitialDelay:          map[string]interface{}{"type": "string", "format": "duration"},
 		LabelWorkloadReadinessProbeInterval:              map[string]interface{}{"type": "string", "format": "duration"},
 		LabelWorkloadReadinessProbeRetries:               map[string]interface{}{"type": "string", "pattern": `^\d+$`},
@@ -58,8 +59,8 @@ var ServicesSchema = map[string]interface{}{
 		LabelServiceExposeTLSSecret:                      map[string]interface{}{"type": "string"},
 	},
 	"required": []string{
-		LabelWorkloadLivenessProbeCommand,
 		LabelWorkloadReplicas,
+		LabelWorkloadLivenessProbeType,
 	},
 	"additionalProperties": false,
 }
diff --git a/pkg/kev/converter/kubernetes/project_service.go b/pkg/kev/converter/kubernetes/project_service.go
index af76701..0cc0055 100644
--- a/pkg/kev/converter/kubernetes/project_service.go
+++ b/pkg/kev/converter/kubernetes/project_service.go
@@ -552,36 +552,89 @@ func (p *ProjectService) ports() []composego.ServicePortConfig {
 
 // healthcheck returns project service healthcheck probe
 func (p *ProjectService) healthcheck() (*v1.Probe, error) {
+	probeType, err := p.livenessProbeType()
+	if err != nil {
+		return nil, errors.Wrap(err, "unable to get a valid liveness probe type")
+	}
 
-	if !p.livenessProbeDisabled() {
-		command := p.livenessProbeCommand()
-		timoutSeconds := p.livenessProbeTimeout()
-		periodSeconds := p.livenessProbeInterval()
-		initialDelaySeconds := p.livenessProbeInitialDelay()
-		failureThreshold := p.livenessProbeRetries()
+	var handler v1.Handler
 
-		if len(command) == 0 || len(command[0]) == 0 || timoutSeconds == 0 || periodSeconds == 0 ||
-			initialDelaySeconds == 0 || failureThreshold == 0 {
+	switch probeType {
+	case ProbeTypeNone:
+		return nil, nil
+	case ProbeTypeCommand:
+		handler.Exec = &v1.ExecAction{
+			Command: p.livenessProbeCommand(),
+		}
+
+		if handler.Exec == nil || len(handler.Exec.Command) == 0 || len(handler.Exec.Command[0]) == 0 {
 			log.Error("Health check misconfigured")
 			return nil, errors.New("Health check misconfigured")
 		}
-
-		probe := &v1.Probe{
-			Handler: v1.Handler{
-				Exec: &v1.ExecAction{
-					Command: command,
-				},
-			},
-			TimeoutSeconds:      timoutSeconds,
-			PeriodSeconds:       periodSeconds,
-			InitialDelaySeconds: initialDelaySeconds,
-			FailureThreshold:    failureThreshold,
+	case ProbeTypeHTTP:
+		hprobe, err := p.livenessHTTPProbe()
+		if err != nil {
+			return nil, err
 		}
+		handler.HTTPGet = &hprobe
+	default:
+		return nil, errors.Errorf("unsupported probe type: %s", probeType)
+	}
 
-		return probe, nil
+	timeoutSeconds := p.livenessProbeTimeout()
+	periodSeconds := p.livenessProbeInterval()
+	initialDelaySeconds := p.livenessProbeInitialDelay()
+	failureThreshold := p.livenessProbeRetries()
+
+	if timeoutSeconds == 0 || periodSeconds == 0 || initialDelaySeconds == 0 || failureThreshold == 0 {
+		log.Error("Health check misconfigured")
+		return nil, errors.New("Health check misconfigured")
 	}
 
-	return nil, nil
+	probe := &v1.Probe{
+		Handler:             handler,
+		TimeoutSeconds:      timeoutSeconds,
+		PeriodSeconds:       periodSeconds,
+		InitialDelaySeconds: initialDelaySeconds,
+		FailureThreshold:    failureThreshold,
+	}
+
+	return probe, nil
+}
+
+func (p *ProjectService) livenessProbeType() (ProbeType, error) {
+	t, ok := p.Labels[config.LabelWorkloadLivenessProbeType]
+	if !ok {
+		return ProbeTypeNone, errors.New("probe type not provided")
+	}
+
+	pt, ok := ProbeTypeFromString(t)
+	if !ok {
+		return ProbeTypeNone, errors.Wrapf(ErrUnsupportedProbeType, "type: %s", t)
+	}
+
+	return pt, nil
+}
+
+// livenessHTTPProbe returns an HTTPGetAction if all the necessary information is available.
+func (p *ProjectService) livenessHTTPProbe() (v1.HTTPGetAction, error) {
+	path, ok := p.Labels[config.LabelWorkloadLivenessProbeHTTPPath]
+	if !ok {
+		return v1.HTTPGetAction{}, errors.Errorf("%s not correctly defined", config.LabelWorkloadLivenessProbeHTTPPath)
+	}
+
+	port, ok := p.Labels[config.LabelWorkloadLivenessProbeHTTPPort]
+	if !ok {
+		return v1.HTTPGetAction{}, errors.Errorf("%s not correctly defined", config.LabelWorkloadLivenessProbeHTTPPort)
+	}
+
+	return v1.HTTPGetAction{
+		Path: path,
+		Port: intstr.IntOrString{
+			Type:   intstr.String,
+			StrVal: port,
+		},
+	}, nil
 }
 
 // livenessProbeCommand returns liveness probe command
@@ -677,40 +730,17 @@ func (p *ProjectService) livenessProbeRetries() int32 {
 	return int32(config.DefaultProbeRetries)
 }
 
-// livenessProbeDisabled tells whether liveness probe should be activated
-func (p *ProjectService) livenessProbeDisabled() bool {
-	if val, ok := p.Labels[config.LabelWorkloadLivenessProbeDisabled]; ok {
-		if v, err := strconv.ParseBool(val); err == nil {
-			return v
-		}
-
-		log.WarnfWithFields(log.Fields{
-			"project-service": p.Name,
-			"enabled":         val,
-		}, "Unable to extract Bool value from %s label. Liveness probe will be disabled.",
-			config.LabelWorkloadLivenessProbeDisabled)
-
-		return true
-	}
-
-	if p.HealthCheck != nil && p.HealthCheck.Disable == true {
-		return true
-	}
-
-	return false
-}
-
 // readinessProbe returns project service readiness probe
 func (p *ProjectService) readinessProbe() (*v1.Probe, error) {
 
 	if !p.readinessProbeDisabled() {
 		command := p.readinessProbeCommand()
-		timoutSeconds := p.readinessProbeTimeout()
+		timeoutSeconds := p.readinessProbeTimeout()
 		periodSeconds := p.readinessProbeInterval()
 		initialDelaySeconds := p.readinessProbeInitialDelay()
 		failureThreshold := p.readinessProbeRetries()
 
-		if len(command) == 0 || len(command[0]) == 0 || timoutSeconds == 0 || periodSeconds == 0 ||
+		if len(command) == 0 || len(command[0]) == 0 || timeoutSeconds == 0 || periodSeconds == 0 ||
 			initialDelaySeconds == 0 || failureThreshold == 0 {
 			log.Error("Readiness probe misconfigured")
 			return nil, errors.New("Readiness probe misconfigured")
@@ -722,7 +752,7 @@ func (p *ProjectService) readinessProbe() (*v1.Probe, error) {
 					Command: command,
 				},
 			},
-			TimeoutSeconds:      timoutSeconds,
+			TimeoutSeconds:      timeoutSeconds,
 			PeriodSeconds:       periodSeconds,
 			InitialDelaySeconds: initialDelaySeconds,
 			FailureThreshold:    failureThreshold,
diff --git a/pkg/kev/converter/kubernetes/types.go b/pkg/kev/converter/kubernetes/types.go
index 543aece..69503f6 100644
--- a/pkg/kev/converter/kubernetes/types.go
+++ b/pkg/kev/converter/kubernetes/types.go
@@ -22,6 +22,7 @@ package kubernetes
 
 import (
 	composego "github.com/compose-spec/compose-go/types"
+	"github.com/pkg/errors"
 )
 
 // ConvertOptions holds all options that controls transformation process
@@ -53,3 +54,52 @@ type Volumes struct {
 
 // ProjectService is a wrapper type around composego.ServiceConfig
 type ProjectService composego.ServiceConfig
+
+// ErrUnsupportedProbeType should be returned when an unsupported probe type is provided.
+var ErrUnsupportedProbeType = errors.New("unsupported probe type")
+
+// ProbeType defines all possible types of kubernetes probes
+type ProbeType int
+
+// Valid checks if a ProbeType contains an expected value.
+func (p ProbeType) Valid() bool {
+	_, ok := probeString[p]
+
+	return ok
+}
+
+// String returns the string representation of a ProbeType.
+func (p ProbeType) String() string {
+	s, ok := probeString[p]
+	if !ok {
+		return ""
+	}
+
+	return s
+}
+
+var probeString map[ProbeType]string = map[ProbeType]string{
+	ProbeTypeNone:    "none",
+	ProbeTypeCommand: "command",
+	ProbeTypeHTTP:    "http",
+}
+
+const (
+	// ProbeTypeNone disables probe checks.
+	ProbeTypeNone ProbeType = iota
+	// ProbeTypeCommand uses a shell command for probe checks.
+	ProbeTypeCommand
+	// ProbeTypeHTTP defines an http request which is used by probes checks.
+	ProbeTypeHTTP
+)
+
+// ProbeTypeFromString finds the ProbeType from it's string representation or returns Disabled as a default.
+func ProbeTypeFromString(s string) (ProbeType, bool) {
+	for k, v := range probeString {
+		if s == v {
+			return k, true
+		}
+	}
+
+	return ProbeTypeNone, false
+}
diff --git a/pkg/kev/extract.go b/pkg/kev/extract.go
index 51458e1..c5a3287 100644
--- a/pkg/kev/extract.go
+++ b/pkg/kev/extract.go
@@ -22,6 +22,8 @@ import (
 	"strings"
 
 	"github.com/appvia/kev/pkg/kev/config"
+	"github.com/appvia/kev/pkg/kev/converter/kubernetes"
+
 	composego "github.com/compose-spec/compose-go/types"
 	"k8s.io/apimachinery/pkg/api/resource"
 )
@@ -172,7 +174,11 @@ func extractHealthcheckLabels(source composego.ServiceConfig, target *ServiceCon
 		timeout      string
 	)
 
-	target.Labels.Add(config.LabelWorkloadLivenessProbeDisabled, strconv.FormatBool(source.HealthCheck.Disable))
+	if source.HealthCheck.Disable {
+		target.Labels.Add(config.LabelWorkloadLivenessProbeType, kubernetes.ProbeTypeNone.String())
+	} else {
+		target.Labels.Add(config.LabelWorkloadLivenessProbeType, kubernetes.ProbeTypeCommand.String())
+	}
 
 	if source.HealthCheck != nil && source.HealthCheck.Interval != nil {
 		interval = source.HealthCheck.Interval.String()


Test patch:
diff --git a/pkg/kev/converter/kubernetes/project_service_test.go b/pkg/kev/converter/kubernetes/project_service_test.go
index 2171004..9d7512c 100644
--- a/pkg/kev/converter/kubernetes/project_service_test.go
+++ b/pkg/kev/converter/kubernetes/project_service_test.go
@@ -1144,7 +1144,8 @@ var _ = Describe("ProjectService", func() {
 			startPeriod := composego.Duration(time.Duration(10) * time.Second)
 			retries := uint64(3)
 
-			BeforeEach(func() {
+			JustBeforeEach(func() {
+				projectService.Labels.Add(config.LabelWorkloadLivenessProbeType, ProbeTypeCommand.String())
 				healthcheck = composego.HealthCheckConfig{
 					Test: composego.HealthCheckTest{
 						"CMD-SHELL",
@@ -1158,7 +1159,9 @@ var _ = Describe("ProjectService", func() {
 			})
 
 			It("returns a Probe as expected", func() {
-				Expect(projectService.healthcheck()).To(Equal(&v1.Probe{
+				result, err := projectService.healthcheck()
+				Expect(err).NotTo(HaveOccurred())
+				Expect(result).To(Equal(&v1.Probe{
 					Handler: v1.Handler{
 						Exec: &v1.ExecAction{
 							Command: healthcheck.Test[1:],
@@ -1173,6 +1176,9 @@ var _ = Describe("ProjectService", func() {
 		})
 
 		Describe("validations", func() {
+			JustBeforeEach(func() {
+				projectService.Labels.Add(config.LabelWorkloadLivenessProbeType, ProbeTypeCommand.String())
+			})
 
 			Context("when Test command is not defined", func() {
 				BeforeEach(func() {
@@ -1199,6 +1205,7 @@ var _ = Describe("ProjectService", func() {
 				JustBeforeEach(func() {
 					projectService.Labels = composego.Labels{
 						config.LabelWorkloadLivenessProbeTimeout: "0",
+						config.LabelWorkloadLivenessProbeType:    ProbeTypeCommand.String(),
 					}
 				})
 
@@ -1216,6 +1223,57 @@ var _ = Describe("ProjectService", func() {
 		})
 	})
 
+	Describe("livenessHTTPProbe", func() {
+		When("defined via labels", func() {
+			Context("with all the parameters", func() {
+				BeforeEach(func() {
+					labels = composego.Labels{
+						config.LabelWorkloadLivenessProbeType:     ProbeTypeHTTP.String(),
+						config.LabelWorkloadLivenessProbeHTTPPath: "/status",
+						config.LabelWorkloadLivenessProbeHTTPPort: "8080",
+					}
+				})
+
+				It("returns a handler", func() {
+					result, err := projectService.livenessHTTPProbe()
+					Expect(err).To(BeNil())
+					Expect(result.Port.StrVal).To(Equal("8080"))
+					Expect(result.Path).To(Equal("/status"))
+				})
+			})
+
+			Context("with missing port", func() {
+				BeforeEach(func() {
+					labels = composego.Labels{
+						config.LabelWorkloadLivenessProbeType:     ProbeTypeHTTP.String(),
+						config.LabelWorkloadLivenessProbeHTTPPath: "/status",
+					}
+				})
+
+				It("returns an error", func() {
+					_, err := projectService.livenessHTTPProbe()
+					Expect(err).NotTo(BeNil())
+					Expect(err.Error()).To(ContainSubstring("%s not correctly defined", config.LabelWorkloadLivenessProbeHTTPPort))
+				})
+			})
+
+			Context("with missing path", func() {
+				BeforeEach(func() {
+					labels = composego.Labels{
+						config.LabelWorkloadLivenessProbeType:     ProbeTypeHTTP.String(),
+						config.LabelWorkloadLivenessProbeHTTPPort: "8080",
+					}
+				})
+
+				It("returns an error", func() {
+					_, err := projectService.livenessHTTPProbe()
+					Expect(err).NotTo(BeNil())
+					Expect(err.Error()).To(ContainSubstring("%s not correctly defined", config.LabelWorkloadLivenessProbeHTTPPath))
+				})
+			})
+		})
+	})
+
 	Describe("livenessProbeCommand", func() {
 		When("defined via labels", func() {
 
@@ -1428,70 +1486,6 @@ var _ = Describe("ProjectService", func() {
 		})
 	})
 
-	Describe("livenessProbeDisabled", func() {
-		When("defined via labels with valid (truth) value", func() {
-			disabled := "true"
-
-			BeforeEach(func() {
-				labels = composego.Labels{
-					config.LabelWorkloadLivenessProbeDisabled: disabled,
-				}
-			})
-
-			It("returns label value", func() {
-				Expect(projectService.livenessProbeDisabled()).To(BeTrue())
-			})
-		})
-
-		When("defined via labels with valid (false) value", func() {
-			disabled := "false"
-
-			BeforeEach(func() {
-				labels = composego.Labels{
-					config.LabelWorkloadLivenessProbeDisabled: disabled,
-				}
-			})
-
-			It("returns label value", func() {
-				Expect(projectService.livenessProbeDisabled()).To(BeFalse())
-			})
-		})
-
-		When("defined via labels with invalid (non truthy) value", func() {
-			disabled := "FOO"
-
-			BeforeEach(func() {
-				labels = composego.Labels{
-					config.LabelWorkloadLivenessProbeDisabled: disabled,
-				}
-			})
-
-			It("disables the liveness probe", func() {
-				Expect(projectService.livenessProbeDisabled()).To(BeTrue())
-			})
-		})
-
-		When("defined via healthcheck block only", func() {
-			disable := true
-
-			JustBeforeEach(func() {
-				projectService.HealthCheck = &composego.HealthCheckConfig{
-					Disable: disable,
-				}
-			})
-
-			It("returns project service healthcheck disable value", func() {
-				Expect(projectService.livenessProbeDisabled()).To(BeTrue())
-			})
-		})
-
-		When("not defined via labels", func() {
-			It("returns default value", func() {
-				Expect(projectService.livenessProbeDisabled()).To(BeFalse())
-			})
-		})
-	})
-
 	Describe("readinessProbe", func() {
 
 		Describe("validations", func() {
diff --git a/pkg/kev/converter/kubernetes/transform_test.go b/pkg/kev/converter/kubernetes/transform_test.go
index 50cb3e5..dcc682e 100644
--- a/pkg/kev/converter/kubernetes/transform_test.go
+++ b/pkg/kev/converter/kubernetes/transform_test.go
@@ -69,19 +69,43 @@ var _ = Describe("Transform", func() {
 	})
 
 	Describe("Transform", func() {
-
 		When("service exclusion list is empty", func() {
+			Context("and has probe type", func() {
+				JustBeforeEach(func() {
+					projectService.Labels = composego.Labels{
+						config.LabelWorkloadLivenessProbeType: ProbeTypeNone.String(),
+					}
 
-			It("includes kubernetes objects for project services", func() {
-				objs, err := k.Transform()
-				Expect(err).NotTo(HaveOccurred())
-				Expect(len(objs)).To(Equal(1))
+					project.Services = []composego.ServiceConfig{
+						composego.ServiceConfig(projectService),
+					}
+
+					k = Kubernetes{
+						Opt:      ConvertOptions{},
+						Project:  &project,
+						Excluded: excluded,
+					}
+				})
 
-				u, err := ToUnstructured(objs[0])
-				name := u["metadata"].(map[string]interface{})["name"]
+				It("includes kubernetes objects for project services", func() {
+					objs, err := k.Transform()
+					Expect(err).NotTo(HaveOccurred())
+					Expect(len(objs)).To(Equal(1))
 
-				Expect(err).NotTo(HaveOccurred())
-				Expect(name).To(Equal(projectService.Name))
+					u, err := ToUnstructured(objs[0])
+					name := u["metadata"].(map[string]interface{})["name"]
+
+					Expect(err).NotTo(HaveOccurred())
+					Expect(name).To(Equal(projectService.Name))
+				})
+			})
+
+			Context("and no probe is defined", func() {
+				It("returns a missing probe type error", func() {
+					_, err := k.Transform()
+					Expect(err).To(HaveOccurred())
+					Expect(err.Error()).To(ContainSubstring("probe type not provided"))
+				})
 			})
 
 		})
@@ -1887,12 +1911,14 @@ var _ = Describe("Transform", func() {
 					projectService.Labels = composego.Labels{
 						config.LabelWorkloadReadinessProbeDisabled: "false",
 						config.LabelWorkloadReadinessProbeCommand:  "hello world",
+						config.LabelWorkloadLivenessProbeType:      ProbeTypeNone.String(),
 					}
 				})
 
 				It("includes readiness probe definition in the pod spec", func() {
 					err := k.updateKubernetesObjects(projectService, &objs)
 					Expect(err).ToNot(HaveOccurred())
+
 					Expect(o.Spec.Template.Spec.Containers[0].ReadinessProbe.Exec.Command).To(Equal([]string{"hello world"}))
 				})
 			})
@@ -1920,7 +1946,7 @@ var _ = Describe("Transform", func() {
 			When("readiness probe is not defined or disabled", func() {
 				JustBeforeEach(func() {
 					projectService.Labels = composego.Labels{
-						config.LabelWorkloadReadinessProbeDisabled: "true",
+						config.LabelWorkloadLivenessProbeType: ProbeTypeNone.String(),
 					}
 				})
 
diff --git a/pkg/kev/kev_init_test.go b/pkg/kev/kev_init_test.go
index 8572d19..5651dcc 100644
--- a/pkg/kev/kev_init_test.go
+++ b/pkg/kev/kev_init_test.go
@@ -183,7 +183,8 @@ var _ = Describe("InitBase", func() {
 		Context("with services", func() {
 			It("should include a subset of labels as config params", func() {
 				svc, _ := env.GetService("db")
-				Expect(svc.GetLabels()).To(HaveLen(2))
+				Expect(svc.GetLabels()).To(HaveLen(3))
+				Expect(svc.GetLabels()).To(HaveKey(config.LabelWorkloadLivenessProbeType))
 				Expect(svc.GetLabels()).To(HaveKey(config.LabelWorkloadLivenessProbeCommand))
 				Expect(svc.GetLabels()).To(HaveKey(config.LabelWorkloadReplicas))
 			})
diff --git a/pkg/kev/kev_reconcile_test.go b/pkg/kev/kev_reconcile_test.go
index 0eb38cf..328510c 100644
--- a/pkg/kev/kev_reconcile_test.go
+++ b/pkg/kev/kev_reconcile_test.go
@@ -19,6 +19,7 @@ package kev_test
 import (
 	"github.com/appvia/kev/pkg/kev"
 	"github.com/appvia/kev/pkg/kev/config"
+	"github.com/appvia/kev/pkg/kev/converter/kubernetes"
 	"github.com/appvia/kev/pkg/kev/testutil"
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
@@ -40,14 +41,18 @@ var _ = Describe("Reconcile", func() {
 	)
 
 	JustBeforeEach(func() {
+		var err error
 		if len(overrideFiles) > 0 {
-			override, _ = kev.NewComposeProject(overrideFiles)
+			override, err = kev.NewComposeProject(overrideFiles)
+			Expect(err).NotTo(HaveOccurred())
 		}
 		hook = testutil.NewLogger(logrus.DebugLevel)
 		manifest, mErr = kev.Reconcile(workingDir)
-		if mErr == nil {
-			env, _ = manifest.GetEnvironment("dev")
-		}
+		Expect(mErr).NotTo(HaveOccurred())
+
+		env, err = manifest.GetEnvironment("dev")
+		Expect(err).NotTo(HaveOccurred())
+
 		loggedMsgs = testutil.GetLoggedMsgs(hook)
 	})
 
@@ -58,8 +63,10 @@ var _ = Describe("Reconcile", func() {
 	Describe("Reconcile changes from overrides", func() {
 		When("the override version has been updated", func() {
 			BeforeEach(func() {
+				var err error
 				workingDir = "testdata/reconcile-override-rollback"
-				source, _ = kev.NewComposeProject([]string{workingDir + "/docker-compose.yaml"})
+				source, err = kev.NewComposeProject([]string{workingDir + "/docker-compose.yaml"})
+				Expect(err).NotTo(HaveOccurred())
 				overrideFiles = []string{workingDir + "/docker-compose.kev.dev.yaml"}
 			})
 
@@ -81,7 +88,8 @@ var _ = Describe("Reconcile", func() {
 
 			When("the override service label overrides have been updated", func() {
 				It("confirms the values pre reconciliation", func() {
-					s, _ := override.GetService("db")
+					s, err := override.GetService("db")
+					Expect(err).NotTo(HaveOccurred())
 					Expect(s.Labels["kev.workload.cpu"]).To(Equal("0.5"))
 					Expect(s.Labels["kev.workload.max-cpu"]).To(Equal("0.75"))
 					Expect(s.Labels["kev.workload.memory"]).To(Equal("50Mi"))
@@ -90,7 +98,8 @@ var _ = Describe("Reconcile", func() {
 				})
 
 				It("keeps overridden override values", func() {
-					s, _ := env.GetService("db")
+					s, err := env.GetService("db")
+					Expect(err).NotTo(HaveOccurred())
 					Expect(s.Labels["kev.workload.cpu"]).To(Equal("0.5"))
 					Expect(s.Labels["kev.workload.max-cpu"]).To(Equal("0.75"))
 					Expect(s.Labels["kev.workload.memory"]).To(Equal("50Mi"))
@@ -265,6 +274,7 @@ var _ = Describe("Reconcile", func() {
 
 				It("should configure the added service labels from healthcheck config", func() {
 					expected := newDefaultServiceLabels("wordpress")
+					expected[config.LabelWorkloadLivenessProbeType] = kubernetes.ProbeTypeNone.String()
 					expected[config.LabelWorkloadLivenessProbeCommand] = "[\"CMD\", \"curl\", \"localhost:80/healthy\"]"
 					Expect(env.GetServices()[1].GetLabels()).To(Equal(expected))
 				})
@@ -452,6 +462,7 @@ var _ = Describe("Reconcile", func() {
 
 func newDefaultServiceLabels(name string) map[string]string {
 	return map[string]string{
+		config.LabelWorkloadLivenessProbeType:    kubernetes.ProbeTypeCommand.String(),
 		config.LabelWorkloadLivenessProbeCommand: "[\"CMD\", \"echo\", \"Define healthcheck command for service " + name + "\"]",
 		config.LabelWorkloadReplicas:             "1",
 	}
diff --git a/pkg/kev/manifest_test.go b/pkg/kev/manifest_test.go
index 6bcf3b3..07646af 100644
--- a/pkg/kev/manifest_test.go
+++ b/pkg/kev/manifest_test.go
@@ -52,27 +52,45 @@ var _ = Describe("Manifest", func() {
 				merged   *kev.ComposeProject
 				mergeErr error
 				env      *kev.Environment
+				manifest *kev.Manifest
 			)
 
-			manifest, err := kev.LoadManifest(workingDir)
-			if err == nil {
-				_, _ = manifest.CalculateSourcesBaseOverride()
-				env, _ = manifest.GetEnvironment("dev")
+			BeforeEach(func() {
+				var err error
+				manifest, err = kev.LoadManifest(workingDir)
+				Expect(err).NotTo(HaveOccurred())
+
+				_, err = manifest.CalculateSourcesBaseOverride()
+				Expect(err).NotTo(HaveOccurred())
+
+				env, err = manifest.GetEnvironment("dev")
+				Expect(err).NotTo(HaveOccurred())
+
 				merged, mergeErr = manifest.MergeEnvIntoSources(env)
-			}
+				Expect(mergeErr).NotTo(HaveOccurred())
+			})
 
 			It("merged the environment labels into sources", func() {
-				mergedSvc, _ := merged.GetService("db")
-				envSvc, _ := env.GetService("db")
+				var err error
+				mergedSvc, err := merged.GetService("db")
+				Expect(err).NotTo(HaveOccurred())
+				envSvc, err := env.GetService("db")
+				Expect(err).NotTo(HaveOccurred())
 				Expect(mergedSvc.Labels).To(Equal(envSvc.Labels))
 			})
 
 			It("merged the environment extensions into sources", func() {
-				sources, _ := manifest.SourcesToComposeProject()
+				sources, err := manifest.SourcesToComposeProject()
+				Expect(err).NotTo(HaveOccurred())
 
-				srcSvc, _ := sources.GetService("db")
-				mergedSvc, _ := merged.GetService("db")
-				envSvc, _ := env.GetService("db")
+				srcSvc, err := sources.GetService("db")
+				Expect(err).NotTo(HaveOccurred())
+
+				mergedSvc, err := merged.GetService("db")
+				Expect(err).NotTo(HaveOccurred())
+
+				envSvc, err := env.GetService("db")
+				Expect(err).NotTo(HaveOccurred())
 
 				Expect(srcSvc.Extensions).To(HaveLen(1))
 				Expect(mergedSvc.Extensions).To(HaveLen(2))
diff --git a/pkg/kev/services_test.go b/pkg/kev/services_test.go
index 21fedbe..fd9c216 100644
--- a/pkg/kev/services_test.go
+++ b/pkg/kev/services_test.go
@@ -18,6 +18,8 @@ package kev
 
 import (
 	"github.com/appvia/kev/pkg/kev/config"
+	"github.com/appvia/kev/pkg/kev/converter/kubernetes"
+
 	composego "github.com/compose-spec/compose-go/types"
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
@@ -27,12 +29,27 @@ var _ = Describe("ServiceConfig", func() {
 	Context("validation", func() {
 
 		When("base labels", func() {
+
+			// TODO: This needs a better test in a future iteration, the base labels are no longer just the required ones.
 			It("fails when base labels are not present", func() {
-				err := ServiceConfig{Labels: composego.Labels{}}.validate()
-				Expect(err).Should(MatchError(ContainSubstring(config.BaseServiceLabels[0])))
+				err := ServiceConfig{Labels: composego.Labels{
+					config.LabelWorkloadReplicas: "1",
+				}}.validate()
+				Expect(err).Should(MatchError(ContainSubstring(config.LabelWorkloadLivenessProbeType)))
+
+				err = ServiceConfig{Labels: composego.Labels{
+					config.LabelWorkloadLivenessProbeType: kubernetes.ProbeTypeCommand.String(),
+				}}.validate()
+				Expect(err).Should(MatchError(ContainSubstring(config.LabelWorkloadReplicas)))
+
+				err = ServiceConfig{Labels: composego.Labels{}}.validate()
+				Expect(err).Should(HaveOccurred())
 
-				err = ServiceConfig{Labels: composego.Labels{config.BaseServiceLabels[0]: "value"}}.validate()
-				Expect(err).Should(MatchError(ContainSubstring(config.BaseServiceLabels[1])))
+				err = ServiceConfig{Labels: composego.Labels{
+					config.LabelWorkloadLivenessProbeType: kubernetes.ProbeTypeCommand.String(),
+					config.LabelWorkloadReplicas:          "1",
+				}}.validate()
+				Expect(err).NotTo(HaveOccurred())
 			})
 
 			It("fails when replicas label is not a number", func() {
@@ -48,8 +65,8 @@ var _ = Describe("ServiceConfig", func() {
 			BeforeEach(func() {
 				serviceConfig = ServiceConfig{
 					Labels: composego.Labels{
-						config.LabelWorkloadLivenessProbeCommand: "value",
-						config.LabelWorkloadReplicas:             "1",
+						config.LabelWorkloadLivenessProbeType: kubernetes.ProbeTypeNone.String(),
+						config.LabelWorkloadReplicas:          "1",
 					}}
 			})
 
diff --git a/pkg/kev/testdata/detect-secrets/docker-compose.kev.dev.yaml b/pkg/kev/testdata/detect-secrets/docker-compose.kev.dev.yaml
index ce233d1..acc737e 100644
--- a/pkg/kev/testdata/detect-secrets/docker-compose.kev.dev.yaml
+++ b/pkg/kev/testdata/detect-secrets/docker-compose.kev.dev.yaml
@@ -2,10 +2,12 @@ version: "3.7"
 services:
   db:
     labels:
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service db"]'
       kev.workload.replicas: "1"
   wordpress:
     labels:
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service wordpress"]'
       kev.workload.replicas: "1"
     environment:
diff --git a/pkg/kev/testdata/in-cluster-wordpress/docker-compose.kev.dev.yaml b/pkg/kev/testdata/in-cluster-wordpress/docker-compose.kev.dev.yaml
index 6c63a80..b00c6e5 100644
--- a/pkg/kev/testdata/in-cluster-wordpress/docker-compose.kev.dev.yaml
+++ b/pkg/kev/testdata/in-cluster-wordpress/docker-compose.kev.dev.yaml
@@ -3,10 +3,12 @@ services:
   db:
     labels:
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service db"]'
+      kev.workload.liveness-probe-type: command
       kev.workload.replicas: "1"
   wordpress:
     labels:
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service wordpress"]'
+      kev.workload.liveness-probe-type: command
       kev.workload.replicas: "1"
 volumes:
   db_data:
diff --git a/pkg/kev/testdata/merge/docker-compose.kev.dev.yaml b/pkg/kev/testdata/merge/docker-compose.kev.dev.yaml
index adcd544..4c447a5 100644
--- a/pkg/kev/testdata/merge/docker-compose.kev.dev.yaml
+++ b/pkg/kev/testdata/merge/docker-compose.kev.dev.yaml
@@ -5,8 +5,8 @@ services:
       kev.service.type: None
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service db"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
diff --git a/pkg/kev/testdata/reconcile-env-var-override/docker-compose.kev.dev.yaml b/pkg/kev/testdata/reconcile-env-var-override/docker-compose.kev.dev.yaml
index d862c48..a2093d1 100644
--- a/pkg/kev/testdata/reconcile-env-var-override/docker-compose.kev.dev.yaml
+++ b/pkg/kev/testdata/reconcile-env-var-override/docker-compose.kev.dev.yaml
@@ -5,8 +5,8 @@ services:
       kev.service.type: None
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service db"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
diff --git a/pkg/kev/testdata/reconcile-env-var-removal/docker-compose.kev.dev.yaml b/pkg/kev/testdata/reconcile-env-var-removal/docker-compose.kev.dev.yaml
index b137108..159ba36 100644
--- a/pkg/kev/testdata/reconcile-env-var-removal/docker-compose.kev.dev.yaml
+++ b/pkg/kev/testdata/reconcile-env-var-removal/docker-compose.kev.dev.yaml
@@ -5,8 +5,8 @@ services:
       kev.service.type: None
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service db"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
@@ -23,8 +23,8 @@ services:
       kev.service.type: LoadBalancer
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service wordpress"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
diff --git a/pkg/kev/testdata/reconcile-env-var-unassigned/docker-compose.kev.dev.yaml b/pkg/kev/testdata/reconcile-env-var-unassigned/docker-compose.kev.dev.yaml
index 6437152..d28510e 100644
--- a/pkg/kev/testdata/reconcile-env-var-unassigned/docker-compose.kev.dev.yaml
+++ b/pkg/kev/testdata/reconcile-env-var-unassigned/docker-compose.kev.dev.yaml
@@ -5,8 +5,8 @@ services:
       kev.service.type: None
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service db"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
diff --git a/pkg/kev/testdata/reconcile-override-keep/docker-compose.kev.dev.yaml b/pkg/kev/testdata/reconcile-override-keep/docker-compose.kev.dev.yaml
index ee69fa3..2a0fb33 100644
--- a/pkg/kev/testdata/reconcile-override-keep/docker-compose.kev.dev.yaml
+++ b/pkg/kev/testdata/reconcile-override-keep/docker-compose.kev.dev.yaml
@@ -5,8 +5,8 @@ services:
       kev.service.type: ClusterIP
       kev.workload.cpu: "0.5"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service db"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
diff --git a/pkg/kev/testdata/reconcile-override-rollback/docker-compose.kev.dev.yaml b/pkg/kev/testdata/reconcile-override-rollback/docker-compose.kev.dev.yaml
index 46281fe..93068a7 100644
--- a/pkg/kev/testdata/reconcile-override-rollback/docker-compose.kev.dev.yaml
+++ b/pkg/kev/testdata/reconcile-override-rollback/docker-compose.kev.dev.yaml
@@ -5,8 +5,8 @@ services:
       kev.service.type: None
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service db"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
diff --git a/pkg/kev/testdata/reconcile-service-basic/docker-compose.kev.dev.yaml b/pkg/kev/testdata/reconcile-service-basic/docker-compose.kev.dev.yaml
index bae64c0..9ea13a2 100644
--- a/pkg/kev/testdata/reconcile-service-basic/docker-compose.kev.dev.yaml
+++ b/pkg/kev/testdata/reconcile-service-basic/docker-compose.kev.dev.yaml
@@ -5,8 +5,8 @@ services:
       kev.service.type: None
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service db"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
diff --git a/pkg/kev/testdata/reconcile-service-deploy/docker-compose.kev.dev.yaml b/pkg/kev/testdata/reconcile-service-deploy/docker-compose.kev.dev.yaml
index bae64c0..9ea13a2 100644
--- a/pkg/kev/testdata/reconcile-service-deploy/docker-compose.kev.dev.yaml
+++ b/pkg/kev/testdata/reconcile-service-deploy/docker-compose.kev.dev.yaml
@@ -5,8 +5,8 @@ services:
       kev.service.type: None
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service db"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
diff --git a/pkg/kev/testdata/reconcile-service-edit/docker-compose.kev.dev.yaml b/pkg/kev/testdata/reconcile-service-edit/docker-compose.kev.dev.yaml
index 11a25e6..a9d90cc 100644
--- a/pkg/kev/testdata/reconcile-service-edit/docker-compose.kev.dev.yaml
+++ b/pkg/kev/testdata/reconcile-service-edit/docker-compose.kev.dev.yaml
@@ -5,8 +5,8 @@ services:
       kev.service.type: ClusterIP
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service db"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
@@ -23,8 +23,8 @@ services:
       kev.service.type: LoadBalancer
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service wordpress"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
diff --git a/pkg/kev/testdata/reconcile-service-healthcheck/docker-compose.kev.dev.yaml b/pkg/kev/testdata/reconcile-service-healthcheck/docker-compose.kev.dev.yaml
index bae64c0..011b45c 100644
--- a/pkg/kev/testdata/reconcile-service-healthcheck/docker-compose.kev.dev.yaml
+++ b/pkg/kev/testdata/reconcile-service-healthcheck/docker-compose.kev.dev.yaml
@@ -5,8 +5,8 @@ services:
       kev.service.type: None
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: none
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service db"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
diff --git a/pkg/kev/testdata/reconcile-service-removal/docker-compose.kev.dev.yaml b/pkg/kev/testdata/reconcile-service-removal/docker-compose.kev.dev.yaml
index 382b54d..1322b2f 100644
--- a/pkg/kev/testdata/reconcile-service-removal/docker-compose.kev.dev.yaml
+++ b/pkg/kev/testdata/reconcile-service-removal/docker-compose.kev.dev.yaml
@@ -5,8 +5,8 @@ services:
       kev.service.type: None
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service db"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
@@ -23,8 +23,8 @@ services:
       kev.service.type: LoadBalancer
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service wordpress"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
diff --git a/pkg/kev/testdata/reconcile-version/docker-compose.kev.dev.yaml b/pkg/kev/testdata/reconcile-version/docker-compose.kev.dev.yaml
index bae64c0..9ea13a2 100644
--- a/pkg/kev/testdata/reconcile-version/docker-compose.kev.dev.yaml
+++ b/pkg/kev/testdata/reconcile-version/docker-compose.kev.dev.yaml
@@ -5,8 +5,8 @@ services:
       kev.service.type: None
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service db"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
diff --git a/pkg/kev/testdata/reconcile-volume-add/docker-compose.kev.dev.yaml b/pkg/kev/testdata/reconcile-volume-add/docker-compose.kev.dev.yaml
index 825f9fd..e9e53c7 100644
--- a/pkg/kev/testdata/reconcile-volume-add/docker-compose.kev.dev.yaml
+++ b/pkg/kev/testdata/reconcile-volume-add/docker-compose.kev.dev.yaml
@@ -5,8 +5,8 @@ services:
       kev.service.type: None
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service db"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
@@ -23,8 +23,8 @@ services:
       kev.service.type: LoadBalancer
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service wordpress"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
diff --git a/pkg/kev/testdata/reconcile-volume-edit/docker-compose.kev.dev.yaml b/pkg/kev/testdata/reconcile-volume-edit/docker-compose.kev.dev.yaml
index 382b54d..1322b2f 100644
--- a/pkg/kev/testdata/reconcile-volume-edit/docker-compose.kev.dev.yaml
+++ b/pkg/kev/testdata/reconcile-volume-edit/docker-compose.kev.dev.yaml
@@ -5,8 +5,8 @@ services:
       kev.service.type: None
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service db"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
@@ -23,8 +23,8 @@ services:
       kev.service.type: LoadBalancer
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service wordpress"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
diff --git a/pkg/kev/testdata/reconcile-volume-removal/docker-compose.kev.dev.yaml b/pkg/kev/testdata/reconcile-volume-removal/docker-compose.kev.dev.yaml
index c2f2f0c..238f836 100644
--- a/pkg/kev/testdata/reconcile-volume-removal/docker-compose.kev.dev.yaml
+++ b/pkg/kev/testdata/reconcile-volume-removal/docker-compose.kev.dev.yaml
@@ -5,8 +5,8 @@ services:
       kev.service.type: None
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service db"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
@@ -23,8 +23,8 @@ services:
       kev.service.type: LoadBalancer
       kev.workload.cpu: "0.1"
       kev.workload.image-pull-policy: IfNotPresent
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service wordpress"]'
-      kev.workload.liveness-probe-disabled: "false"
       kev.workload.liveness-probe-initial-delay: 1m0s
       kev.workload.liveness-probe-interval: 1m0s
       kev.workload.liveness-probe-retries: "3"
diff --git a/pkg/kev/testdata/validation/docker-compose.kev.dev.yaml b/pkg/kev/testdata/validation/docker-compose.kev.dev.yaml
index 3d2dcbf..5b29502 100644
--- a/pkg/kev/testdata/validation/docker-compose.kev.dev.yaml
+++ b/pkg/kev/testdata/validation/docker-compose.kev.dev.yaml
@@ -2,10 +2,12 @@ version: "3.7"
 services:
   db:
     labels:
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service db"]'
       kev.workload.replicas: "1"
   wordpress:
     labels:
+      kev.workload.liveness-probe-type: command
       kev.workload.liveness-probe-command: '["CMD", "echo", "Define healthcheck command for service wordpress"]'
       kev.workload.replicas: "1"
       kev.workload.unknown: "unknown-value"