diff --git a/api/kyverno/v1beta1/updaterequest_types.go b/api/kyverno/v1beta1/updaterequest_types.go
index ab83b2c2d7..b036b5729b 100644
--- a/api/kyverno/v1beta1/updaterequest_types.go
+++ b/api/kyverno/v1beta1/updaterequest_types.go
@@ -26,6 +26,7 @@ import (
// UpdateRequestStatus defines the observed state of UpdateRequest
type UpdateRequestStatus struct {
// Handler represents the instance ID that handles the UR
+ // Deprecated
Handler string `json:"handler,omitempty" yaml:"handler,omitempty"`
// State represents state of the update request.
diff --git a/charts/kyverno/templates/crds/crds.yaml b/charts/kyverno/templates/crds/crds.yaml
index be0f26ab30..314cba4c35 100644
--- a/charts/kyverno/templates/crds/crds.yaml
+++ b/charts/kyverno/templates/crds/crds.yaml
@@ -30489,6 +30489,7 @@ spec:
type: array
handler:
description: Handler represents the instance ID that handles the UR
+ Deprecated
type: string
message:
description: Specifies request status message.
diff --git a/cmd/background-controller/main.go b/cmd/background-controller/main.go
index 50c5dbb33f..c5b986095d 100644
--- a/cmd/background-controller/main.go
+++ b/cmd/background-controller/main.go
@@ -63,37 +63,9 @@ func setupCosign(logger logr.Logger, imageSignatureRepository string) {
}
}
-func createNonLeaderControllers(
- eng engineapi.Engine,
- genWorkers int,
- kubeInformer kubeinformers.SharedInformerFactory,
- kubeKyvernoInformer kubeinformers.SharedInformerFactory,
- kyvernoInformer kyvernoinformer.SharedInformerFactory,
- kyvernoClient versioned.Interface,
- dynamicClient dclient.Interface,
- rclient registryclient.Client,
- configuration config.Configuration,
- eventGenerator event.Interface,
- informerCacheResolvers engineapi.ConfigmapResolver,
-) []internal.Controller {
- updateRequestController := background.NewController(
- kyvernoClient,
- dynamicClient,
- eng,
- kyvernoInformer.Kyverno().V1().ClusterPolicies(),
- kyvernoInformer.Kyverno().V1().Policies(),
- kyvernoInformer.Kyverno().V1beta1().UpdateRequests(),
- kubeInformer.Core().V1().Namespaces(),
- kubeKyvernoInformer.Core().V1().Pods(),
- eventGenerator,
- configuration,
- informerCacheResolvers,
- )
- return []internal.Controller{internal.NewController("updaterequest-controller", updateRequestController, genWorkers)}
-}
-
func createrLeaderControllers(
eng engineapi.Engine,
+ genWorkers int,
kubeInformer kubeinformers.SharedInformerFactory,
kyvernoInformer kyvernoinformer.SharedInformerFactory,
kyvernoClient versioned.Interface,
@@ -122,8 +94,22 @@ func createrLeaderControllers(
if err != nil {
return nil, err
}
+
+ backgroundController := background.NewController(
+ kyvernoClient,
+ dynamicClient,
+ eng,
+ kyvernoInformer.Kyverno().V1().ClusterPolicies(),
+ kyvernoInformer.Kyverno().V1().Policies(),
+ kyvernoInformer.Kyverno().V1beta1().UpdateRequests(),
+ kubeInformer.Core().V1().Namespaces(),
+ eventGenerator,
+ configuration,
+ configMapResolver,
+ )
return []internal.Controller{
internal.NewController("policy-controller", policyCtrl, 2),
+ internal.NewController("background-controller", backgroundController, genWorkers),
}, err
}
@@ -137,7 +123,7 @@ func main() {
leaderElectionRetryPeriod time.Duration
)
flagset := flag.NewFlagSet("updaterequest-controller", flag.ExitOnError)
- flagset.IntVar(&genWorkers, "genWorkers", 10, "Workers for generate controller.")
+ flagset.IntVar(&genWorkers, "genWorkers", 10, "Workers for the background controller.")
flagset.StringVar(&imagePullSecrets, "imagePullSecrets", "", "Secret resource names for image registry access credentials.")
flagset.StringVar(&imageSignatureRepository, "imageSignatureRepository", "", "Alternate repository for image signatures. Can be overridden per rule via `verifyImages.Repository`.")
flagset.BoolVar(&allowInsecureRegistry, "allowInsecureRegistry", false, "Whether to allow insecure connections to registries. Don't use this for anything but testing.")
@@ -159,7 +145,7 @@ func main() {
// setup signals
// setup maxprocs
// setup metrics
- signalCtx, logger, metricsConfig, sdown := internal.Setup("kyverno-updaterequest-controller")
+ signalCtx, logger, metricsConfig, sdown := internal.Setup("kyverno-background-controller")
defer sdown()
// create instrumented clients
kubeClient := internal.CreateKubernetesClient(logger, kubeclient.WithMetrics(metricsConfig, metrics.KubeClient), kubeclient.WithTracing())
@@ -176,7 +162,6 @@ func main() {
// ELSE KYAML IS NOT THREAD SAFE
kyamlopenapi.Schema()
// informer factories
- kubeInformer := kubeinformers.NewSharedInformerFactory(kubeClient, resyncPeriod)
kubeKyvernoInformer := kubeinformers.NewSharedInformerFactoryWithOptions(kubeClient, resyncPeriod, kubeinformers.WithNamespace(config.KyvernoNamespace()))
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(kyvernoClient, resyncPeriod)
cacheInformer, err := resolvers.GetCacheInformerFactory(kubeClient, resyncPeriod)
@@ -232,22 +217,8 @@ func main() {
// TODO: do we need exceptions here ?
nil,
)
- // create non leader controllers
- nonLeaderControllers := createNonLeaderControllers(
- engine,
- genWorkers,
- kubeInformer,
- kubeKyvernoInformer,
- kyvernoInformer,
- kyvernoClient,
- dClient,
- rclient,
- configuration,
- eventGenerator,
- configMapResolver,
- )
// start informers and wait for cache sync
- if !internal.StartInformersAndWaitForCacheSync(signalCtx, kyvernoInformer, kubeInformer, kubeKyvernoInformer, cacheInformer) {
+ if !internal.StartInformersAndWaitForCacheSync(signalCtx, kyvernoInformer, kubeKyvernoInformer, cacheInformer) {
logger.Error(errors.New("failed to wait for cache sync"), "failed to wait for cache sync")
os.Exit(1)
}
@@ -256,7 +227,7 @@ func main() {
// setup leader election
le, err := leaderelection.New(
logger.WithName("leader-election"),
- "kyverno-updaterequest-controller",
+ "kyverno-background-controller",
config.KyvernoNamespace(),
leaderElectionClient,
config.KyvernoPodName(),
@@ -269,6 +240,7 @@ func main() {
// create leader controllers
leaderControllers, err := createrLeaderControllers(
engine,
+ genWorkers,
kubeInformer,
kyvernoInformer,
kyvernoClient,
@@ -302,19 +274,13 @@ func main() {
logger.Error(err, "failed to initialize leader election")
os.Exit(1)
}
- // start non leader controllers
- var wg sync.WaitGroup
- for _, controller := range nonLeaderControllers {
- controller.Run(signalCtx, logger.WithName("controllers"), &wg)
- }
// start leader election
- go func() {
+ for {
select {
case <-signalCtx.Done():
return
default:
le.Run(signalCtx)
}
- }()
- wg.Wait()
+ }
}
diff --git a/config/crds/kyverno.io_updaterequests.yaml b/config/crds/kyverno.io_updaterequests.yaml
index 9394aa2038..485a2eec80 100644
--- a/config/crds/kyverno.io_updaterequests.yaml
+++ b/config/crds/kyverno.io_updaterequests.yaml
@@ -370,6 +370,7 @@ spec:
type: array
handler:
description: Handler represents the instance ID that handles the UR
+ Deprecated
type: string
message:
description: Specifies request status message.
diff --git a/docs/user/crd/index.html b/docs/user/crd/index.html
index 5ef4d431fb..05932a17f4 100644
--- a/docs/user/crd/index.html
+++ b/docs/user/crd/index.html
@@ -4677,7 +4677,8 @@ string
- Handler represents the instance ID that handles the UR
+Handler represents the instance ID that handles the UR
+Deprecated
|
diff --git a/pkg/background/update_request_controller.go b/pkg/background/update_request_controller.go
index 9fab589f91..30bd6b4484 100644
--- a/pkg/background/update_request_controller.go
+++ b/pkg/background/update_request_controller.go
@@ -29,7 +29,6 @@ import (
corev1informers "k8s.io/client-go/informers/core/v1"
corev1listers "k8s.io/client-go/listers/core/v1"
"k8s.io/client-go/tools/cache"
- "k8s.io/client-go/util/retry"
"k8s.io/client-go/util/workqueue"
)
@@ -54,7 +53,6 @@ type controller struct {
polLister kyvernov1listers.PolicyLister
urLister kyvernov1beta1listers.UpdateRequestNamespaceLister
nsLister corev1listers.NamespaceLister
- podLister corev1listers.PodLister
informersSynced []cache.InformerSynced
@@ -75,7 +73,6 @@ func NewController(
polInformer kyvernov1informers.PolicyInformer,
urInformer kyvernov1beta1informers.UpdateRequestInformer,
namespaceInformer corev1informers.NamespaceInformer,
- podInformer corev1informers.PodInformer,
eventGen event.Interface,
dynamicConfig config.Configuration,
informerCacheResolvers engineapi.ConfigmapResolver,
@@ -89,8 +86,7 @@ func NewController(
polLister: polInformer.Lister(),
urLister: urLister,
nsLister: namespaceInformer.Lister(),
- podLister: podInformer.Lister(),
- queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "update-request"),
+ queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "background"),
eventGen: eventGen,
configuration: dynamicConfig,
informerCacheResolvers: informerCacheResolvers,
@@ -109,7 +105,7 @@ func NewController(
DeleteFunc: c.deletePolicy,
})
- c.informersSynced = []cache.InformerSynced{cpolInformer.Informer().HasSynced, polInformer.Informer().HasSynced, urInformer.Informer().HasSynced, namespaceInformer.Informer().HasSynced, podInformer.Informer().HasSynced}
+ c.informersSynced = []cache.InformerSynced{cpolInformer.Informer().HasSynced, polInformer.Informer().HasSynced, urInformer.Informer().HasSynced, namespaceInformer.Informer().HasSynced}
return &c
}
@@ -192,18 +188,7 @@ func (c *controller) syncUpdateRequest(key string) error {
if ur.Status.State == "" {
ur = ur.DeepCopy()
ur.Status.State = kyvernov1beta1.Pending
- _, err := c.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).UpdateStatus(context.TODO(), ur, metav1.UpdateOptions{})
- return err
- }
- // if it was acquired by a pod that is gone, release it
- if ur.Status.Handler != "" {
- _, err = c.podLister.Pods(config.KyvernoNamespace()).Get(ur.Status.Handler)
- if err != nil {
- if apierrors.IsNotFound(err) {
- ur = ur.DeepCopy()
- ur.Status.Handler = ""
- _, err = c.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).UpdateStatus(context.TODO(), ur, metav1.UpdateOptions{})
- }
+ if _, err := c.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).UpdateStatus(context.TODO(), ur, metav1.UpdateOptions{}); err != nil {
return err
}
}
@@ -226,28 +211,13 @@ func (c *controller) syncUpdateRequest(key string) error {
return err
}
}
- // if in pending state, try to acquire ur and eventually process it
+ // process pending URs
if ur.Status.State == kyvernov1beta1.Pending {
- ur, ok, err := c.acquireUR(ur)
- if err != nil {
- if apierrors.IsNotFound(err) {
- return nil
- }
- return fmt.Errorf("failed to mark handler for UR %s: %v", key, err)
- }
- if !ok {
- logger.V(3).Info("another instance is handling the UR", "handler", ur.Status.Handler)
- return nil
- }
- logger.V(3).Info("UR is marked successfully", "ur", ur.GetName(), "resourceVersion", ur.GetResourceVersion())
if err := c.processUR(ur); err != nil {
return fmt.Errorf("failed to process UR %s: %v", key, err)
}
}
- ur, err = c.releaseUR(ur)
- if err != nil {
- return fmt.Errorf("failed to unmark UR %s: %v", key, err)
- }
+
err = c.cleanUR(ur)
return err
}
@@ -427,47 +397,6 @@ func (c *controller) processUR(ur *kyvernov1beta1.UpdateRequest) error {
return nil
}
-func (c *controller) acquireUR(ur *kyvernov1beta1.UpdateRequest) (*kyvernov1beta1.UpdateRequest, bool, error) {
- name := ur.GetName()
- err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
- var err error
- ur, err = c.urLister.Get(name)
- if err != nil {
- return err
- }
- if ur.Status.Handler != "" {
- return nil
- }
- ur = ur.DeepCopy()
- ur.Status.Handler = config.KyvernoPodName()
- ur, err = c.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).UpdateStatus(context.TODO(), ur, metav1.UpdateOptions{})
- return err
- })
- if err != nil {
- logger.Error(err, "failed to acquire ur", "name", name, "ur", ur)
- return nil, false, err
- }
- return ur, ur.Status.Handler == config.KyvernoPodName(), err
-}
-
-func (c *controller) releaseUR(ur *kyvernov1beta1.UpdateRequest) (*kyvernov1beta1.UpdateRequest, error) {
- err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
- var err error
- ur, err = c.urLister.Get(ur.GetName())
- if err != nil {
- return err
- }
- if ur.Status.Handler != config.KyvernoPodName() {
- return nil
- }
- ur = ur.DeepCopy()
- ur.Status.Handler = ""
- ur, err = c.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).UpdateStatus(context.TODO(), ur, metav1.UpdateOptions{})
- return err
- })
- return ur, err
-}
-
func (c *controller) cleanUR(ur *kyvernov1beta1.UpdateRequest) error {
if ur.Spec.Type == kyvernov1beta1.Mutate && ur.Status.State == kyvernov1beta1.Completed {
return c.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).Delete(context.TODO(), ur.GetName(), metav1.DeleteOptions{})
diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/04-sleep.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/03-sleep.yaml
similarity index 100%
rename from test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/04-sleep.yaml
rename to test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/03-sleep.yaml
diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/03-delete-secret.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/04-delete-secret.yaml
similarity index 100%
rename from test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/03-delete-secret.yaml
rename to test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/04-delete-secret.yaml
diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/04-sleep.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/05-sleep.yaml
similarity index 100%
rename from test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/04-sleep.yaml
rename to test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/05-sleep.yaml
diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/05-errors.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/06-errors.yaml
similarity index 100%
rename from test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/05-errors.yaml
rename to test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/06-errors.yaml
diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/03-sleep.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/03-sleep.yaml
new file mode 100644
index 0000000000..fe3b8abbcb
--- /dev/null
+++ b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/03-sleep.yaml
@@ -0,0 +1,5 @@
+# A command can only run a single command, not a pipeline and not a script. The program called must exist on the system where the test is run.
+apiVersion: kuttl.dev/v1beta1
+kind: TestStep
+commands:
+ - command: sleep 3
\ No newline at end of file
diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/03-delete-secret.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/04-delete-secret.yaml
similarity index 100%
rename from test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/03-delete-secret.yaml
rename to test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/04-delete-secret.yaml
diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/05-sleep.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/05-sleep.yaml
new file mode 100644
index 0000000000..e0f2098e5d
--- /dev/null
+++ b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/05-sleep.yaml
@@ -0,0 +1,4 @@
+apiVersion: kuttl.dev/v1beta1
+kind: TestStep
+commands:
+ - command: sleep 3
\ No newline at end of file
diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/05-assert.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/06-assert.yaml
similarity index 100%
rename from test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/05-assert.yaml
rename to test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/06-assert.yaml
diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-policy/03-sleep.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-policy/03-sleep.yaml
new file mode 100644
index 0000000000..fe3b8abbcb
--- /dev/null
+++ b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-policy/03-sleep.yaml
@@ -0,0 +1,5 @@
+# A command can only run a single command, not a pipeline and not a script. The program called must exist on the system where the test is run.
+apiVersion: kuttl.dev/v1beta1
+kind: TestStep
+commands:
+ - command: sleep 3
\ No newline at end of file
diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-policy/03-delete.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-policy/04-delete.yaml
similarity index 100%
rename from test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-policy/03-delete.yaml
rename to test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-policy/04-delete.yaml
diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-policy/04-sleep.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-policy/05-sleep.yaml
similarity index 100%
rename from test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-policy/04-sleep.yaml
rename to test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-policy/05-sleep.yaml
diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-policy/05-assert.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-policy/06-assert.yaml
similarity index 100%
rename from test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-policy/05-assert.yaml
rename to test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-policy/06-assert.yaml
diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/03-sleep.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/03-sleep.yaml
new file mode 100644
index 0000000000..fe3b8abbcb
--- /dev/null
+++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/03-sleep.yaml
@@ -0,0 +1,5 @@
+# A command can only run a single command, not a pipeline and not a script. The program called must exist on the system where the test is run.
+apiVersion: kuttl.dev/v1beta1
+kind: TestStep
+commands:
+ - command: sleep 3
\ No newline at end of file
diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/03-downstream-delete.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/04-downstream-delete.yaml
similarity index 100%
rename from test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/03-downstream-delete.yaml
rename to test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/04-downstream-delete.yaml
diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/04-errors.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/05-errors.yaml
similarity index 100%
rename from test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/04-errors.yaml
rename to test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/05-errors.yaml
diff --git a/test/conformance/kuttl/generate/policy/standard/clone/nosync/pol-clone-nosync-delete-downstream/03-sleep.yaml b/test/conformance/kuttl/generate/policy/standard/clone/nosync/pol-clone-nosync-delete-downstream/03-sleep.yaml
new file mode 100644
index 0000000000..fe3b8abbcb
--- /dev/null
+++ b/test/conformance/kuttl/generate/policy/standard/clone/nosync/pol-clone-nosync-delete-downstream/03-sleep.yaml
@@ -0,0 +1,5 @@
+# A command can only run a single command, not a pipeline and not a script. The program called must exist on the system where the test is run.
+apiVersion: kuttl.dev/v1beta1
+kind: TestStep
+commands:
+ - command: sleep 3
\ No newline at end of file
diff --git a/test/conformance/kuttl/generate/policy/standard/clone/nosync/pol-clone-nosync-delete-downstream/03-delete-downstream.yaml b/test/conformance/kuttl/generate/policy/standard/clone/nosync/pol-clone-nosync-delete-downstream/04-delete-downstream.yaml
similarity index 100%
rename from test/conformance/kuttl/generate/policy/standard/clone/nosync/pol-clone-nosync-delete-downstream/03-delete-downstream.yaml
rename to test/conformance/kuttl/generate/policy/standard/clone/nosync/pol-clone-nosync-delete-downstream/04-delete-downstream.yaml
diff --git a/test/conformance/kuttl/generate/policy/standard/clone/nosync/pol-clone-nosync-delete-downstream/04-sleep.yaml b/test/conformance/kuttl/generate/policy/standard/clone/nosync/pol-clone-nosync-delete-downstream/05-sleep.yaml
similarity index 100%
rename from test/conformance/kuttl/generate/policy/standard/clone/nosync/pol-clone-nosync-delete-downstream/04-sleep.yaml
rename to test/conformance/kuttl/generate/policy/standard/clone/nosync/pol-clone-nosync-delete-downstream/05-sleep.yaml
diff --git a/test/conformance/kuttl/generate/policy/standard/clone/nosync/pol-clone-nosync-delete-downstream/05-errors.yaml b/test/conformance/kuttl/generate/policy/standard/clone/nosync/pol-clone-nosync-delete-downstream/06-errors.yaml
similarity index 100%
rename from test/conformance/kuttl/generate/policy/standard/clone/nosync/pol-clone-nosync-delete-downstream/05-errors.yaml
rename to test/conformance/kuttl/generate/policy/standard/clone/nosync/pol-clone-nosync-delete-downstream/06-errors.yaml