Repository: kyverno/chainsaw
Pull request #372 (2023-11-03 23:22:05)

refactor: operation api
Refactor operation api.

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/kyverno/chainsaw/pull/372?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kyverno) Report
> Merging [#372](https://app.codecov.io/gh/kyverno/chainsaw/pull/372?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kyverno) (6ae50d3) into [main](https://app.codecov.io/gh/kyverno/chainsaw/commit/e1516a944a7864478bdfdf99d54df85a432643d2?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kyverno) (e1516a9) will **not change** coverage.
> The diff coverage is `0.00%`.

```diff
@@           Coverage Diff           @@
##             main     #372   +/-   ##
=======================================
  Coverage   73.28%   73.28%           
=======================================
  Files          49       49           
  Lines        1662     1662           
=======================================
  Hits         1218     1218           
  Misses        397      397           
  Partials       47       47           
```


| [Files](https://app.codecov.io/gh/kyverno/chainsaw/pull/372?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kyverno) | Coverage Δ | |
|---|---|---|
| [pkg/runner/operations/client.go](https://app.codecov.io/gh/kyverno/chainsaw/pull/372?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kyverno#diff-cGtnL3J1bm5lci9vcGVyYXRpb25zL2NsaWVudC5nbw==) | `0.00% <0.00%> (ø)` | |

:mega: Codecov offers a browser extension for seamless coverage viewing on GitHub. Try it in [Chrome](https://chrome.google.com/webstore/detail/codecov/gedikamndpbemklijjkncpnolildpbgo) or [Firefox](https://addons.mozilla.org/en-US/firefox/addon/codecov/) today!


Patch:
diff --git a/pkg/apis/v1alpha1/apply.go b/pkg/apis/v1alpha1/apply.go
index 40238912..f94258af 100644
--- a/pkg/apis/v1alpha1/apply.go
+++ b/pkg/apis/v1alpha1/apply.go
@@ -1,25 +1,12 @@
 package v1alpha1
 
-import (
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
 // Apply represents a set of configurations or resources that
 // should be applied during testing.
 type Apply struct {
 	// FileRef provides a reference to the file containing the
 	FileRef `json:",inline"`
 
-	// Timeout for the operation. Overrides the global timeout set in the Configuration.
-	// +optional
-	Timeout *metav1.Duration `json:"timeout,omitempty"`
-
 	// ShouldFail determines whether applying the file is expected to fail.
 	// +optional
 	ShouldFail *bool `json:"shouldFail,omitempty"`
-
-	// ContinueOnError determines whether a test should continue or not in case the operation was not successful.
-	// Even if the test continues executing, it will still be reported as failed.
-	// +optional
-	ContinueOnError *bool `json:"continueOnError,omitempty"`
 }
diff --git a/pkg/apis/v1alpha1/assert.go b/pkg/apis/v1alpha1/assert.go
index 6018727f..13ac98cf 100644
--- a/pkg/apis/v1alpha1/assert.go
+++ b/pkg/apis/v1alpha1/assert.go
@@ -1,21 +1,8 @@
 package v1alpha1
 
-import (
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
 // Assert represents a test condition that is expected to hold true
 // during the testing process.
 type Assert struct {
 	// FileRef provides a reference to the file containing the assertion.
 	FileRef `json:",inline"`
-
-	// Timeout for the operation. Overrides the global timeout set in the Configuration.
-	// +optional
-	Timeout *metav1.Duration `json:"timeout,omitempty"`
-
-	// ContinueOnError determines whether a test should continue or not in case the operation was not successful.
-	// Even if the test continues executing, it will still be reported as failed.
-	// +optional
-	ContinueOnError *bool `json:"continueOnError,omitempty"`
 }
diff --git a/pkg/apis/v1alpha1/create.go b/pkg/apis/v1alpha1/create.go
index ef44c50f..2645c878 100644
--- a/pkg/apis/v1alpha1/create.go
+++ b/pkg/apis/v1alpha1/create.go
@@ -1,25 +1,12 @@
 package v1alpha1
 
-import (
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
 // Create represents a set of resources that should be created.
 // If a resource already exists in the cluster it will fail.
 type Create struct {
 	// FileRef provides a reference to the file containing the
 	FileRef `json:",inline"`
 
-	// Timeout for the operation. Overrides the global timeout set in the Configuration.
-	// +optional
-	Timeout *metav1.Duration `json:"timeout,omitempty"`
-
 	// ShouldFail determines whether applying the file is expected to fail.
 	// +optional
 	ShouldFail *bool `json:"shouldFail,omitempty"`
-
-	// ContinueOnError determines whether a test should continue or not in case the operation was not successful.
-	// Even if the test continues executing, it will still be reported as failed.
-	// +optional
-	ContinueOnError *bool `json:"continueOnError,omitempty"`
 }
diff --git a/pkg/apis/v1alpha1/delete.go b/pkg/apis/v1alpha1/delete.go
index 46de5078..3eab4e6b 100644
--- a/pkg/apis/v1alpha1/delete.go
+++ b/pkg/apis/v1alpha1/delete.go
@@ -1,20 +1,7 @@
 package v1alpha1
 
-import (
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
 // Delete is a reference to an object that should be deleted
 type Delete struct {
 	// ObjectReference determines objects to be deleted.
 	ObjectReference `json:",inline"`
-
-	// Timeout for the operation. Overrides the global timeout set in the Configuration.
-	// +optional
-	Timeout *metav1.Duration `json:"timeout,omitempty"`
-
-	// ContinueOnError determines whether a test should continue or not in case the operation was not successful.
-	// Even if the test continues executing, it will still be reported as failed.
-	// +optional
-	ContinueOnError *bool `json:"continueOnError,omitempty"`
 }
diff --git a/pkg/apis/v1alpha1/error.go b/pkg/apis/v1alpha1/error.go
index 8153d1ed..30edcd2f 100644
--- a/pkg/apis/v1alpha1/error.go
+++ b/pkg/apis/v1alpha1/error.go
@@ -1,21 +1,8 @@
 package v1alpha1
 
-import (
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
 // Error represents an anticipated error condition that may arise during testing.
 // Instead of treating such an error as a test failure, it acknowledges it as expected.
 type Error struct {
 	// FileRef provides a reference to the file containing the expected error.
 	FileRef `json:",inline"`
-
-	// Timeout for the operation. Overrides the global timeout set in the Configuration.
-	// +optional
-	Timeout *metav1.Duration `json:"timeout,omitempty"`
-
-	// ContinueOnError determines whether a test should continue or not in case the operation was not successful.
-	// Even if the test continues executing, it will still be reported as failed.
-	// +optional
-	ContinueOnError *bool `json:"continueOnError,omitempty"`
 }
diff --git a/pkg/apis/v1alpha1/exec.go b/pkg/apis/v1alpha1/exec.go
index db6546da..9decfc82 100644
--- a/pkg/apis/v1alpha1/exec.go
+++ b/pkg/apis/v1alpha1/exec.go
@@ -1,15 +1,7 @@
 package v1alpha1
 
-import (
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
 // Exec describes a command or script.
 type Exec struct {
-	// Timeout for the command. Overrides the global timeout set in the Configuration.
-	// +optional
-	Timeout *metav1.Duration `json:"timeout,omitempty"`
-
 	// Command defines a command to run.
 	// +optional
 	Command *Command `json:"command,omitempty"`
diff --git a/pkg/apis/v1alpha1/exec_operation.go b/pkg/apis/v1alpha1/exec_operation.go
index 7ff30883..1e243022 100644
--- a/pkg/apis/v1alpha1/exec_operation.go
+++ b/pkg/apis/v1alpha1/exec_operation.go
@@ -9,9 +9,4 @@ type ExecOperation struct {
 	// SkipLogOutput removes the output from the command. Useful for sensitive logs or to reduce noise.
 	// +optional
 	SkipLogOutput bool `json:"skipLogOutput,omitempty"`
-
-	// ContinueOnError determines whether a test should continue or not in case the operation was not successful.
-	// Even if the test continues executing, it will still be reported as failed.
-	// +optional
-	ContinueOnError *bool `json:"continueOnError,omitempty"`
 }
diff --git a/pkg/apis/v1alpha1/operation.go b/pkg/apis/v1alpha1/operation.go
index db9d58f5..34979503 100644
--- a/pkg/apis/v1alpha1/operation.go
+++ b/pkg/apis/v1alpha1/operation.go
@@ -1,6 +1,19 @@
 package v1alpha1
 
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
 type Operation struct {
+	// Timeout for the operation. Overrides the global timeout set in the Configuration.
+	// +optional
+	Timeout *metav1.Duration `json:"timeout,omitempty"`
+
+	// ContinueOnError determines whether a test should continue or not in case the operation was not successful.
+	// Even if the test continues executing, it will still be reported as failed.
+	// +optional
+	ContinueOnError *bool `json:"continueOnError,omitempty"`
+
 	// Assert represents an assertion to be made. It checks whether the conditions specified in the assertion hold true.
 	// +optional
 	Assert *Assert `json:"assert,omitempty"`
diff --git a/pkg/apis/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/v1alpha1/zz_generated.deepcopy.go
index 5ce3a626..1a6955fb 100644
--- a/pkg/apis/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/v1alpha1/zz_generated.deepcopy.go
@@ -30,21 +30,11 @@ import (
 func (in *Apply) DeepCopyInto(out *Apply) {
 	*out = *in
 	out.FileRef = in.FileRef
-	if in.Timeout != nil {
-		in, out := &in.Timeout, &out.Timeout
-		*out = new(v1.Duration)
-		**out = **in
-	}
 	if in.ShouldFail != nil {
 		in, out := &in.ShouldFail, &out.ShouldFail
 		*out = new(bool)
 		**out = **in
 	}
-	if in.ContinueOnError != nil {
-		in, out := &in.ContinueOnError, &out.ContinueOnError
-		*out = new(bool)
-		**out = **in
-	}
 	return
 }
 
@@ -62,16 +52,6 @@ func (in *Apply) DeepCopy() *Apply {
 func (in *Assert) DeepCopyInto(out *Assert) {
 	*out = *in
 	out.FileRef = in.FileRef
-	if in.Timeout != nil {
-		in, out := &in.Timeout, &out.Timeout
-		*out = new(v1.Duration)
-		**out = **in
-	}
-	if in.ContinueOnError != nil {
-		in, out := &in.ContinueOnError, &out.ContinueOnError
-		*out = new(bool)
-		**out = **in
-	}
 	return
 }
 
@@ -221,21 +201,11 @@ func (in *ConfigurationSpec) DeepCopy() *ConfigurationSpec {
 func (in *Create) DeepCopyInto(out *Create) {
 	*out = *in
 	out.FileRef = in.FileRef
-	if in.Timeout != nil {
-		in, out := &in.Timeout, &out.Timeout
-		*out = new(v1.Duration)
-		**out = **in
-	}
 	if in.ShouldFail != nil {
 		in, out := &in.ShouldFail, &out.ShouldFail
 		*out = new(bool)
 		**out = **in
 	}
-	if in.ContinueOnError != nil {
-		in, out := &in.ContinueOnError, &out.ContinueOnError
-		*out = new(bool)
-		**out = **in
-	}
 	return
 }
 
@@ -253,16 +223,6 @@ func (in *Create) DeepCopy() *Create {
 func (in *Delete) DeepCopyInto(out *Delete) {
 	*out = *in
 	in.ObjectReference.DeepCopyInto(&out.ObjectReference)
-	if in.Timeout != nil {
-		in, out := &in.Timeout, &out.Timeout
-		*out = new(v1.Duration)
-		**out = **in
-	}
-	if in.ContinueOnError != nil {
-		in, out := &in.ContinueOnError, &out.ContinueOnError
-		*out = new(bool)
-		**out = **in
-	}
 	return
 }
 
@@ -280,16 +240,6 @@ func (in *Delete) DeepCopy() *Delete {
 func (in *Error) DeepCopyInto(out *Error) {
 	*out = *in
 	out.FileRef = in.FileRef
-	if in.Timeout != nil {
-		in, out := &in.Timeout, &out.Timeout
-		*out = new(v1.Duration)
-		**out = **in
-	}
-	if in.ContinueOnError != nil {
-		in, out := &in.ContinueOnError, &out.ContinueOnError
-		*out = new(bool)
-		**out = **in
-	}
 	return
 }
 
@@ -322,11 +272,6 @@ func (in *Events) DeepCopy() *Events {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *Exec) DeepCopyInto(out *Exec) {
 	*out = *in
-	if in.Timeout != nil {
-		in, out := &in.Timeout, &out.Timeout
-		*out = new(v1.Duration)
-		**out = **in
-	}
 	if in.Command != nil {
 		in, out := &in.Command, &out.Command
 		*out = new(Command)
@@ -354,11 +299,6 @@ func (in *Exec) DeepCopy() *Exec {
 func (in *ExecOperation) DeepCopyInto(out *ExecOperation) {
 	*out = *in
 	in.Exec.DeepCopyInto(&out.Exec)
-	if in.ContinueOnError != nil {
-		in, out := &in.ContinueOnError, &out.ContinueOnError
-		*out = new(bool)
-		**out = **in
-	}
 	return
 }
 
@@ -457,10 +397,20 @@ func (in *ObjectSelector) DeepCopy() *ObjectSelector {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *Operation) DeepCopyInto(out *Operation) {
 	*out = *in
+	if in.Timeout != nil {
+		in, out := &in.Timeout, &out.Timeout
+		*out = new(v1.Duration)
+		**out = **in
+	}
+	if in.ContinueOnError != nil {
+		in, out := &in.ContinueOnError, &out.ContinueOnError
+		*out = new(bool)
+		**out = **in
+	}
 	if in.Assert != nil {
 		in, out := &in.Assert, &out.Assert
 		*out = new(Assert)
-		(*in).DeepCopyInto(*out)
+		**out = **in
 	}
 	if in.Apply != nil {
 		in, out := &in.Apply, &out.Apply
@@ -475,7 +425,7 @@ func (in *Operation) DeepCopyInto(out *Operation) {
 	if in.Error != nil {
 		in, out := &in.Error, &out.Error
 		*out = new(Error)
-		(*in).DeepCopyInto(*out)
+		**out = **in
 	}
 	if in.Delete != nil {
 		in, out := &in.Delete, &out.Delete
diff --git a/pkg/runner/operations/client.go b/pkg/runner/operations/client.go
index 8a9ce7e1..4e5331da 100644
--- a/pkg/runner/operations/client.go
+++ b/pkg/runner/operations/client.go
@@ -21,7 +21,7 @@ type Client interface {
 	Create(context.Context, *metav1.Duration, ctrlclient.Object, bool, cleanup.Cleaner) error
 	Delete(context.Context, *metav1.Duration, ctrlclient.Object) error
 	Error(context.Context, *metav1.Duration, unstructured.Unstructured) error
-	Exec(context.Context, v1alpha1.Exec, bool, string) error
+	Exec(context.Context, *metav1.Duration, v1alpha1.Exec, bool, string) error
 }
 
 type opClient struct {
@@ -103,8 +103,8 @@ func (c *opClient) Error(ctx context.Context, to *metav1.Duration, expected unst
 	return operationError(ctx, expected, c.client)
 }
 
-func (c *opClient) Exec(ctx context.Context, exec v1alpha1.Exec, log bool, namespace string) error {
-	ctx, cancel := timeout.Context(ctx, timeout.DefaultExecTimeout, c.config.Timeouts.Exec, c.test.Timeouts.Exec, c.stepTimeouts.Exec, exec.Timeout)
+func (c *opClient) Exec(ctx context.Context, to *metav1.Duration, exec v1alpha1.Exec, log bool, namespace string) error {
+	ctx, cancel := timeout.Context(ctx, timeout.DefaultExecTimeout, c.config.Timeouts.Exec, c.test.Timeouts.Exec, c.stepTimeouts.Exec, to)
 	defer cancel()
 	return operationExec(ctx, exec, log, namespace)
 }
diff --git a/pkg/runner/processors/operation.go b/pkg/runner/processors/operation.go
index bb60412a..bb18f5d4 100644
--- a/pkg/runner/processors/operation.go
+++ b/pkg/runner/processors/operation.go
@@ -54,15 +54,15 @@ func (p *operationProcessor) Run(ctx context.Context, namespace string, test dis
 		resource.SetName(operation.Delete.Name)
 		resource.SetNamespace(operation.Delete.Namespace)
 		resource.SetLabels(operation.Delete.Labels)
-		if err := p.client.Delete(ctx, operation.Delete.Timeout, &resource); err != nil {
-			fail(t, operation.Delete.ContinueOnError)
+		if err := p.client.Delete(ctx, operation.Timeout, &resource); err != nil {
+			fail(t, operation.ContinueOnError)
 		}
 	}
 
 	// Handle Exec
 	if operation.Exec != nil {
-		if err := p.client.Exec(ctx, operation.Exec.Exec, !operation.Exec.SkipLogOutput, namespace); err != nil {
-			fail(t, operation.Exec.ContinueOnError)
+		if err := p.client.Exec(ctx, operation.Timeout, operation.Exec.Exec, !operation.Exec.SkipLogOutput, namespace); err != nil {
+			fail(t, operation.ContinueOnError)
 		}
 	}
 
@@ -81,13 +81,13 @@ func (p *operationProcessor) Run(ctx context.Context, namespace string, test dis
 		resources, err := resource.Load(filepath.Join(test.BasePath, operation.Apply.File))
 		if err != nil {
 			logging.FromContext(ctx).Log("LOAD  ", color.BoldRed, err)
-			fail(t, operation.Apply.ContinueOnError)
+			fail(t, operation.ContinueOnError)
 		}
 		shouldFail := operation.Apply.ShouldFail != nil && *operation.Apply.ShouldFail
 		for i := range resources {
 			resource := &resources[i]
-			if err := p.client.Apply(ctx, operation.Apply.Timeout, resource, shouldFail, cleaner); err != nil {
-				fail(t, operation.Apply.ContinueOnError)
+			if err := p.client.Apply(ctx, operation.Timeout, resource, shouldFail, cleaner); err != nil {
+				fail(t, operation.ContinueOnError)
 			}
 		}
 	}
@@ -97,13 +97,13 @@ func (p *operationProcessor) Run(ctx context.Context, namespace string, test dis
 		resources, err := resource.Load(filepath.Join(test.BasePath, operation.Create.File))
 		if err != nil {
 			logging.FromContext(ctx).Log("LOAD  ", color.BoldRed, err)
-			fail(t, operation.Create.ContinueOnError)
+			fail(t, operation.ContinueOnError)
 		}
 		shouldFail := operation.Create.ShouldFail != nil && *operation.Create.ShouldFail
 		for i := range resources {
 			resource := &resources[i]
-			if err := p.client.Apply(ctx, operation.Create.Timeout, resource, shouldFail, cleaner); err != nil {
-				fail(t, operation.Create.ContinueOnError)
+			if err := p.client.Apply(ctx, operation.Timeout, resource, shouldFail, cleaner); err != nil {
+				fail(t, operation.ContinueOnError)
 			}
 		}
 	}
@@ -113,11 +113,11 @@ func (p *operationProcessor) Run(ctx context.Context, namespace string, test dis
 		resources, err := resource.Load(filepath.Join(test.BasePath, operation.Assert.File))
 		if err != nil {
 			logging.FromContext(ctx).Log("LOAD  ", color.BoldRed, err)
-			fail(t, operation.Assert.ContinueOnError)
+			fail(t, operation.ContinueOnError)
 		}
 		for _, resource := range resources {
-			if err := p.client.Assert(ctx, operation.Assert.Timeout, resource); err != nil {
-				fail(t, operation.Assert.ContinueOnError)
+			if err := p.client.Assert(ctx, operation.Timeout, resource); err != nil {
+				fail(t, operation.ContinueOnError)
 			}
 		}
 	}
@@ -127,11 +127,11 @@ func (p *operationProcessor) Run(ctx context.Context, namespace string, test dis
 		resources, err := resource.Load(filepath.Join(test.BasePath, operation.Error.File))
 		if err != nil {
 			logging.FromContext(ctx).Log("LOAD  ", color.BoldRed, err)
-			fail(t, operation.Error.ContinueOnError)
+			fail(t, operation.ContinueOnError)
 		}
 		for _, resource := range resources {
-			if err := p.client.Error(ctx, operation.Error.Timeout, resource); err != nil {
-				fail(t, operation.Error.ContinueOnError)
+			if err := p.client.Error(ctx, operation.Timeout, resource); err != nil {
+				fail(t, operation.ContinueOnError)
 			}
 		}
 	}
diff --git a/pkg/runner/processors/step.go b/pkg/runner/processors/step.go
index 09a76e55..84aa06cc 100644
--- a/pkg/runner/processors/step.go
+++ b/pkg/runner/processors/step.go
@@ -48,13 +48,13 @@ func (p *stepProcessor) Run(ctx context.Context, nspacer namespacer.Namespacer,
 						exec := v1alpha1.Exec{
 							Command: collector,
 						}
-						if err := p.client.Exec(ctx, exec, true, nspacer.GetNamespace()); err != nil {
+						if err := p.client.Exec(ctx, nil, exec, true, nspacer.GetNamespace()); err != nil {
 							t.Fail()
 						}
 					}
 				}
 				if handler.Exec != nil {
-					if err := p.client.Exec(ctx, *handler.Exec, true, nspacer.GetNamespace()); err != nil {
+					if err := p.client.Exec(ctx, nil, *handler.Exec, true, nspacer.GetNamespace()); err != nil {
 						t.Fail()
 					}
 				}
@@ -74,13 +74,13 @@ func (p *stepProcessor) Run(ctx context.Context, nspacer namespacer.Namespacer,
 							exec := v1alpha1.Exec{
 								Command: collector,
 							}
-							if err := p.client.Exec(ctx, exec, true, nspacer.GetNamespace()); err != nil {
+							if err := p.client.Exec(ctx, nil, exec, true, nspacer.GetNamespace()); err != nil {
 								t.Fail()
 							}
 						}
 					}
 					if handler.Exec != nil {
-						if err := p.client.Exec(ctx, *handler.Exec, true, nspacer.GetNamespace()); err != nil {
+						if err := p.client.Exec(ctx, nil, *handler.Exec, true, nspacer.GetNamespace()); err != nil {
 							t.Fail()
 						}
 					}
diff --git a/website/docs/apis/chainsaw.v1alpha1.md b/website/docs/apis/chainsaw.v1alpha1.md
index e5a32789..cf5433be 100644
--- a/website/docs/apis/chainsaw.v1alpha1.md
+++ b/website/docs/apis/chainsaw.v1alpha1.md
@@ -63,9 +63,7 @@ should be applied during testing.</p>
 | Field | Type | Required | Inline | Description |
 |---|---|---|---|---|
 | `FileRef` | [`FileRef`](#chainsaw-kyverno-io-v1alpha1-FileRef) | :white_check_mark: | :white_check_mark: | <p>FileRef provides a reference to the file containing the</p> |
-| `timeout` | [`meta/v1.Duration`](https://pkg.go.dev/k8s.io/apimachinery/pkg/apis/meta/v1#Duration) |  |  | <p>Timeout for the operation. Overrides the global timeout set in the Configuration.</p> |
 | `shouldFail` | `bool` |  |  | <p>ShouldFail determines whether applying the file is expected to fail.</p> |
-| `continueOnError` | `bool` |  |  | <p>ContinueOnError determines whether a test should continue or not in case the operation was not successful. Even if the test continues executing, it will still be reported as failed.</p> |
 
 ## `Assert`     {#chainsaw-kyverno-io-v1alpha1-Assert}
 
@@ -80,8 +78,6 @@ during the testing process.</p>
 | Field | Type | Required | Inline | Description |
 |---|---|---|---|---|
 | `FileRef` | [`FileRef`](#chainsaw-kyverno-io-v1alpha1-FileRef) | :white_check_mark: | :white_check_mark: | <p>FileRef provides a reference to the file containing the assertion.</p> |
-| `timeout` | [`meta/v1.Duration`](https://pkg.go.dev/k8s.io/apimachinery/pkg/apis/meta/v1#Duration) |  |  | <p>Timeout for the operation. Overrides the global timeout set in the Configuration.</p> |
-| `continueOnError` | `bool` |  |  | <p>ContinueOnError determines whether a test should continue or not in case the operation was not successful. Even if the test continues executing, it will still be reported as failed.</p> |
 
 ## `Catch`     {#chainsaw-kyverno-io-v1alpha1-Catch}
 
@@ -163,9 +159,7 @@ If a resource already exists in the cluster it will fail.</p>
 | Field | Type | Required | Inline | Description |
 |---|---|---|---|---|
 | `FileRef` | [`FileRef`](#chainsaw-kyverno-io-v1alpha1-FileRef) | :white_check_mark: | :white_check_mark: | <p>FileRef provides a reference to the file containing the</p> |
-| `timeout` | [`meta/v1.Duration`](https://pkg.go.dev/k8s.io/apimachinery/pkg/apis/meta/v1#Duration) |  |  | <p>Timeout for the operation. Overrides the global timeout set in the Configuration.</p> |
 | `shouldFail` | `bool` |  |  | <p>ShouldFail determines whether applying the file is expected to fail.</p> |
-| `continueOnError` | `bool` |  |  | <p>ContinueOnError determines whether a test should continue or not in case the operation was not successful. Even if the test continues executing, it will still be reported as failed.</p> |
 
 ## `Delete`     {#chainsaw-kyverno-io-v1alpha1-Delete}
 
@@ -179,8 +173,6 @@ If a resource already exists in the cluster it will fail.</p>
 | Field | Type | Required | Inline | Description |
 |---|---|---|---|---|
 | `ObjectReference` | [`ObjectReference`](#chainsaw-kyverno-io-v1alpha1-ObjectReference) | :white_check_mark: | :white_check_mark: | <p>ObjectReference determines objects to be deleted.</p> |
-| `timeout` | [`meta/v1.Duration`](https://pkg.go.dev/k8s.io/apimachinery/pkg/apis/meta/v1#Duration) |  |  | <p>Timeout for the operation. Overrides the global timeout set in the Configuration.</p> |
-| `continueOnError` | `bool` |  |  | <p>ContinueOnError determines whether a test should continue or not in case the operation was not successful. Even if the test continues executing, it will still be reported as failed.</p> |
 
 ## `Error`     {#chainsaw-kyverno-io-v1alpha1-Error}
 
@@ -195,8 +187,6 @@ Instead of treating such an error as a test failure, it acknowledges it as expec
 | Field | Type | Required | Inline | Description |
 |---|---|---|---|---|
 | `FileRef` | [`FileRef`](#chainsaw-kyverno-io-v1alpha1-FileRef) | :white_check_mark: | :white_check_mark: | <p>FileRef provides a reference to the file containing the expected error.</p> |
-| `timeout` | [`meta/v1.Duration`](https://pkg.go.dev/k8s.io/apimachinery/pkg/apis/meta/v1#Duration) |  |  | <p>Timeout for the operation. Overrides the global timeout set in the Configuration.</p> |
-| `continueOnError` | `bool` |  |  | <p>ContinueOnError determines whether a test should continue or not in case the operation was not successful. Even if the test continues executing, it will still be reported as failed.</p> |
 
 ## `Events`     {#chainsaw-kyverno-io-v1alpha1-Events}
 
@@ -226,7 +216,6 @@ Instead of treating such an error as a test failure, it acknowledges it as expec
 
 | Field | Type | Required | Inline | Description |
 |---|---|---|---|---|
-| `timeout` | [`meta/v1.Duration`](https://pkg.go.dev/k8s.io/apimachinery/pkg/apis/meta/v1#Duration) |  |  | <p>Timeout for the command. Overrides the global timeout set in the Configuration.</p> |
 | `command` | [`Command`](#chainsaw-kyverno-io-v1alpha1-Command) |  |  | <p>Command defines a command to run.</p> |
 | `script` | [`Script`](#chainsaw-kyverno-io-v1alpha1-Script) |  |  | <p>Script defines a script to run.</p> |
 
@@ -243,7 +232,6 @@ Instead of treating such an error as a test failure, it acknowledges it as expec
 |---|---|---|---|---|
 | `Exec` | [`Exec`](#chainsaw-kyverno-io-v1alpha1-Exec) |  | :white_check_mark: | <p>Exec defines the command and/or script.</p> |
 | `skipLogOutput` | `bool` |  |  | <p>SkipLogOutput removes the output from the command. Useful for sensitive logs or to reduce noise.</p> |
-| `continueOnError` | `bool` |  |  | <p>ContinueOnError determines whether a test should continue or not in case the operation was not successful. Even if the test continues executing, it will still be reported as failed.</p> |
 
 ## `FileRef`     {#chainsaw-kyverno-io-v1alpha1-FileRef}
 
@@ -317,6 +305,8 @@ For multiple objects use labels.</p>
 
 | Field | Type | Required | Inline | Description |
 |---|---|---|---|---|
+| `timeout` | [`meta/v1.Duration`](https://pkg.go.dev/k8s.io/apimachinery/pkg/apis/meta/v1#Duration) |  |  | <p>Timeout for the operation. Overrides the global timeout set in the Configuration.</p> |
+| `continueOnError` | `bool` |  |  | <p>ContinueOnError determines whether a test should continue or not in case the operation was not successful. Even if the test continues executing, it will still be reported as failed.</p> |
 | `assert` | [`Assert`](#chainsaw-kyverno-io-v1alpha1-Assert) |  |  | <p>Assert represents an assertion to be made. It checks whether the conditions specified in the assertion hold true.</p> |
 | `apply` | [`Apply`](#chainsaw-kyverno-io-v1alpha1-Apply) |  |  | <p>Apply represents resources that should be applied for this test step. This can include things like configuration settings or any other resources that need to be available during the test.</p> |
 | `create` | [`Create`](#chainsaw-kyverno-io-v1alpha1-Create) |  |  | <p>Create represents a creation operation.</p> |


Test patch:
diff --git a/.crds/chainsaw.kyverno.io_tests.yaml b/.crds/chainsaw.kyverno.io_tests.yaml
index a6002b21..14f61ddc 100644
--- a/.crds/chainsaw.kyverno.io_tests.yaml
+++ b/.crds/chainsaw.kyverno.io_tests.yaml
@@ -135,10 +135,6 @@ spec:
                                       with "sh -c ...").
                                     type: string
                                 type: object
-                              timeout:
-                                description: Timeout for the command. Overrides the
-                                  global timeout set in the Configuration.
-                                type: string
                             type: object
                         type: object
                       type: array
@@ -223,10 +219,6 @@ spec:
                                       with "sh -c ...").
                                     type: string
                                 type: object
-                              timeout:
-                                description: Timeout for the command. Overrides the
-                                  global timeout set in the Configuration.
-                                type: string
                             type: object
                         type: object
                       type: array
@@ -272,12 +264,6 @@ spec:
                               like configuration settings or any other resources that
                               need to be available during the test.
                             properties:
-                              continueOnError:
-                                description: ContinueOnError determines whether a
-                                  test should continue or not in case the operation
-                                  was not successful. Even if the test continues executing,
-                                  it will still be reported as failed.
-                                type: boolean
                               file:
                                 description: File is the path to the referenced file.
                                 type: string
@@ -285,10 +271,6 @@ spec:
                                 description: ShouldFail determines whether applying
                                   the file is expected to fail.
                                 type: boolean
-                              timeout:
-                                description: Timeout for the operation. Overrides
-                                  the global timeout set in the Configuration.
-                                type: string
                             required:
                             - file
                             type: object
@@ -297,31 +279,21 @@ spec:
                               It checks whether the conditions specified in the assertion
                               hold true.
                             properties:
-                              continueOnError:
-                                description: ContinueOnError determines whether a
-                                  test should continue or not in case the operation
-                                  was not successful. Even if the test continues executing,
-                                  it will still be reported as failed.
-                                type: boolean
                               file:
                                 description: File is the path to the referenced file.
                                 type: string
-                              timeout:
-                                description: Timeout for the operation. Overrides
-                                  the global timeout set in the Configuration.
-                                type: string
                             required:
                             - file
                             type: object
+                          continueOnError:
+                            description: ContinueOnError determines whether a test
+                              should continue or not in case the operation was not
+                              successful. Even if the test continues executing, it
+                              will still be reported as failed.
+                            type: boolean
                           create:
                             description: Create represents a creation operation.
                             properties:
-                              continueOnError:
-                                description: ContinueOnError determines whether a
-                                  test should continue or not in case the operation
-                                  was not successful. Even if the test continues executing,
-                                  it will still be reported as failed.
-                                type: boolean
                               file:
                                 description: File is the path to the referenced file.
                                 type: string
@@ -329,10 +301,6 @@ spec:
                                 description: ShouldFail determines whether applying
                                   the file is expected to fail.
                                 type: boolean
-                              timeout:
-                                description: Timeout for the operation. Overrides
-                                  the global timeout set in the Configuration.
-                                type: string
                             required:
                             - file
                             type: object
@@ -342,12 +310,6 @@ spec:
                               apiVersion:
                                 description: API version of the referent.
                                 type: string
-                              continueOnError:
-                                description: ContinueOnError determines whether a
-                                  test should continue or not in case the operation
-                                  was not successful. Even if the test continues executing,
-                                  it will still be reported as failed.
-                                type: boolean
                               kind:
                                 description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
                                 type: string
@@ -363,10 +325,6 @@ spec:
                                 description: 'Namespace of the referent. More info:
                                   https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
                                 type: string
-                              timeout:
-                                description: Timeout for the operation. Overrides
-                                  the global timeout set in the Configuration.
-                                type: string
                             required:
                             - apiVersion
                             - kind
@@ -377,19 +335,9 @@ spec:
                               will consider them as expected; otherwise, they will
                               be treated as test failures.
                             properties:
-                              continueOnError:
-                                description: ContinueOnError determines whether a
-                                  test should continue or not in case the operation
-                                  was not successful. Even if the test continues executing,
-                                  it will still be reported as failed.
-                                type: boolean
                               file:
                                 description: File is the path to the referenced file.
                                 type: string
-                              timeout:
-                                description: Timeout for the operation. Overrides
-                                  the global timeout set in the Configuration.
-                                type: string
                             required:
                             - file
                             type: object
@@ -412,12 +360,6 @@ spec:
                                 required:
                                 - entrypoint
                                 type: object
-                              continueOnError:
-                                description: ContinueOnError determines whether a
-                                  test should continue or not in case the operation
-                                  was not successful. Even if the test continues executing,
-                                  it will still be reported as failed.
-                                type: boolean
                               script:
                                 description: Script defines a script to run.
                                 properties:
@@ -431,11 +373,11 @@ spec:
                                   the command. Useful for sensitive logs or to reduce
                                   noise.
                                 type: boolean
-                              timeout:
-                                description: Timeout for the command. Overrides the
-                                  global timeout set in the Configuration.
-                                type: string
                             type: object
+                          timeout:
+                            description: Timeout for the operation. Overrides the
+                              global timeout set in the Configuration.
+                            type: string
                         type: object
                       type: array
                   required:
diff --git a/.crds/chainsaw.kyverno.io_teststeps.yaml b/.crds/chainsaw.kyverno.io_teststeps.yaml
index 78d6f837..a50ad41b 100644
--- a/.crds/chainsaw.kyverno.io_teststeps.yaml
+++ b/.crds/chainsaw.kyverno.io_teststeps.yaml
@@ -111,10 +111,6 @@ spec:
                                 "sh -c ...").
                               type: string
                           type: object
-                        timeout:
-                          description: Timeout for the command. Overrides the global
-                            timeout set in the Configuration.
-                          type: string
                       type: object
                   type: object
                 type: array
@@ -195,10 +191,6 @@ spec:
                                 "sh -c ...").
                               type: string
                           type: object
-                        timeout:
-                          description: Timeout for the command. Overrides the global
-                            timeout set in the Configuration.
-                          type: string
                       type: object
                   type: object
                 type: array
@@ -240,12 +232,6 @@ spec:
                         settings or any other resources that need to be available
                         during the test.
                       properties:
-                        continueOnError:
-                          description: ContinueOnError determines whether a test should
-                            continue or not in case the operation was not successful.
-                            Even if the test continues executing, it will still be
-                            reported as failed.
-                          type: boolean
                         file:
                           description: File is the path to the referenced file.
                           type: string
@@ -253,10 +239,6 @@ spec:
                           description: ShouldFail determines whether applying the
                             file is expected to fail.
                           type: boolean
-                        timeout:
-                          description: Timeout for the operation. Overrides the global
-                            timeout set in the Configuration.
-                          type: string
                       required:
                       - file
                       type: object
@@ -264,31 +246,21 @@ spec:
                       description: Assert represents an assertion to be made. It checks
                         whether the conditions specified in the assertion hold true.
                       properties:
-                        continueOnError:
-                          description: ContinueOnError determines whether a test should
-                            continue or not in case the operation was not successful.
-                            Even if the test continues executing, it will still be
-                            reported as failed.
-                          type: boolean
                         file:
                           description: File is the path to the referenced file.
                           type: string
-                        timeout:
-                          description: Timeout for the operation. Overrides the global
-                            timeout set in the Configuration.
-                          type: string
                       required:
                       - file
                       type: object
+                    continueOnError:
+                      description: ContinueOnError determines whether a test should
+                        continue or not in case the operation was not successful.
+                        Even if the test continues executing, it will still be reported
+                        as failed.
+                      type: boolean
                     create:
                       description: Create represents a creation operation.
                       properties:
-                        continueOnError:
-                          description: ContinueOnError determines whether a test should
-                            continue or not in case the operation was not successful.
-                            Even if the test continues executing, it will still be
-                            reported as failed.
-                          type: boolean
                         file:
                           description: File is the path to the referenced file.
                           type: string
@@ -296,10 +268,6 @@ spec:
                           description: ShouldFail determines whether applying the
                             file is expected to fail.
                           type: boolean
-                        timeout:
-                          description: Timeout for the operation. Overrides the global
-                            timeout set in the Configuration.
-                          type: string
                       required:
                       - file
                       type: object
@@ -309,12 +277,6 @@ spec:
                         apiVersion:
                           description: API version of the referent.
                           type: string
-                        continueOnError:
-                          description: ContinueOnError determines whether a test should
-                            continue or not in case the operation was not successful.
-                            Even if the test continues executing, it will still be
-                            reported as failed.
-                          type: boolean
                         kind:
                           description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
                           type: string
@@ -329,10 +291,6 @@ spec:
                         namespace:
                           description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
                           type: string
-                        timeout:
-                          description: Timeout for the operation. Overrides the global
-                            timeout set in the Configuration.
-                          type: string
                       required:
                       - apiVersion
                       - kind
@@ -343,19 +301,9 @@ spec:
                         them as expected; otherwise, they will be treated as test
                         failures.
                       properties:
-                        continueOnError:
-                          description: ContinueOnError determines whether a test should
-                            continue or not in case the operation was not successful.
-                            Even if the test continues executing, it will still be
-                            reported as failed.
-                          type: boolean
                         file:
                           description: File is the path to the referenced file.
                           type: string
-                        timeout:
-                          description: Timeout for the operation. Overrides the global
-                            timeout set in the Configuration.
-                          type: string
                       required:
                       - file
                       type: object
@@ -378,12 +326,6 @@ spec:
                           required:
                           - entrypoint
                           type: object
-                        continueOnError:
-                          description: ContinueOnError determines whether a test should
-                            continue or not in case the operation was not successful.
-                            Even if the test continues executing, it will still be
-                            reported as failed.
-                          type: boolean
                         script:
                           description: Script defines a script to run.
                           properties:
@@ -396,11 +338,11 @@ spec:
                           description: SkipLogOutput removes the output from the command.
                             Useful for sensitive logs or to reduce noise.
                           type: boolean
-                        timeout:
-                          description: Timeout for the command. Overrides the global
-                            timeout set in the Configuration.
-                          type: string
                       type: object
+                    timeout:
+                      description: Timeout for the operation. Overrides the global
+                        timeout set in the Configuration.
+                      type: string
                   type: object
                 type: array
             required:
diff --git a/pkg/data/crds/chainsaw.kyverno.io_tests.yaml b/pkg/data/crds/chainsaw.kyverno.io_tests.yaml
index a6002b21..14f61ddc 100644
--- a/pkg/data/crds/chainsaw.kyverno.io_tests.yaml
+++ b/pkg/data/crds/chainsaw.kyverno.io_tests.yaml
@@ -135,10 +135,6 @@ spec:
                                       with "sh -c ...").
                                     type: string
                                 type: object
-                              timeout:
-                                description: Timeout for the command. Overrides the
-                                  global timeout set in the Configuration.
-                                type: string
                             type: object
                         type: object
                       type: array
@@ -223,10 +219,6 @@ spec:
                                       with "sh -c ...").
                                     type: string
                                 type: object
-                              timeout:
-                                description: Timeout for the command. Overrides the
-                                  global timeout set in the Configuration.
-                                type: string
                             type: object
                         type: object
                       type: array
@@ -272,12 +264,6 @@ spec:
                               like configuration settings or any other resources that
                               need to be available during the test.
                             properties:
-                              continueOnError:
-                                description: ContinueOnError determines whether a
-                                  test should continue or not in case the operation
-                                  was not successful. Even if the test continues executing,
-                                  it will still be reported as failed.
-                                type: boolean
                               file:
                                 description: File is the path to the referenced file.
                                 type: string
@@ -285,10 +271,6 @@ spec:
                                 description: ShouldFail determines whether applying
                                   the file is expected to fail.
                                 type: boolean
-                              timeout:
-                                description: Timeout for the operation. Overrides
-                                  the global timeout set in the Configuration.
-                                type: string
                             required:
                             - file
                             type: object
@@ -297,31 +279,21 @@ spec:
                               It checks whether the conditions specified in the assertion
                               hold true.
                             properties:
-                              continueOnError:
-                                description: ContinueOnError determines whether a
-                                  test should continue or not in case the operation
-                                  was not successful. Even if the test continues executing,
-                                  it will still be reported as failed.
-                                type: boolean
                               file:
                                 description: File is the path to the referenced file.
                                 type: string
-                              timeout:
-                                description: Timeout for the operation. Overrides
-                                  the global timeout set in the Configuration.
-                                type: string
                             required:
                             - file
                             type: object
+                          continueOnError:
+                            description: ContinueOnError determines whether a test
+                              should continue or not in case the operation was not
+                              successful. Even if the test continues executing, it
+                              will still be reported as failed.
+                            type: boolean
                           create:
                             description: Create represents a creation operation.
                             properties:
-                              continueOnError:
-                                description: ContinueOnError determines whether a
-                                  test should continue or not in case the operation
-                                  was not successful. Even if the test continues executing,
-                                  it will still be reported as failed.
-                                type: boolean
                               file:
                                 description: File is the path to the referenced file.
                                 type: string
@@ -329,10 +301,6 @@ spec:
                                 description: ShouldFail determines whether applying
                                   the file is expected to fail.
                                 type: boolean
-                              timeout:
-                                description: Timeout for the operation. Overrides
-                                  the global timeout set in the Configuration.
-                                type: string
                             required:
                             - file
                             type: object
@@ -342,12 +310,6 @@ spec:
                               apiVersion:
                                 description: API version of the referent.
                                 type: string
-                              continueOnError:
-                                description: ContinueOnError determines whether a
-                                  test should continue or not in case the operation
-                                  was not successful. Even if the test continues executing,
-                                  it will still be reported as failed.
-                                type: boolean
                               kind:
                                 description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
                                 type: string
@@ -363,10 +325,6 @@ spec:
                                 description: 'Namespace of the referent. More info:
                                   https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
                                 type: string
-                              timeout:
-                                description: Timeout for the operation. Overrides
-                                  the global timeout set in the Configuration.
-                                type: string
                             required:
                             - apiVersion
                             - kind
@@ -377,19 +335,9 @@ spec:
                               will consider them as expected; otherwise, they will
                               be treated as test failures.
                             properties:
-                              continueOnError:
-                                description: ContinueOnError determines whether a
-                                  test should continue or not in case the operation
-                                  was not successful. Even if the test continues executing,
-                                  it will still be reported as failed.
-                                type: boolean
                               file:
                                 description: File is the path to the referenced file.
                                 type: string
-                              timeout:
-                                description: Timeout for the operation. Overrides
-                                  the global timeout set in the Configuration.
-                                type: string
                             required:
                             - file
                             type: object
@@ -412,12 +360,6 @@ spec:
                                 required:
                                 - entrypoint
                                 type: object
-                              continueOnError:
-                                description: ContinueOnError determines whether a
-                                  test should continue or not in case the operation
-                                  was not successful. Even if the test continues executing,
-                                  it will still be reported as failed.
-                                type: boolean
                               script:
                                 description: Script defines a script to run.
                                 properties:
@@ -431,11 +373,11 @@ spec:
                                   the command. Useful for sensitive logs or to reduce
                                   noise.
                                 type: boolean
-                              timeout:
-                                description: Timeout for the command. Overrides the
-                                  global timeout set in the Configuration.
-                                type: string
                             type: object
+                          timeout:
+                            description: Timeout for the operation. Overrides the
+                              global timeout set in the Configuration.
+                            type: string
                         type: object
                       type: array
                   required:
diff --git a/pkg/data/crds/chainsaw.kyverno.io_teststeps.yaml b/pkg/data/crds/chainsaw.kyverno.io_teststeps.yaml
index 78d6f837..a50ad41b 100644
--- a/pkg/data/crds/chainsaw.kyverno.io_teststeps.yaml
+++ b/pkg/data/crds/chainsaw.kyverno.io_teststeps.yaml
@@ -111,10 +111,6 @@ spec:
                                 "sh -c ...").
                               type: string
                           type: object
-                        timeout:
-                          description: Timeout for the command. Overrides the global
-                            timeout set in the Configuration.
-                          type: string
                       type: object
                   type: object
                 type: array
@@ -195,10 +191,6 @@ spec:
                                 "sh -c ...").
                               type: string
                           type: object
-                        timeout:
-                          description: Timeout for the command. Overrides the global
-                            timeout set in the Configuration.
-                          type: string
                       type: object
                   type: object
                 type: array
@@ -240,12 +232,6 @@ spec:
                         settings or any other resources that need to be available
                         during the test.
                       properties:
-                        continueOnError:
-                          description: ContinueOnError determines whether a test should
-                            continue or not in case the operation was not successful.
-                            Even if the test continues executing, it will still be
-                            reported as failed.
-                          type: boolean
                         file:
                           description: File is the path to the referenced file.
                           type: string
@@ -253,10 +239,6 @@ spec:
                           description: ShouldFail determines whether applying the
                             file is expected to fail.
                           type: boolean
-                        timeout:
-                          description: Timeout for the operation. Overrides the global
-                            timeout set in the Configuration.
-                          type: string
                       required:
                       - file
                       type: object
@@ -264,31 +246,21 @@ spec:
                       description: Assert represents an assertion to be made. It checks
                         whether the conditions specified in the assertion hold true.
                       properties:
-                        continueOnError:
-                          description: ContinueOnError determines whether a test should
-                            continue or not in case the operation was not successful.
-                            Even if the test continues executing, it will still be
-                            reported as failed.
-                          type: boolean
                         file:
                           description: File is the path to the referenced file.
                           type: string
-                        timeout:
-                          description: Timeout for the operation. Overrides the global
-                            timeout set in the Configuration.
-                          type: string
                       required:
                       - file
                       type: object
+                    continueOnError:
+                      description: ContinueOnError determines whether a test should
+                        continue or not in case the operation was not successful.
+                        Even if the test continues executing, it will still be reported
+                        as failed.
+                      type: boolean
                     create:
                       description: Create represents a creation operation.
                       properties:
-                        continueOnError:
-                          description: ContinueOnError determines whether a test should
-                            continue or not in case the operation was not successful.
-                            Even if the test continues executing, it will still be
-                            reported as failed.
-                          type: boolean
                         file:
                           description: File is the path to the referenced file.
                           type: string
@@ -296,10 +268,6 @@ spec:
                           description: ShouldFail determines whether applying the
                             file is expected to fail.
                           type: boolean
-                        timeout:
-                          description: Timeout for the operation. Overrides the global
-                            timeout set in the Configuration.
-                          type: string
                       required:
                       - file
                       type: object
@@ -309,12 +277,6 @@ spec:
                         apiVersion:
                           description: API version of the referent.
                           type: string
-                        continueOnError:
-                          description: ContinueOnError determines whether a test should
-                            continue or not in case the operation was not successful.
-                            Even if the test continues executing, it will still be
-                            reported as failed.
-                          type: boolean
                         kind:
                           description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
                           type: string
@@ -329,10 +291,6 @@ spec:
                         namespace:
                           description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
                           type: string
-                        timeout:
-                          description: Timeout for the operation. Overrides the global
-                            timeout set in the Configuration.
-                          type: string
                       required:
                       - apiVersion
                       - kind
@@ -343,19 +301,9 @@ spec:
                         them as expected; otherwise, they will be treated as test
                         failures.
                       properties:
-                        continueOnError:
-                          description: ContinueOnError determines whether a test should
-                            continue or not in case the operation was not successful.
-                            Even if the test continues executing, it will still be
-                            reported as failed.
-                          type: boolean
                         file:
                           description: File is the path to the referenced file.
                           type: string
-                        timeout:
-                          description: Timeout for the operation. Overrides the global
-                            timeout set in the Configuration.
-                          type: string
                       required:
                       - file
                       type: object
@@ -378,12 +326,6 @@ spec:
                           required:
                           - entrypoint
                           type: object
-                        continueOnError:
-                          description: ContinueOnError determines whether a test should
-                            continue or not in case the operation was not successful.
-                            Even if the test continues executing, it will still be
-                            reported as failed.
-                          type: boolean
                         script:
                           description: Script defines a script to run.
                           properties:
@@ -396,11 +338,11 @@ spec:
                           description: SkipLogOutput removes the output from the command.
                             Useful for sensitive logs or to reduce noise.
                           type: boolean
-                        timeout:
-                          description: Timeout for the command. Overrides the global
-                            timeout set in the Configuration.
-                          type: string
                       type: object
+                    timeout:
+                      description: Timeout for the operation. Overrides the global
+                        timeout set in the Configuration.
+                      type: string
                   type: object
                 type: array
             required:
diff --git a/pkg/discovery/discovery_test.go b/pkg/discovery/discovery_test.go
index ec795dfd..a1e0a2f8 100644
--- a/pkg/discovery/discovery_test.go
+++ b/pkg/discovery/discovery_test.go
@@ -38,8 +38,8 @@ func TestDiscoverTests(t *testing.T) {
 									FileRef: v1alpha1.FileRef{
 										File: "configmap.yaml",
 									},
-								}},
-							},
+								},
+							}},
 						},
 					}, {
 						Name: "assert configmap",
diff --git a/pkg/test/load_test.go b/pkg/test/load_test.go
index 3e676ac3..d5ad8b9c 100644
--- a/pkg/test/load_test.go
+++ b/pkg/test/load_test.go
@@ -67,8 +67,8 @@ func TestLoad(t *testing.T) {
 								FileRef: v1alpha1.FileRef{
 									File: "foo.yaml",
 								},
-							}},
-						},
+							},
+						}},
 						Catch: []v1alpha1.Catch{{
 							Collect: &v1alpha1.Collect{
 								PodLogs: &v1alpha1.PodLogs{
@@ -102,8 +102,8 @@ func TestLoad(t *testing.T) {
 								FileRef: v1alpha1.FileRef{
 									File: "bar.yaml",
 								},
-							}},
-						},
+							},
+						}},
 						Finally: []v1alpha1.Finally{{
 							Collect: &v1alpha1.Collect{
 								PodLogs: &v1alpha1.PodLogs{
diff --git a/testdata/step/custom-step.yaml b/testdata/step/custom-step.yaml
index 2f8f116a..1f6657dc 100644
--- a/testdata/step/custom-step.yaml
+++ b/testdata/step/custom-step.yaml
@@ -7,28 +7,28 @@ spec:
   try:
     - assert:
         file: /assertions/verify-service.yaml
-        timeout: 30s
-        continueOnError: false
+      timeout: 30s
+      continueOnError: false
     - apply:
         file: /configs/service-config.yaml
-        timeout: 45s
         shouldFail: false
-        continueOnError: true
+      timeout: 45s
+      continueOnError: true
     - error:
         file: /errors/expected-timeout-error.yaml
-        timeout: 15s
-        continueOnError: true
+      timeout: 15s
+      continueOnError: true
     - delete:
         apiVersion: v1
         kind: Pod
         name: example-pod
         namespace: test
-        timeout: 10s
-        continueOnError: false
+      timeout: 10s
+      continueOnError: false
     - exec:
+        skipLogOutput: false
         command:
           entrypoint: /bin/sh
           args:
           - echo "Executing script..."
-        skipLogOutput: false
-        continueOnError: true
+      continueOnError: true
diff --git a/testdata/test/custom-test.yaml b/testdata/test/custom-test.yaml
index f66da72f..1bae544a 100644
--- a/testdata/test/custom-test.yaml
+++ b/testdata/test/custom-test.yaml
@@ -15,17 +15,17 @@ spec:
     try:
     - apply:
         file: /configs/service-config.yaml
-        timeout: 45s
         shouldFail: false
-        continueOnError: true
+      timeout: 45s
+      continueOnError: true
   - name: "test-step-apply-changes"
     try:
     - apply:
         file: /configs/service-config.yaml
-        timeout: 45s
         shouldFail: false
-        continueOnError: true
+      timeout: 45s
+      continueOnError: true
     - assert:
         file: /assertions/verify-service.yaml
-        timeout: 30s
-        continueOnError: false
+      timeout: 30s
+      continueOnError: false