From 0c91e87bbbe6ba965eba6dcd35fa1406afa15be4 Mon Sep 17 00:00:00 2001 From: shuting <shuting@nirmata.com> Date: Wed, 1 Mar 2023 11:48:18 +0800 Subject: [PATCH] fix: delete downstream for a generate rule removal, with data and sync (#6393) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * remove policy handler for updates Signed-off-by: ShutingZhao <shuting@nirmata.com> * remove policy update handler from the ur controller Signed-off-by: ShutingZhao <shuting@nirmata.com> * rework cleanup downstream on policy deletion Signed-off-by: ShutingZhao <shuting@nirmata.com> * fix downstream deletion on data rule removal Signed-off-by: ShutingZhao <shuting@nirmata.com> * add kuttl test for clusterpolicy Signed-off-by: ShutingZhao <shuting@nirmata.com> * linter fix Signed-off-by: ShutingZhao <shuting@nirmata.com> * add kuttl test for policy Signed-off-by: ShutingZhao <shuting@nirmata.com> * update api docs Signed-off-by: ShutingZhao <shuting@nirmata.com> * add delays Signed-off-by: ShutingZhao <shuting@nirmata.com> * fix name assertion Signed-off-by: ShutingZhao <shuting@nirmata.com> * delete downstream when deletes the clone source Signed-off-by: ShutingZhao <shuting@nirmata.com> * add kuttl test pol-clone-sync-delete-source Signed-off-by: ShutingZhao <shuting@nirmata.com> * linter fixes Signed-off-by: ShutingZhao <shuting@nirmata.com> * add kuttl test pol-clone-sync-delete-downstream Signed-off-by: ShutingZhao <shuting@nirmata.com> * add kuttl test pol-data-sync-modify-rule Signed-off-by: ShutingZhao <shuting@nirmata.com> * fix panic Signed-off-by: ShutingZhao <shuting@nirmata.com> * fix panic Signed-off-by: ShutingZhao <shuting@nirmata.com> * fix labels Signed-off-by: ShutingZhao <shuting@nirmata.com> * fix policy assertions Signed-off-by: ShutingZhao <shuting@nirmata.com> * fix annotation missing names Signed-off-by: ShutingZhao <shuting@nirmata.com> * rename policy Signed-off-by: ShutingZhao <shuting@nirmata.com> * remove dead code Signed-off-by: ShutingZhao <shuting@nirmata.com> * create unique namespaces Signed-off-by: ShutingZhao <shuting@nirmata.com> * create more unique namespaces Signed-off-by: ShutingZhao <shuting@nirmata.com> * fix assertion Signed-off-by: ShutingZhao <shuting@nirmata.com> --------- Signed-off-by: ShutingZhao <shuting@nirmata.com> Co-authored-by: Charles-Edouard Brétéché <charled.breteche@gmail.com> --- api/kyverno/v1/common_types.go | 14 ++ api/kyverno/v1/rule_types.go | 11 +- docs/user/crd/index.html | 4 + pkg/background/common/util.go | 10 + pkg/background/generate/cleanup.go | 83 +++++++ pkg/background/generate/generate.go | 59 +---- pkg/background/generate/utils.go | 17 +- pkg/background/mutate.go | 21 ++ pkg/background/update_request_controller.go | 229 +----------------- pkg/policy/generate.go | 86 +++++-- pkg/policy/mutate.go | 2 +- pkg/policy/policy_controller.go | 36 ++- pkg/policy/updaterequest.go | 23 +- pkg/webhooks/resource/generation/handler.go | 6 +- pkg/webhooks/updaterequest/generator.go | 12 +- .../cpol-clone-nosync-create/02-ns.yaml | 2 +- .../cpol-clone-nosync-create/02-sleep.yaml | 5 + .../{02-assert.yaml => 03-assert.yaml} | 2 +- .../cpol-clone-nosync-create/99-cleanup.yaml | 4 - .../02-assert.yaml | 2 +- .../02-ns.yaml | 2 +- .../03-assert.yaml | 2 +- .../04-delete-secret.yaml | 2 +- .../06-errors.yaml | 2 +- .../99-cleanup.yaml | 4 - .../cpol-clone-sync-create/02-assert.yaml | 2 +- .../sync/cpol-clone-sync-create/02-ns.yaml | 2 +- .../02-assert.yaml | 2 +- .../02-ns.yaml | 2 +- .../03-assert.yaml | 2 +- .../04-delete-secret.yaml | 2 +- .../06-assert.yaml | 2 +- .../02-assert.yaml | 2 +- .../02-ns.yaml | 2 +- .../04-downstream-delete.yaml | 2 +- .../05-errors.yaml | 2 +- .../sync/cpol-data-sync-create/02-assert.yaml | 2 +- .../sync/cpol-data-sync-create/02-ns.yaml | 2 +- .../cpol-data-sync-create/99-cleanup.yaml | 4 - .../02-assert.yaml | 2 +- .../02-ns.yaml | 2 +- .../03-delete.yaml | 2 +- .../05-assert.yaml | 2 +- .../01-assert.yaml | 2 +- .../01-manifests.yaml | 4 +- .../02-assert.yaml | 2 +- .../cpol-data-sync-delete-policy/02-ns.yaml | 2 +- .../03-assert.yaml | 2 +- .../04-errors.yaml | 2 +- .../04-policy-delete.yaml | 2 +- .../99-cleanup.yaml | 4 - .../01-clusterpolicy.yaml | 6 + .../cpol-data-sync-delete-rule/02-ns.yaml | 4 + .../cpol-data-sync-delete-rule/03-check.yaml | 5 + .../04-delete-rule.yaml | 6 + .../cpol-data-sync-delete-rule/05-sleep.yaml | 5 + .../cpol-data-sync-delete-rule/06-checks.yaml | 7 + .../sync/cpol-data-sync-delete-rule/README.md | 11 + .../cpol-data-sync-delete-rule/configmap.yaml | 10 + .../delete-rule.yaml | 35 +++ .../policy-ready.yaml | 9 + .../cpol-data-sync-delete-rule/policy.yaml | 63 +++++ .../cpol-data-sync-delete-rule/secret.yaml | 10 + .../cpol-data-sync-modify-rule/02-assert.yaml | 2 +- .../cpol-data-sync-modify-rule/02-ns.yaml | 2 +- .../cpol-data-sync-modify-rule/03-assert.yaml | 2 +- .../99-cleanup.yaml | 4 - .../01-assert.yaml | 13 + .../01-manifests.yaml | 13 + .../02-assert.yaml | 10 + .../02-policy.yaml | 22 ++ .../03-trigger.yaml | 7 + .../04-downstream.yaml | 4 + .../05-delete.yaml | 8 + .../06-sleep.yaml | 4 + .../07-downstream.yaml | 4 + .../README.md | 11 + .../downstream.yaml | 8 + .../01-policy.yaml | 6 + .../02-resource.yaml | 6 + .../03-deletesource.yaml | 7 + .../04-sleep.yaml | 4 + .../05-errors.yaml | 8 + .../pol-clone-sync-delete-source/README.md | 11 + .../cloned-secret.yaml | 8 + .../create-cm.yaml | 9 + .../policy-ready.yaml | 10 + .../pol-clone-sync-delete-source/policy.yaml | 36 +++ .../pol-data-sync-delete-rule/01-assert.yaml | 10 + .../01-manifests.yaml | 57 +++++ .../pol-data-sync-delete-rule/02-trigger.yaml | 10 + .../pol-data-sync-delete-rule/03-check.yaml | 5 + .../pol-data-sync-delete-rule/04-assert.yaml | 10 + .../04-delete-rule.yaml | 30 +++ .../pol-data-sync-delete-rule/05-sleep.yaml | 5 + .../pol-data-sync-delete-rule/06-checks.yaml | 7 + .../sync/pol-data-sync-delete-rule/README.md | 11 + .../pol-data-sync-delete-rule/configmap.yaml | 10 + .../pol-data-sync-delete-rule/secret.yaml | 10 + .../pol-data-sync-modify-rule/01-assert.yaml | 10 + .../01-manifests.yaml | 33 +++ .../pol-data-sync-modify-rule/02-trigger.yaml | 10 + .../pol-data-sync-modify-rule/03-assert.yaml | 10 + .../03-policy-update.yaml | 28 +++ .../pol-data-sync-modify-rule/04-assert.yaml | 10 + .../sync/pol-data-sync-modify-rule/README.md | 11 + 106 files changed, 980 insertions(+), 385 deletions(-) create mode 100644 pkg/background/generate/cleanup.go create mode 100644 pkg/background/mutate.go create mode 100644 test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/02-sleep.yaml rename test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/{02-assert.yaml => 03-assert.yaml} (57%) delete mode 100644 test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/99-cleanup.yaml delete mode 100644 test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/99-cleanup.yaml delete mode 100644 test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-create/99-cleanup.yaml delete mode 100644 test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/99-cleanup.yaml create mode 100644 test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/01-clusterpolicy.yaml create mode 100644 test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/02-ns.yaml create mode 100644 test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/03-check.yaml create mode 100644 test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/04-delete-rule.yaml create mode 100644 test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/05-sleep.yaml create mode 100644 test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/06-checks.yaml create mode 100644 test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/README.md create mode 100644 test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/configmap.yaml create mode 100644 test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/delete-rule.yaml create mode 100644 test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/policy-ready.yaml create mode 100644 test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/policy.yaml create mode 100644 test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/secret.yaml delete mode 100644 test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-modify-rule/99-cleanup.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/01-assert.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/01-manifests.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/02-assert.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/02-policy.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/03-trigger.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/04-downstream.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/05-delete.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/06-sleep.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/07-downstream.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/README.md create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/downstream.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/01-policy.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/02-resource.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/03-deletesource.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/04-sleep.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/05-errors.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/README.md create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/cloned-secret.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/create-cm.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/policy-ready.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/policy.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/01-assert.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/01-manifests.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/02-trigger.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/03-check.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/04-assert.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/04-delete-rule.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/05-sleep.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/06-checks.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/README.md create mode 100644 test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/configmap.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/secret.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/01-assert.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/01-manifests.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/02-trigger.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/03-assert.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/03-policy-update.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/04-assert.yaml create mode 100644 test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/README.md diff --git a/api/kyverno/v1/common_types.go b/api/kyverno/v1/common_types.go index 2ee44c64ad..cc1eafaf56 100644 --- a/api/kyverno/v1/common_types.go +++ b/api/kyverno/v1/common_types.go @@ -568,6 +568,20 @@ func (g *Generation) SetData(in apiextensions.JSON) { g.RawData = ToJSON(in) } +type GenerateType string + +const ( + Data GenerateType = "Data" + Clone GenerateType = "Clone" +) + +func (g *Generation) GetTypeAndSync() (GenerateType, bool) { + if g.RawData != nil { + return Data, g.Synchronize + } + return Clone, g.Synchronize +} + // CloneFrom provides the location of the source resource used to generate target resources. // The resource kind is derived from the match criteria. type CloneFrom struct { diff --git a/api/kyverno/v1/rule_types.go b/api/kyverno/v1/rule_types.go index 9d18f9bfc3..d08085f55d 100644 --- a/api/kyverno/v1/rule_types.go +++ b/api/kyverno/v1/rule_types.go @@ -150,18 +150,11 @@ func (r *Rule) IsPodSecurity() bool { return r.Validation.PodSecurity != nil } -// IsCloneSyncGenerate checks if the generate rule has the clone block with sync=true -func (r *Rule) GetCloneSyncForGenerate() (clone bool, sync bool) { +func (r *Rule) GetGenerateTypeAndSync() (_ GenerateType, sync bool) { if !r.HasGenerate() { return } - - if r.Generation.Clone.Name != "" { - clone = true - } - - sync = r.Generation.Synchronize - return + return r.Generation.GetTypeAndSync() } func (r *Rule) GetAnyAllConditions() apiextensions.JSON { diff --git a/docs/user/crd/index.html b/docs/user/crd/index.html index 67cf10eed0..f79daae0e5 100644 --- a/docs/user/crd/index.html +++ b/docs/user/crd/index.html @@ -1530,6 +1530,10 @@ Kubernetes apiextensions/v1.JSON </tbody> </table> <hr /> +<h3 id="kyverno.io/v1.GenerateType">GenerateType +(<code>string</code> alias)</p></h3> +<p> +</p> <h3 id="kyverno.io/v1.Generation">Generation </h3> <p> diff --git a/pkg/background/common/util.go b/pkg/background/common/util.go index 7732bdd812..be72bd8a85 100644 --- a/pkg/background/common/util.go +++ b/pkg/background/common/util.go @@ -10,6 +10,7 @@ import ( "github.com/kyverno/kyverno/pkg/config" "github.com/kyverno/kyverno/pkg/logging" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/client-go/util/retry" ) @@ -72,3 +73,12 @@ func PolicyKey(namespace, name string) string { } return name } + +func ResourceSpecFromUnstructured(obj unstructured.Unstructured) kyvernov1.ResourceSpec { + return kyvernov1.ResourceSpec{ + APIVersion: obj.GetAPIVersion(), + Kind: obj.GetKind(), + Namespace: obj.GetNamespace(), + Name: obj.GetName(), + } +} diff --git a/pkg/background/generate/cleanup.go b/pkg/background/generate/cleanup.go new file mode 100644 index 0000000000..a905381017 --- /dev/null +++ b/pkg/background/generate/cleanup.go @@ -0,0 +1,83 @@ +package generate + +import ( + "context" + "fmt" + + kyvernov1 "github.com/kyverno/kyverno/api/kyverno/v1" + kyvernov1beta1 "github.com/kyverno/kyverno/api/kyverno/v1beta1" + "github.com/kyverno/kyverno/pkg/background/common" + "go.uber.org/multierr" + apierrors "k8s.io/apimachinery/pkg/api/errors" +) + +func (c *GenerateController) deleteDownstream(policy kyvernov1.PolicyInterface, ur *kyvernov1beta1.UpdateRequest) (err error) { + if !ur.Spec.DeleteDownstream { + return nil + } + + // handle data policy/rule deletion + if ur.Status.GeneratedResources != nil { + c.log.V(4).Info("policy/rule no longer exists, deleting the downstream resource based on synchronize", "ur", ur.Name, "policy", ur.Spec.Policy, "rule", ur.Spec.Rule) + var errs []error + failedDownstreams := []kyvernov1.ResourceSpec{} + for _, e := range ur.Status.GeneratedResources { + if err := c.client.DeleteResource(context.TODO(), e.GetAPIVersion(), e.GetKind(), e.GetNamespace(), e.GetName(), false); err != nil && !apierrors.IsNotFound(err) { + failedDownstreams = append(failedDownstreams, e) + errs = append(errs, err) + } + } + + if len(errs) != 0 { + c.log.Error(multierr.Combine(errs...), "failed to clean up downstream resources on policy deletion") + _, err = c.statusControl.Failed(ur.GetName(), + fmt.Sprintf("failed to clean up downstream resources on policy deletion: %v", multierr.Combine(errs...)), + failedDownstreams) + } else { + _, err = c.statusControl.Success(ur.GetName(), nil) + } + return + } + + if policy == nil { + return nil + } + // handle clone source deletion + return c.deleteDownstreamForClone(policy, ur) +} + +func (c *GenerateController) deleteDownstreamForClone(policy kyvernov1.PolicyInterface, ur *kyvernov1beta1.UpdateRequest) error { + if !ur.Spec.DeleteDownstream { + return nil + } + + for _, rule := range policy.GetSpec().Rules { + if ur.Spec.Rule != rule.Name { + continue + } + + downstreams, err := FindDownstream(c.client, policy, rule) + if err != nil { + return err + } + + var errs []error + failedDownstreams := []kyvernov1.ResourceSpec{} + for _, downstream := range downstreams.Items { + if err := c.client.DeleteResource(context.TODO(), downstream.GetAPIVersion(), downstream.GetKind(), downstream.GetNamespace(), downstream.GetName(), false); err != nil && !apierrors.IsNotFound(err) { + failedDownstreams = append(failedDownstreams, common.ResourceSpecFromUnstructured(downstream)) + errs = append(errs, err) + } + } + if len(errs) != 0 { + c.log.Error(multierr.Combine(errs...), "failed to clean up downstream resources on source deletion") + _, err = c.statusControl.Failed(ur.GetName(), + fmt.Sprintf("failed to clean up downstream resources on source deletion: %v", multierr.Combine(errs...)), + failedDownstreams) + } else { + _, err = c.statusControl.Success(ur.GetName(), nil) + } + return err + } + return nil +} diff --git a/pkg/background/generate/generate.go b/pkg/background/generate/generate.go index 05d8c9f50e..cc6d063229 100644 --- a/pkg/background/generate/generate.go +++ b/pkg/background/generate/generate.go @@ -151,20 +151,16 @@ func (c *GenerateController) applyGenerate(resource unstructured.Unstructured, u logger.V(3).Info("applying generate policy rule") policy, err := c.getPolicySpec(ur) - if err != nil { - if apierrors.IsNotFound(err) { - for _, e := range ur.Status.GeneratedResources { - if err := c.cleanupClonedResource(e); err != nil { - logger.Error(err, "failed to clean up cloned resource on policy deletion") - } - } - return nil, false, nil - } - + if err != nil && !apierrors.IsNotFound(err) { logger.Error(err, "error in fetching policy") return nil, false, err } + if ur.Spec.DeleteDownstream || apierrors.IsNotFound(err) { + err = c.deleteDownstream(policy, &ur) + return nil, false, err + } + policyContext, precreatedResource, err := common.NewBackgroundContext(c.client, &ur, policy, &resource, c.configuration, namespaceLabels, logger) if err != nil { return nil, precreatedResource, err @@ -209,31 +205,6 @@ func (c *GenerateController) applyGenerate(resource unstructured.Unstructured, u return c.ApplyGeneratePolicy(logger, policyContext, ur, applicableRules) } -// cleanupClonedResource deletes cloned resource if sync is not enabled for the clone policy -func (c *GenerateController) cleanupClonedResource(targetSpec kyvernov1.ResourceSpec) error { - target, err := c.client.GetResource(context.TODO(), targetSpec.APIVersion, targetSpec.Kind, targetSpec.Namespace, targetSpec.Name) - if err != nil { - if !apierrors.IsNotFound(err) { - return fmt.Errorf("failed to find generated resource %s/%s: %v", targetSpec.Namespace, targetSpec.Name, err) - } - } - - if target == nil { - return nil - } - - labels := target.GetLabels() - syncEnabled := labels[LabelSynchronize] == "enable" - clone := labels[LabelClonePolicyName] != "" - - if syncEnabled && !clone { - if err := c.client.DeleteResource(context.TODO(), target.GetAPIVersion(), target.GetKind(), target.GetNamespace(), target.GetName(), false); err != nil { - return fmt.Errorf("cloned resource is not deleted %s/%s: %v", targetSpec.Namespace, targetSpec.Name, err) - } - } - return nil -} - // getPolicySpec gets the policy spec from the ClusterPolicy/Policy func (c *GenerateController) getPolicySpec(ur kyvernov1beta1.UpdateRequest) (kyvernov1.PolicyInterface, error) { pNamespace, pName, err := cache.SplitMetaNamespaceKey(ur.Spec.Policy) @@ -320,12 +291,6 @@ func (c *GenerateController) ApplyGeneratePolicy(log logr.Logger, policyContext return nil, processExisting, err } - if ur.Spec.DeleteDownstream { - pKey := common.PolicyKey(policy.GetNamespace(), policy.GetName()) - err = c.deleteResource(pKey, rule, ur) - return nil, false, err - } - if policy.GetSpec().IsGenerateExistingOnPolicyUpdate() || !processExisting { genResource, err = applyRule(log, c.client, rule, resource, jsonContext, policy, ur) if err != nil { @@ -818,15 +783,3 @@ func (c *GenerateController) GetUnstrResource(genResourceSpec kyvernov1.Resource } return resource, nil } - -func (c *GenerateController) deleteResource(policyKey string, rule kyvernov1.Rule, ur kyvernov1beta1.UpdateRequest) error { - if policyKey != ur.Spec.Policy { - return nil - } - - if rule.Name == ur.Spec.Rule { - return c.client.DeleteResource(context.TODO(), rule.Generation.GetAPIVersion(), rule.Generation.GetKind(), rule.Generation.GetNamespace(), rule.Generation.GetName(), false) - } - - return nil -} diff --git a/pkg/background/generate/utils.go b/pkg/background/generate/utils.go index 153e976e52..ca00daad18 100644 --- a/pkg/background/generate/utils.go +++ b/pkg/background/generate/utils.go @@ -1,19 +1,23 @@ package generate import ( + "context" "fmt" "strconv" kyvernov1 "github.com/kyverno/kyverno/api/kyverno/v1" kyvernov1beta1 "github.com/kyverno/kyverno/api/kyverno/v1beta1" "github.com/kyverno/kyverno/pkg/background/common" + "github.com/kyverno/kyverno/pkg/clients/dclient" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" ) func increaseRetryAnnotation(ur *kyvernov1beta1.UpdateRequest) (int, map[string]string, error) { urAnnotations := ur.Annotations if len(urAnnotations) == 0 { urAnnotations = map[string]string{ - urAnnotations[kyvernov1beta1.URGenerateRetryCountAnnotation]: "1", + kyvernov1beta1.URGenerateRetryCountAnnotation: "1", } } @@ -43,3 +47,14 @@ func TriggerFromLabels(labels map[string]string) kyvernov1.ResourceSpec { APIVersion: labels[common.GenerateTriggerAPIVersionLabel], } } + +func FindDownstream(client dclient.Interface, policy kyvernov1.PolicyInterface, rule kyvernov1.Rule) (*unstructured.UnstructuredList, error) { + generation := rule.Generation + selector := &metav1.LabelSelector{MatchLabels: map[string]string{ + common.GeneratePolicyLabel: policy.GetName(), + common.GeneratePolicyNamespaceLabel: policy.GetNamespace(), + common.GenerateRuleLabel: rule.Name, + }} + + return client.ListResource(context.TODO(), generation.GetAPIVersion(), generation.GetKind(), "", selector) +} diff --git a/pkg/background/mutate.go b/pkg/background/mutate.go new file mode 100644 index 0000000000..71a23a5fc7 --- /dev/null +++ b/pkg/background/mutate.go @@ -0,0 +1,21 @@ +package background + +import ( + "context" + + kyvernov1beta1 "github.com/kyverno/kyverno/api/kyverno/v1beta1" + common "github.com/kyverno/kyverno/pkg/background/common" + "github.com/kyverno/kyverno/pkg/config" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func (c *controller) handleMutatePolicyAbsence(ur *kyvernov1beta1.UpdateRequest) error { + selector := &metav1.LabelSelector{ + MatchLabels: common.MutateLabelsSet(ur.Spec.Policy, nil), + } + return c.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).DeleteCollection( + context.TODO(), + metav1.DeleteOptions{}, + metav1.ListOptions{LabelSelector: metav1.FormatLabelSelector(selector)}, + ) +} diff --git a/pkg/background/update_request_controller.go b/pkg/background/update_request_controller.go index 34c1b040ee..27e5438d38 100644 --- a/pkg/background/update_request_controller.go +++ b/pkg/background/update_request_controller.go @@ -3,7 +3,6 @@ package background import ( "context" "fmt" - "strings" "time" kyvernov1 "github.com/kyverno/kyverno/api/kyverno/v1" @@ -20,10 +19,8 @@ import ( "github.com/kyverno/kyverno/pkg/config" engineapi "github.com/kyverno/kyverno/pkg/engine/api" "github.com/kyverno/kyverno/pkg/event" - kubeutils "github.com/kyverno/kyverno/pkg/utils/kube" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/wait" corev1informers "k8s.io/client-go/informers/core/v1" @@ -96,14 +93,6 @@ func NewController( UpdateFunc: c.updateUR, DeleteFunc: c.deleteUR, }) - _, _ = cpolInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - UpdateFunc: c.updatePolicy, - DeleteFunc: c.deletePolicy, - }) - _, _ = polInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - UpdateFunc: c.updatePolicy, - DeleteFunc: c.deletePolicy, - }) c.informersSynced = []cache.InformerSynced{cpolInformer.Informer().HasSynced, polInformer.Informer().HasSynced, urInformer.Informer().HasSynced, namespaceInformer.Informer().HasSynced} @@ -186,33 +175,12 @@ func (c *controller) syncUpdateRequest(key string) error { // Deep-copy otherwise we are mutating our cache. ur = ur.DeepCopy() + if _, err := c.getPolicy(ur.Spec.Policy); err != nil && apierrors.IsNotFound(err) { + if ur.Spec.GetRequestType() == kyvernov1beta1.Mutate { + return c.handleMutatePolicyAbsence(ur) + } + } - // if not in any state, try to set it to pending - if ur.Status.State == "" { - ur.Status.State = kyvernov1beta1.Pending - _, err := c.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).UpdateStatus(context.TODO(), ur, metav1.UpdateOptions{}) - return err - } - // try to get the linked policy - if _, err := c.getPolicy(ur.Spec.Policy); err != nil { - if apierrors.IsNotFound(err) && ur.Spec.GetRequestType() == kyvernov1beta1.Mutate { - // here only takes care of mutateExisting policies - // generate cleanup controller handles policy deletion - selector := &metav1.LabelSelector{ - MatchLabels: common.MutateLabelsSet(ur.Spec.Policy, nil), - } - return c.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).DeleteCollection( - context.TODO(), - metav1.DeleteOptions{}, - metav1.ListOptions{LabelSelector: metav1.FormatLabelSelector(selector)}, - ) - } - // check if cleanup is required in case policy is no longer exists - if err := c.checkIfCleanupRequired(ur); err != nil { - return err - } - } - // process pending URs if ur.Status.State == kyvernov1beta1.Pending { if err := c.processUR(ur); err != nil { return fmt.Errorf("failed to process UR %s: %v", key, err) @@ -223,59 +191,6 @@ func (c *controller) syncUpdateRequest(key string) error { return err } -func (c *controller) checkIfCleanupRequired(ur *kyvernov1beta1.UpdateRequest) error { - var err error - pNamespace, pName, err := cache.SplitMetaNamespaceKey(ur.Spec.Policy) - if err != nil { - return err - } - - if pNamespace == "" { - _, err = c.cpolLister.Get(pName) - } else { - _, err = c.polLister.Policies(pNamespace).Get(pName) - } - if err != nil { - if !apierrors.IsNotFound(err) { - return err - } - - logger.V(4).Info("policy no longer exists, deleting the update request and respective resource based on synchronize", "ur", ur.Name, "policy", ur.Spec.Policy) - for _, e := range ur.Status.GeneratedResources { - if err := c.cleanupDataResource(e); err != nil { - logger.Error(err, "failed to clean up data resource on policy deletion") - } - } - return c.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).Delete(context.TODO(), ur.Name, metav1.DeleteOptions{}) - } - return nil -} - -// cleanupDataResource deletes resource if sync is enabled for data policy -func (c *controller) cleanupDataResource(targetSpec kyvernov1.ResourceSpec) error { - target, err := c.client.GetResource(context.TODO(), targetSpec.APIVersion, targetSpec.Kind, targetSpec.Namespace, targetSpec.Name) - if err != nil { - if !apierrors.IsNotFound(err) { - return fmt.Errorf("failed to find generated resource %s/%s: %v", targetSpec.Namespace, targetSpec.Name, err) - } - } - - if target == nil { - return nil - } - - labels := target.GetLabels() - syncEnabled := labels[generate.LabelSynchronize] == "enable" - clone := labels[generate.LabelClonePolicyName] != "" - - if syncEnabled && !clone { - if err := c.client.DeleteResource(context.TODO(), target.GetAPIVersion(), target.GetKind(), target.GetNamespace(), target.GetName(), false); err != nil { - return fmt.Errorf("failed to delete data resource %s/%s: %v", targetSpec.Namespace, targetSpec.Name, err) - } - } - return nil -} - func (c *controller) enqueueUpdateRequest(obj interface{}) { key, err := cache.MetaNamespaceKeyFunc(obj) if err != nil { @@ -286,74 +201,6 @@ func (c *controller) enqueueUpdateRequest(obj interface{}) { c.queue.Add(key) } -func (c *controller) updatePolicy(_, obj interface{}) { - key, err := cache.MetaNamespaceKeyFunc(obj) - if err != nil { - logger.Error(err, "failed to compute policy key") - } else { - logger.V(4).Info("updating policy", "key", key) - urs, err := c.urLister.GetUpdateRequestsForClusterPolicy(key) - if err != nil { - logger.Error(err, "failed to list update requests for policy", "key", key) - return - } - // re-evaluate the UR as the policy was updated - for _, ur := range urs { - c.enqueueUpdateRequest(ur) - } - } -} - -func (c *controller) deletePolicy(obj interface{}) { - var p kyvernov1.PolicyInterface - - switch kubeutils.GetObjectWithTombstone(obj).(type) { - case *kyvernov1.ClusterPolicy: - p = kubeutils.GetObjectWithTombstone(obj).(*kyvernov1.ClusterPolicy) - case *kyvernov1.Policy: - p = kubeutils.GetObjectWithTombstone(obj).(*kyvernov1.Policy) - default: - logger.Info("Failed to get deleted object", "obj", obj) - return - } - - logger.V(4).Info("deleting policy", "name", p.GetName()) - key, err := cache.MetaNamespaceKeyFunc(kubeutils.GetObjectWithTombstone(obj)) - if err != nil { - logger.Error(err, "failed to compute policy key") - } else { - logger.V(4).Info("updating policy", "key", key) - - // check if deleted policy is clone generate policy - generatePolicyWithClone := c.processDeletePolicyForCloneGenerateRule(p, p.GetName()) - - // get the generated resource name from update request - selector := labels.SelectorFromSet(labels.Set(map[string]string{ - kyvernov1beta1.URGeneratePolicyLabel: p.GetName(), - })) - - urList, err := c.urLister.List(selector) - if err != nil { - logger.Error(err, "failed to get update request for the resource", "label", kyvernov1beta1.URGeneratePolicyLabel) - return - } - - if !generatePolicyWithClone { - // re-evaluate the UR as the policy was updated - for _, ur := range urList { - logger.V(4).Info("enqueue the ur for cleanup", "ur name", ur.Name) - c.enqueueUpdateRequest(ur) - } - } else { - for _, ur := range urList { - for _, generatedResource := range ur.Status.GeneratedResources { - logger.V(4).Info("retaining resource for cloned policy", "apiVersion", generatedResource.APIVersion, "kind", generatedResource.Kind, "name", generatedResource.Name, "namespace", generatedResource.Namespace) - } - } - } - } -} - func (c *controller) addUR(obj interface{}) { ur := obj.(*kyvernov1beta1.UpdateRequest) c.enqueueUpdateRequest(ur) @@ -399,7 +246,7 @@ func (c *controller) processUR(ur *kyvernov1beta1.UpdateRequest) error { } func (c *controller) cleanUR(ur *kyvernov1beta1.UpdateRequest) error { - if ur.Spec.GetRequestType() == kyvernov1beta1.Mutate && ur.Status.State == kyvernov1beta1.Completed { + if ur.Status.State == kyvernov1beta1.Completed { return c.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).Delete(context.TODO(), ur.GetName(), metav1.DeleteOptions{}) } return nil @@ -415,67 +262,3 @@ func (c *controller) getPolicy(key string) (kyvernov1.PolicyInterface, error) { } return c.polLister.Policies(namespace).Get(name) } - -func (c *controller) processDeletePolicyForCloneGenerateRule(policy kyvernov1.PolicyInterface, pName string) bool { - generatePolicyWithClone := false - for _, rule := range policy.GetSpec().Rules { - clone, sync := rule.GetCloneSyncForGenerate() - if !(clone && sync) { - continue - } - logger.V(4).Info("generate policy with clone, remove policy name from label of source resource") - generatePolicyWithClone = true - var retryCount int - for retryCount < 5 { - err := c.updateSourceResource(policy.GetName(), rule) - if err != nil { - logger.Error(err, "failed to update generate source resource labels") - if apierrors.IsConflict(err) { - retryCount++ - } else { - break - } - } - break - } - } - - return generatePolicyWithClone -} - -func (c *controller) updateSourceResource(pName string, rule kyvernov1.Rule) error { - obj, err := c.client.GetResource(context.TODO(), "", rule.Generation.Kind, rule.Generation.Clone.Namespace, rule.Generation.Clone.Name) - if err != nil { - return fmt.Errorf("source resource %s/%s/%s not found: %w", rule.Generation.Kind, rule.Generation.Clone.Namespace, rule.Generation.Clone.Name, err) - } - - var update bool - labels := obj.GetLabels() - update, labels = removePolicyFromLabels(pName, labels) - if !update { - return nil - } - - obj.SetLabels(labels) - _, err = c.client.UpdateResource(context.TODO(), obj.GetAPIVersion(), rule.Generation.Kind, rule.Generation.Clone.Namespace, obj, false) - return err -} - -func removePolicyFromLabels(pName string, labels map[string]string) (bool, map[string]string) { - if len(labels) == 0 { - return false, labels - } - if labels[generate.LabelClonePolicyName] != "" { - policyNames := labels[generate.LabelClonePolicyName] - if strings.Contains(policyNames, pName) { - desiredLabels := make(map[string]string, len(labels)-1) - for k, v := range labels { - if k != generate.LabelClonePolicyName { - desiredLabels[k] = v - } - } - return true, desiredLabels - } - } - return false, labels -} diff --git a/pkg/policy/generate.go b/pkg/policy/generate.go index 62c1df081d..066e3cb156 100644 --- a/pkg/policy/generate.go +++ b/pkg/policy/generate.go @@ -6,6 +6,7 @@ import ( kyvernov1 "github.com/kyverno/kyverno/api/kyverno/v1" kyvernov1beta1 "github.com/kyverno/kyverno/api/kyverno/v1beta1" + "github.com/kyverno/kyverno/pkg/autogen" "github.com/kyverno/kyverno/pkg/background/common" generateutils "github.com/kyverno/kyverno/pkg/background/generate" "github.com/kyverno/kyverno/pkg/config" @@ -24,7 +25,7 @@ func (pc *PolicyController) handleGenerate(policyKey string, policy kyvernov1.Po updateUR(pc.kyvernoClient, pc.urLister.UpdateRequests(config.KyvernoNamespace()), policyKey, generateURs, pc.log.WithName("updateUR")) for _, rule := range policy.GetSpec().Rules { - if err := pc.createUR(policy, rule); err != nil { + if err := pc.createUR(policy, rule, false); err != nil { logger.Error(err, "failed to create UR on policy event") } @@ -39,7 +40,7 @@ func (pc *PolicyController) handleGenerate(policyKey string, policy kyvernov1.Po continue } - ur := newUR(policy, resourceSpecFromUnstructured(trigger), ruleType) + ur := newUR(policy, common.ResourceSpecFromUnstructured(*trigger), rule.Name, ruleType, false) skip, err := pc.handleUpdateRequest(ur, trigger, rule, policy) if err != nil { pc.log.Error(err, "failed to create new UR on policy update", "policy", policy.GetName(), "rule", rule.Name, "rule type", ruleType, @@ -70,32 +71,81 @@ func (pc *PolicyController) listGenerateURs(policyKey string, trigger *unstructu return generateURs } -func (pc *PolicyController) createUR(policy kyvernov1.PolicyInterface, rule kyvernov1.Rule) error { +func (pc *PolicyController) createURForDownstreamDeletion(policy kyvernov1.PolicyInterface) error { + var errs []error + rules := autogen.ComputeRules(policy) + for _, r := range rules { + generateType, sync := r.GetGenerateTypeAndSync() + if sync && (generateType == kyvernov1.Data) { + if err := pc.createUR(policy, r, true); err != nil { + errs = append(errs, err) + } + } + } + return multierr.Combine(errs...) +} + +func (pc *PolicyController) createUR(policy kyvernov1.PolicyInterface, rule kyvernov1.Rule, deleteDownstream bool) error { generate := rule.Generation if !generate.Synchronize { // no action for non-sync policy/rule return nil } - + var errorList []error if generate.GetData() != nil { - downstream, err := pc.client.GetResource(context.TODO(), generate.APIVersion, generate.Kind, generate.Namespace, generate.Name) + downstreams, err := generateutils.FindDownstream(pc.client, policy, rule) if err != nil { return err } - labels := downstream.GetLabels() - trigger := generateutils.TriggerFromLabels(labels) - ur := newUR(policy, trigger, kyvernov1beta1.Generate) - created, err := pc.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).Create(context.TODO(), ur, metav1.CreateOptions{}) - if err != nil { - return err - } - updated := created.DeepCopy() - updated.Status.State = kyvernov1beta1.Pending - _, err = pc.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).UpdateStatus(context.TODO(), updated, metav1.UpdateOptions{}) - if err != nil { - return err + for _, downstream := range downstreams.Items { + labels := downstream.GetLabels() + trigger := generateutils.TriggerFromLabels(labels) + ur := newUR(policy, trigger, rule.Name, kyvernov1beta1.Generate, deleteDownstream) + created, err := pc.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).Create(context.TODO(), ur, metav1.CreateOptions{}) + if err != nil { + errorList = append(errorList, err) + continue + } + updated := created.DeepCopy() + updated.Status = newURStatus(downstream) + _, err = pc.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).UpdateStatus(context.TODO(), updated, metav1.UpdateOptions{}) + if err != nil { + errorList = append(errorList, err) + continue + } } } - return nil + return multierr.Combine(errorList...) +} + +// ruleDeletion returns true if any rule is deleted, along with deleted rules +func ruleDeletion(old, new kyvernov1.PolicyInterface) (_ kyvernov1.PolicyInterface, ruleDeleted bool) { + if !new.GetDeletionTimestamp().IsZero() { + return nil, false + } + + newRules := new.GetSpec().Rules + oldRules := old.GetSpec().Rules + newRulesMap := make(map[string]bool, len(newRules)) + var deletedRules []kyvernov1.Rule + + for _, r := range newRules { + newRulesMap[r.Name] = true + } + for _, r := range oldRules { + if exist := newRulesMap[r.Name]; !exist { + deletedRules = append(deletedRules, r) + ruleDeleted = true + } + } + + return buildPolicyWithDeletedRules(old, deletedRules), ruleDeleted +} + +func buildPolicyWithDeletedRules(policy kyvernov1.PolicyInterface, deletedRules []kyvernov1.Rule) kyvernov1.PolicyInterface { + newPolicy := policy.CreateDeepCopy() + spec := newPolicy.GetSpec() + spec.SetRules(deletedRules) + return newPolicy } diff --git a/pkg/policy/mutate.go b/pkg/policy/mutate.go index d7b33599cb..53a6f482c8 100644 --- a/pkg/policy/mutate.go +++ b/pkg/policy/mutate.go @@ -31,7 +31,7 @@ func (pc *PolicyController) handleMutate(policyKey string, policy kyvernov1.Poli } logger.Info("creating new UR for mutate") - ur := newUR(policy, resourceSpecFromUnstructured(trigger), ruleType) + ur := newUR(policy, backgroundcommon.ResourceSpecFromUnstructured(*trigger), rule.Name, ruleType, false) skip, err := pc.handleUpdateRequest(ur, trigger, rule, policy) if err != nil { pc.log.Error(err, "failed to create new UR on policy update", "policy", policy.GetName(), "rule", rule.Name, "rule type", ruleType, diff --git a/pkg/policy/policy_controller.go b/pkg/policy/policy_controller.go index 6c2e5d45c8..d7f44f3bc6 100644 --- a/pkg/policy/policy_controller.go +++ b/pkg/policy/policy_controller.go @@ -11,7 +11,6 @@ import ( "github.com/go-logr/logr" kyvernov1 "github.com/kyverno/kyverno/api/kyverno/v1" kyvernov1beta1 "github.com/kyverno/kyverno/api/kyverno/v1beta1" - "github.com/kyverno/kyverno/pkg/autogen" backgroundcommon "github.com/kyverno/kyverno/pkg/background/common" "github.com/kyverno/kyverno/pkg/client/clientset/versioned" "github.com/kyverno/kyverno/pkg/client/clientset/versioned/scheme" @@ -211,6 +210,12 @@ func (pc *PolicyController) updatePolicy(old, cur interface{}) { } logger.V(2).Info("updating policy", "name", oldP.GetName()) + if deleted, ok := ruleDeletion(oldP, curP); ok { + err := pc.createURForDownstreamDeletion(deleted) + if err != nil { + utilruntime.HandleError(fmt.Errorf("failed to create UR on rule deletion, clean up downstream resource may be failed: %v", err)) + } + } pc.enqueuePolicy(curP) } @@ -230,16 +235,10 @@ func (pc *PolicyController) deletePolicy(obj interface{}) { } logger.Info("policy deleted", "uid", p.GetUID(), "kind", p.GetKind(), "namespace", p.GetNamespace(), "name", p.GetName()) - - // do not clean up UR on generate clone (sync=true) policy deletion - rules := autogen.ComputeRules(p) - for _, r := range rules { - clone, sync := r.GetCloneSyncForGenerate() - if clone && sync { - return - } + err := pc.createURForDownstreamDeletion(p) + if err != nil { + utilruntime.HandleError(fmt.Errorf("failed to create UR on policy deletion, clean up downstream resource may be failed: %v", err)) } - pc.enqueuePolicy(p) } func (pc *PolicyController) enqueuePolicy(policy kyvernov1.PolicyInterface) { @@ -425,7 +424,13 @@ func (pc *PolicyController) handleUpdateRequest(ur *kyvernov1beta1.UpdateRequest } pc.log.V(2).Info("creating new UR for generate") - _, err := pc.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).Create(context.TODO(), ur, metav1.CreateOptions{}) + created, err := pc.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).Create(context.TODO(), ur, metav1.CreateOptions{}) + if err != nil { + return false, err + } + updated := created.DeepCopy() + updated.Status.State = kyvernov1beta1.Pending + _, err = pc.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).UpdateStatus(context.TODO(), updated, metav1.UpdateOptions{}) if err != nil { return false, err } @@ -474,12 +479,3 @@ func updateUR(kyvernoClient versioned.Interface, urLister kyvernov1beta1listers. } } } - -func resourceSpecFromUnstructured(obj *unstructured.Unstructured) kyvernov1.ResourceSpec { - return kyvernov1.ResourceSpec{ - APIVersion: obj.GetAPIVersion(), - Kind: obj.GetKind(), - Namespace: obj.GetNamespace(), - Name: obj.GetName(), - } -} diff --git a/pkg/policy/updaterequest.go b/pkg/policy/updaterequest.go index fe8b3ecb99..9f9cb89c35 100644 --- a/pkg/policy/updaterequest.go +++ b/pkg/policy/updaterequest.go @@ -6,10 +6,11 @@ import ( common "github.com/kyverno/kyverno/pkg/background/common" "github.com/kyverno/kyverno/pkg/config" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/labels" ) -func newUR(policy kyvernov1.PolicyInterface, trigger kyvernov1.ResourceSpec, ruleType kyvernov1beta1.RequestType) *kyvernov1beta1.UpdateRequest { +func newUR(policy kyvernov1.PolicyInterface, trigger kyvernov1.ResourceSpec, ruleName string, ruleType kyvernov1beta1.RequestType, deleteDownstream bool) *kyvernov1beta1.UpdateRequest { var policyNameNamespaceKey string if policy.IsNamespaced() { @@ -26,6 +27,10 @@ func newUR(policy kyvernov1.PolicyInterface, trigger kyvernov1.ResourceSpec, rul } return &kyvernov1beta1.UpdateRequest{ + TypeMeta: metav1.TypeMeta{ + APIVersion: kyvernov1beta1.SchemeGroupVersion.String(), + Kind: "UpdateRequest", + }, ObjectMeta: metav1.ObjectMeta{ GenerateName: "ur-", Namespace: config.KyvernoNamespace(), @@ -34,12 +39,28 @@ func newUR(policy kyvernov1.PolicyInterface, trigger kyvernov1.ResourceSpec, rul Spec: kyvernov1beta1.UpdateRequestSpec{ Type: ruleType, Policy: policyNameNamespaceKey, + Rule: ruleName, Resource: kyvernov1.ResourceSpec{ Kind: trigger.GetKind(), Namespace: trigger.GetNamespace(), Name: trigger.GetName(), APIVersion: trigger.GetAPIVersion(), }, + DeleteDownstream: deleteDownstream, + }, + } +} + +func newURStatus(downstream unstructured.Unstructured) kyvernov1beta1.UpdateRequestStatus { + return kyvernov1beta1.UpdateRequestStatus{ + State: kyvernov1beta1.Pending, + GeneratedResources: []kyvernov1.ResourceSpec{ + { + APIVersion: downstream.GetAPIVersion(), + Kind: downstream.GetKind(), + Namespace: downstream.GetNamespace(), + Name: downstream.GetName(), + }, }, } } diff --git a/pkg/webhooks/resource/generation/handler.go b/pkg/webhooks/resource/generation/handler.go index fba2c10088..67b3c1a8db 100644 --- a/pkg/webhooks/resource/generation/handler.go +++ b/pkg/webhooks/resource/generation/handler.go @@ -158,10 +158,13 @@ func (h *generationHandler) createUR(ctx context.Context, policyContext *engine. return fmt.Errorf("labels have been changed, new: %v, old: %v", labels, oldLabels) } + managedBy := oldLabels[kyvernov1.LabelAppManagedBy] == kyvernov1.ValueKyvernoApp deleteDownstream := false if reflect.DeepEqual(new, unstructured.Unstructured{}) { - deleteDownstream = true labels = oldLabels + if !managedBy { + deleteDownstream = true + } } pName := labels[common.GeneratePolicyLabel] pNamespace := labels[common.GeneratePolicyNamespaceLabel] @@ -187,6 +190,7 @@ func (h *generationHandler) createUR(ctx context.Context, policyContext *engine. Resource: generateutils.TriggerFromLabels(labels), } ur.DeleteDownstream = deleteDownstream + if err := h.urGenerator.Apply(ctx, ur, admissionv1.Update); err != nil { e := event.NewBackgroundFailedEvent(err, pKey, pRuleName, event.GeneratePolicyController, &new) h.eventGen.Add(e...) diff --git a/pkg/webhooks/updaterequest/generator.go b/pkg/webhooks/updaterequest/generator.go index 7ab6dfc615..7033d1a65b 100644 --- a/pkg/webhooks/updaterequest/generator.go +++ b/pkg/webhooks/updaterequest/generator.go @@ -105,12 +105,18 @@ func (g *generator) tryApplyResource(ctx context.Context, urSpec kyvernov1beta1. }, Spec: urSpec, } - if new, err := g.client.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).Create(ctx, &ur, metav1.CreateOptions{}); err != nil { + created, err := g.client.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).Create(ctx, &ur, metav1.CreateOptions{}) + if err != nil { l.V(4).Error(err, "failed to create UpdateRequest, retrying", "name", ur.GetGenerateName(), "namespace", ur.GetNamespace()) return err - } else { - l.V(4).Info("successfully created UpdateRequest", "name", new.GetName(), "namespace", ur.GetNamespace()) } + updated := created.DeepCopy() + updated.Status.State = kyvernov1beta1.Pending + _, err = g.client.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).UpdateStatus(context.TODO(), updated, metav1.UpdateOptions{}) + if err != nil { + return err + } + l.V(4).Info("successfully created UpdateRequest", "name", updated.GetName(), "namespace", ur.GetNamespace()) } return nil } diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/02-ns.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/02-ns.yaml index 26f9d8ac2e..6825f39a12 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/02-ns.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/02-ns.yaml @@ -1,4 +1,4 @@ apiVersion: v1 kind: Namespace metadata: - name: bar \ No newline at end of file + name: cpol-clone-nosync-create-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/02-sleep.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/02-sleep.yaml new file mode 100644 index 0000000000..3bba5572a2 --- /dev/null +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/02-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 diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/02-assert.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/03-assert.yaml similarity index 57% rename from test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/02-assert.yaml rename to test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/03-assert.yaml index 54cede2c50..6fcc5490c3 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/02-assert.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/03-assert.yaml @@ -2,4 +2,4 @@ apiVersion: v1 kind: Secret metadata: name: regcred - namespace: bar \ No newline at end of file + namespace: cpol-clone-nosync-create-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/99-cleanup.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/99-cleanup.yaml deleted file mode 100644 index 1c6b4578bc..0000000000 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-create/99-cleanup.yaml +++ /dev/null @@ -1,4 +0,0 @@ -apiVersion: kuttl.dev/v1beta1 -kind: TestStep -commands: - - command: kubectl delete -f 01-manifests.yaml,02-ns.yaml --force --wait=true --ignore-not-found=true \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/02-assert.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/02-assert.yaml index 54cede2c50..a2725c76c3 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/02-assert.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/02-assert.yaml @@ -2,4 +2,4 @@ apiVersion: v1 kind: Secret metadata: name: regcred - namespace: bar \ No newline at end of file + namespace: cpol-clone-nosync-delete-downstream-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/02-ns.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/02-ns.yaml index 26f9d8ac2e..cc8635ea3b 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/02-ns.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/02-ns.yaml @@ -1,4 +1,4 @@ apiVersion: v1 kind: Namespace metadata: - name: bar \ No newline at end of file + name: cpol-clone-nosync-delete-downstream-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/03-assert.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/03-assert.yaml index 26f9d8ac2e..cc8635ea3b 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/03-assert.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/03-assert.yaml @@ -1,4 +1,4 @@ apiVersion: v1 kind: Namespace metadata: - name: bar \ No newline at end of file + name: cpol-clone-nosync-delete-downstream-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/04-delete-secret.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/04-delete-secret.yaml index 9040065230..f4db75bf81 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/04-delete-secret.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/04-delete-secret.yaml @@ -4,4 +4,4 @@ delete: - apiVersion: v1 kind: Secret name: regcred - namespace: bar \ No newline at end of file + namespace: cpol-clone-nosync-delete-downstream-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/06-errors.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/06-errors.yaml index 12452a8cbf..8395b9ce7e 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/06-errors.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/06-errors.yaml @@ -3,4 +3,4 @@ apiVersion: v1 kind: Secret metadata: name: regcred - namespace: bar \ No newline at end of file + namespace: cpol-clone-nosync-delete-downstream-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/99-cleanup.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/99-cleanup.yaml deleted file mode 100644 index 1c6b4578bc..0000000000 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/nosync/cpol-clone-nosync-delete-downstream/99-cleanup.yaml +++ /dev/null @@ -1,4 +0,0 @@ -apiVersion: kuttl.dev/v1beta1 -kind: TestStep -commands: - - command: kubectl delete -f 01-manifests.yaml,02-ns.yaml --force --wait=true --ignore-not-found=true \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-create/02-assert.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-create/02-assert.yaml index 54cede2c50..25f231ce0a 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-create/02-assert.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-create/02-assert.yaml @@ -2,4 +2,4 @@ apiVersion: v1 kind: Secret metadata: name: regcred - namespace: bar \ No newline at end of file + namespace: cpol-clone-sync-create-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-create/02-ns.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-create/02-ns.yaml index 26f9d8ac2e..1b9e079489 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-create/02-ns.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-create/02-ns.yaml @@ -1,4 +1,4 @@ apiVersion: v1 kind: Namespace metadata: - name: bar \ No newline at end of file + name: cpol-clone-sync-create-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/02-assert.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/02-assert.yaml index 54cede2c50..a2023835ff 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/02-assert.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/02-assert.yaml @@ -2,4 +2,4 @@ apiVersion: v1 kind: Secret metadata: name: regcred - namespace: bar \ No newline at end of file + namespace: cpol-clone-sync-delete-downstream-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/02-ns.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/02-ns.yaml index 26f9d8ac2e..73241aea81 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/02-ns.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/02-ns.yaml @@ -1,4 +1,4 @@ apiVersion: v1 kind: Namespace metadata: - name: bar \ No newline at end of file + name: cpol-clone-sync-delete-downstream-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/03-assert.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/03-assert.yaml index 26f9d8ac2e..73241aea81 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/03-assert.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/03-assert.yaml @@ -1,4 +1,4 @@ apiVersion: v1 kind: Namespace metadata: - name: bar \ No newline at end of file + name: cpol-clone-sync-delete-downstream-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/04-delete-secret.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/04-delete-secret.yaml index 9040065230..edf7e96e36 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/04-delete-secret.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/04-delete-secret.yaml @@ -4,4 +4,4 @@ delete: - apiVersion: v1 kind: Secret name: regcred - namespace: bar \ No newline at end of file + namespace: cpol-clone-sync-delete-downstream-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/06-assert.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/06-assert.yaml index c1a3970413..f73238f5bd 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/06-assert.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/clone/sync/cpol-clone-sync-delete-downstream/06-assert.yaml @@ -3,4 +3,4 @@ apiVersion: v1 kind: Secret metadata: name: regcred - namespace: bar \ No newline at end of file + namespace: cpol-clone-sync-delete-downstream-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/02-assert.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/02-assert.yaml index e20de3d1bb..b8693e22e7 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/02-assert.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/02-assert.yaml @@ -7,4 +7,4 @@ metadata: labels: somekey: somevalue name: zk-kafka-address - namespace: bar \ No newline at end of file + namespace: cpol-data-nosync-delete-downstream-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/02-ns.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/02-ns.yaml index 26f9d8ac2e..8ce484e8ff 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/02-ns.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/02-ns.yaml @@ -1,4 +1,4 @@ apiVersion: v1 kind: Namespace metadata: - name: bar \ No newline at end of file + name: cpol-data-nosync-delete-downstream-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/04-downstream-delete.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/04-downstream-delete.yaml index c0b69b5c96..c74d2620f2 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/04-downstream-delete.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/04-downstream-delete.yaml @@ -4,4 +4,4 @@ delete: - apiVersion: v1 kind: ConfigMap name: zk-kafka-address - namespace: bar \ No newline at end of file + namespace: cpol-data-nosync-delete-downstream-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/05-errors.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/05-errors.yaml index 322ded2e15..c73c35e183 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/05-errors.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/nosync/cpol-data-nosync-delete-downstream/05-errors.yaml @@ -2,4 +2,4 @@ apiVersion: v1 kind: ConfigMap metadata: name: zk-kafka-address - namespace: bar \ No newline at end of file + namespace: cpol-data-nosync-delete-downstream-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-create/02-assert.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-create/02-assert.yaml index e20de3d1bb..81e6d561a0 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-create/02-assert.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-create/02-assert.yaml @@ -7,4 +7,4 @@ metadata: labels: somekey: somevalue name: zk-kafka-address - namespace: bar \ No newline at end of file + namespace: cpol-data-sync-create-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-create/02-ns.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-create/02-ns.yaml index 26f9d8ac2e..06bc648e89 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-create/02-ns.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-create/02-ns.yaml @@ -1,4 +1,4 @@ apiVersion: v1 kind: Namespace metadata: - name: bar \ No newline at end of file + name: cpol-data-sync-create-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-create/99-cleanup.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-create/99-cleanup.yaml deleted file mode 100644 index 1c6b4578bc..0000000000 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-create/99-cleanup.yaml +++ /dev/null @@ -1,4 +0,0 @@ -apiVersion: kuttl.dev/v1beta1 -kind: TestStep -commands: - - command: kubectl delete -f 01-manifests.yaml,02-ns.yaml --force --wait=true --ignore-not-found=true \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-downstream/02-assert.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-downstream/02-assert.yaml index f241b50092..514c3314f8 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-downstream/02-assert.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-downstream/02-assert.yaml @@ -7,4 +7,4 @@ metadata: labels: somekey: somevalue name: zk-kafka-address - namespace: falcon-heavy \ No newline at end of file + namespace: cpol-data-sync-delete-downstream-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-downstream/02-ns.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-downstream/02-ns.yaml index 0c36dd513b..e38924d1d0 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-downstream/02-ns.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-downstream/02-ns.yaml @@ -1,4 +1,4 @@ apiVersion: v1 kind: Namespace metadata: - name: falcon-heavy \ No newline at end of file + name: cpol-data-sync-delete-downstream-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-downstream/03-delete.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-downstream/03-delete.yaml index 78b229f0aa..c6ca9a877a 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-downstream/03-delete.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-downstream/03-delete.yaml @@ -5,4 +5,4 @@ delete: - apiVersion: v1 kind: ConfigMap name: zk-kafka-address - namespace: falcon-heavy \ No newline at end of file + namespace: cpol-data-sync-delete-downstream-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-downstream/05-assert.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-downstream/05-assert.yaml index f241b50092..514c3314f8 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-downstream/05-assert.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-downstream/05-assert.yaml @@ -7,4 +7,4 @@ metadata: labels: somekey: somevalue name: zk-kafka-address - namespace: falcon-heavy \ No newline at end of file + namespace: cpol-data-sync-delete-downstream-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/01-assert.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/01-assert.yaml index a74a39118d..daed8b6b35 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/01-assert.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/01-assert.yaml @@ -1,7 +1,7 @@ apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: - name: zk-kafka-address + name: cpol-data-sync-delete-policy status: conditions: - reason: Succeeded diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/01-manifests.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/01-manifests.yaml index e1e1779aec..02419882f8 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/01-manifests.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/01-manifests.yaml @@ -1,11 +1,11 @@ apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: - name: zk-kafka-address + name: cpol-data-sync-delete-policy spec: generateExistingOnPolicyUpdate: false rules: - - name: k-kafka-address + - name: cpol-data-sync-delete-rule match: any: - resources: diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/02-assert.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/02-assert.yaml index e20de3d1bb..6dcd9775cb 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/02-assert.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/02-assert.yaml @@ -7,4 +7,4 @@ metadata: labels: somekey: somevalue name: zk-kafka-address - namespace: bar \ No newline at end of file + namespace: cpol-data-sync-delete-policy-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/02-ns.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/02-ns.yaml index 26f9d8ac2e..3410a2282f 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/02-ns.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/02-ns.yaml @@ -1,4 +1,4 @@ apiVersion: v1 kind: Namespace metadata: - name: bar \ No newline at end of file + name: cpol-data-sync-delete-policy-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/03-assert.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/03-assert.yaml index e20de3d1bb..6dcd9775cb 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/03-assert.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/03-assert.yaml @@ -7,4 +7,4 @@ metadata: labels: somekey: somevalue name: zk-kafka-address - namespace: bar \ No newline at end of file + namespace: cpol-data-sync-delete-policy-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/04-errors.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/04-errors.yaml index 322ded2e15..c2c9de8721 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/04-errors.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/04-errors.yaml @@ -2,4 +2,4 @@ apiVersion: v1 kind: ConfigMap metadata: name: zk-kafka-address - namespace: bar \ No newline at end of file + namespace: cpol-data-sync-delete-policy-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/04-policy-delete.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/04-policy-delete.yaml index e8dff700b2..97578b051a 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/04-policy-delete.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/04-policy-delete.yaml @@ -3,4 +3,4 @@ kind: TestStep delete: - apiVersion: kyverno.io/v1 kind: ClusterPolicy - name: zk-kafka-address \ No newline at end of file + name: cpol-data-sync-delete-policy \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/99-cleanup.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/99-cleanup.yaml deleted file mode 100644 index 1c6b4578bc..0000000000 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-policy/99-cleanup.yaml +++ /dev/null @@ -1,4 +0,0 @@ -apiVersion: kuttl.dev/v1beta1 -kind: TestStep -commands: - - command: kubectl delete -f 01-manifests.yaml,02-ns.yaml --force --wait=true --ignore-not-found=true \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/01-clusterpolicy.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/01-clusterpolicy.yaml new file mode 100644 index 0000000000..f3857739b0 --- /dev/null +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/01-clusterpolicy.yaml @@ -0,0 +1,6 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +apply: +- policy.yaml +assert: +- policy-ready.yaml \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/02-ns.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/02-ns.yaml new file mode 100644 index 0000000000..0a93002b9a --- /dev/null +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/02-ns.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: cpol-data-sync-delete-rule \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/03-check.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/03-check.yaml new file mode 100644 index 0000000000..fe3c44bda5 --- /dev/null +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/03-check.yaml @@ -0,0 +1,5 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +assert: +- secret.yaml +- configmap.yaml \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/04-delete-rule.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/04-delete-rule.yaml new file mode 100644 index 0000000000..df1d76e6be --- /dev/null +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/04-delete-rule.yaml @@ -0,0 +1,6 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +apply: +- delete-rule.yaml +assert: +- policy-ready.yaml \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/05-sleep.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/05-sleep.yaml new file mode 100644 index 0000000000..3bba5572a2 --- /dev/null +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/05-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 diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/06-checks.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/06-checks.yaml new file mode 100644 index 0000000000..d25124adb7 --- /dev/null +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/06-checks.yaml @@ -0,0 +1,7 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +apply: +assert: +- secret.yaml +error: +- configmap.yaml diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/README.md b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/README.md new file mode 100644 index 0000000000..628111ceaa --- /dev/null +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/README.md @@ -0,0 +1,11 @@ +## Description + +This test checks to ensure that deletion of a rule in a ClusterPolicy generate rule, data declaration, with sync enabled, results in the downstream resource's deletion. + +## Expected Behavior + +The downstream (generated) resource is expected to be deleted if the corresponding rule within a ClusterPolicy is deleted. If it is not deleted, the test fails. If it is deleted, the test passes. + +## Reference Issue(s) + +https://github.com/kyverno/kyverno/issues/5744 diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/configmap.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/configmap.yaml new file mode 100644 index 0000000000..860b6bb8f1 --- /dev/null +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/configmap.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +data: + KAFKA_ADDRESS: 192.168.10.13:9092,192.168.10.14:9092,192.168.10.15:9092 + ZK_ADDRESS: 192.168.10.10:2181,192.168.10.11:2181,192.168.10.12:2181 +kind: ConfigMap +metadata: + labels: + somekey: somevalue + name: zk-kafka-address + namespace: cpol-data-sync-delete-rule \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/delete-rule.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/delete-rule.yaml new file mode 100644 index 0000000000..a0ce58e7d8 --- /dev/null +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/delete-rule.yaml @@ -0,0 +1,35 @@ +apiVersion: kyverno.io/v1 +kind: ClusterPolicy +metadata: + name: multiple-gens +spec: + generateExistingOnPolicyUpdate: false + rules: + - name: super-secret + match: + any: + - resources: + kinds: + - Namespace + exclude: + any: + - resources: + namespaces: + - kube-system + - default + - kube-public + - kyverno + generate: + synchronize: true + apiVersion: v1 + kind: Secret + name: supersecret + namespace: "{{request.object.metadata.name}}" + data: + kind: Secret + type: Opaque + metadata: + labels: + somekey: somesecretvalue + data: + mysupersecretkey: bXlzdXBlcnNlY3JldHZhbHVl diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/policy-ready.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/policy-ready.yaml new file mode 100644 index 0000000000..1a5b4fb467 --- /dev/null +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/policy-ready.yaml @@ -0,0 +1,9 @@ +apiVersion: kyverno.io/v1 +kind: ClusterPolicy +metadata: + name: multiple-gens +status: + conditions: + - reason: Succeeded + status: "True" + type: Ready diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/policy.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/policy.yaml new file mode 100644 index 0000000000..66d1f39738 --- /dev/null +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/policy.yaml @@ -0,0 +1,63 @@ +apiVersion: kyverno.io/v1 +kind: ClusterPolicy +metadata: + name: multiple-gens +spec: + generateExistingOnPolicyUpdate: false + rules: + - name: k-kafka-address + match: + any: + - resources: + kinds: + - Namespace + exclude: + any: + - resources: + namespaces: + - kube-system + - default + - kube-public + - kyverno + generate: + synchronize: true + apiVersion: v1 + kind: ConfigMap + name: zk-kafka-address + namespace: "{{request.object.metadata.name}}" + data: + kind: ConfigMap + metadata: + labels: + somekey: somevalue + data: + ZK_ADDRESS: "192.168.10.10:2181,192.168.10.11:2181,192.168.10.12:2181" + KAFKA_ADDRESS: "192.168.10.13:9092,192.168.10.14:9092,192.168.10.15:9092" + - name: super-secret + match: + any: + - resources: + kinds: + - Namespace + exclude: + any: + - resources: + namespaces: + - kube-system + - default + - kube-public + - kyverno + generate: + synchronize: true + apiVersion: v1 + kind: Secret + name: supersecret + namespace: "{{request.object.metadata.name}}" + data: + kind: Secret + type: Opaque + metadata: + labels: + somekey: somesecretvalue + data: + mysupersecretkey: bXlzdXBlcnNlY3JldHZhbHVl \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/secret.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/secret.yaml new file mode 100644 index 0000000000..5ca961ce2f --- /dev/null +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-delete-rule/secret.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +data: + mysupersecretkey: bXlzdXBlcnNlY3JldHZhbHVl +kind: Secret +metadata: + labels: + somekey: somesecretvalue + name: supersecret + namespace: cpol-data-sync-delete-rule +type: Opaque \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-modify-rule/02-assert.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-modify-rule/02-assert.yaml index e20de3d1bb..911f9a96e5 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-modify-rule/02-assert.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-modify-rule/02-assert.yaml @@ -7,4 +7,4 @@ metadata: labels: somekey: somevalue name: zk-kafka-address - namespace: bar \ No newline at end of file + namespace: cpol-data-sync-modify-rule-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-modify-rule/02-ns.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-modify-rule/02-ns.yaml index 26f9d8ac2e..6f10523849 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-modify-rule/02-ns.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-modify-rule/02-ns.yaml @@ -1,4 +1,4 @@ apiVersion: v1 kind: Namespace metadata: - name: bar \ No newline at end of file + name: cpol-data-sync-modify-rule-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-modify-rule/03-assert.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-modify-rule/03-assert.yaml index 55cba48ae1..aac32e43f7 100644 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-modify-rule/03-assert.yaml +++ b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-modify-rule/03-assert.yaml @@ -7,4 +7,4 @@ metadata: labels: somekey: somevalue name: zk-kafka-address - namespace: bar \ No newline at end of file + namespace: cpol-data-sync-modify-rule-ns \ No newline at end of file diff --git a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-modify-rule/99-cleanup.yaml b/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-modify-rule/99-cleanup.yaml deleted file mode 100644 index 1c6b4578bc..0000000000 --- a/test/conformance/kuttl/generate/clusterpolicy/standard/data/sync/cpol-data-sync-modify-rule/99-cleanup.yaml +++ /dev/null @@ -1,4 +0,0 @@ -apiVersion: kuttl.dev/v1beta1 -kind: TestStep -commands: - - command: kubectl delete -f 01-manifests.yaml,02-ns.yaml --force --wait=true --ignore-not-found=true \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/01-assert.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/01-assert.yaml new file mode 100644 index 0000000000..deabee81cc --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/01-assert.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: pol-sync-clone-delete-downstream +--- +apiVersion: v1 +data: + foo: YmFy +kind: Secret +metadata: + name: regcred + namespace: pol-sync-clone-delete-downstream +type: Opaque \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/01-manifests.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/01-manifests.yaml new file mode 100644 index 0000000000..deabee81cc --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/01-manifests.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: pol-sync-clone-delete-downstream +--- +apiVersion: v1 +data: + foo: YmFy +kind: Secret +metadata: + name: regcred + namespace: pol-sync-clone-delete-downstream +type: Opaque \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/02-assert.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/02-assert.yaml new file mode 100644 index 0000000000..83228cc522 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/02-assert.yaml @@ -0,0 +1,10 @@ +apiVersion: kyverno.io/v2beta1 +kind: Policy +metadata: + name: pol-sync-clone-delete-downstream + namespace: pol-sync-clone-delete-downstream +status: + conditions: + - reason: Succeeded + status: "True" + type: Ready diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/02-policy.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/02-policy.yaml new file mode 100644 index 0000000000..c901aaddfb --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/02-policy.yaml @@ -0,0 +1,22 @@ +apiVersion: kyverno.io/v2beta1 +kind: Policy +metadata: + name: pol-sync-clone-delete-downstream + namespace: pol-sync-clone-delete-downstream +spec: + rules: + - name: gen-zk + match: + any: + - resources: + kinds: + - ConfigMap + generate: + apiVersion: v1 + kind: Secret + name: myclonedsecret + namespace: pol-sync-clone-delete-downstream + synchronize: true + clone: + namespace: pol-sync-clone-delete-downstream + name: regcred \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/03-trigger.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/03-trigger.yaml new file mode 100644 index 0000000000..218574ff7b --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/03-trigger.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +data: + foo: bar +kind: ConfigMap +metadata: + name: foo + namespace: pol-sync-clone-delete-downstream \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/04-downstream.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/04-downstream.yaml new file mode 100644 index 0000000000..80d6968ae4 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/04-downstream.yaml @@ -0,0 +1,4 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +assert: +- downstream.yaml \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/05-delete.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/05-delete.yaml new file mode 100644 index 0000000000..e79dba2b2f --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/05-delete.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +data: + foo: YmFy +kind: Secret +metadata: + name: myclonedsecret + namespace: pol-sync-clone-delete-downstream +type: Opaque \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/06-sleep.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/06-sleep.yaml new file mode 100644 index 0000000000..e330721f44 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/06-sleep.yaml @@ -0,0 +1,4 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - command: sleep 3 diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/07-downstream.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/07-downstream.yaml new file mode 100644 index 0000000000..80d6968ae4 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/07-downstream.yaml @@ -0,0 +1,4 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +assert: +- downstream.yaml \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/README.md b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/README.md new file mode 100644 index 0000000000..5102f7c150 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/README.md @@ -0,0 +1,11 @@ +## Description + +This test ensures that deletion of a downstream resource created by a Policy `generate` rule with sync enabled using a clone declaration causes it to be regenerated. If it is not regenerated, the test fails. + +## Expected Behavior + +The downstream resource, upon deletion, is expected to be recreated/recloned from the source resource. + +## Reference Issue(s) + +N/A \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/downstream.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/downstream.yaml new file mode 100644 index 0000000000..e79dba2b2f --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-downstream/downstream.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +data: + foo: YmFy +kind: Secret +metadata: + name: myclonedsecret + namespace: pol-sync-clone-delete-downstream +type: Opaque \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/01-policy.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/01-policy.yaml new file mode 100644 index 0000000000..f3857739b0 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/01-policy.yaml @@ -0,0 +1,6 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +apply: +- policy.yaml +assert: +- policy-ready.yaml \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/02-resource.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/02-resource.yaml new file mode 100644 index 0000000000..2292332eec --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/02-resource.yaml @@ -0,0 +1,6 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +apply: +- create-cm.yaml +assert: +- cloned-secret.yaml \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/03-deletesource.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/03-deletesource.yaml new file mode 100644 index 0000000000..c9c6e03766 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/03-deletesource.yaml @@ -0,0 +1,7 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +delete: +- apiVersion: v1 + kind: Secret + name: regcred + namespace: pol-clone-sync-delete-source \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/04-sleep.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/04-sleep.yaml new file mode 100644 index 0000000000..5b8bfb4701 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/04-sleep.yaml @@ -0,0 +1,4 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - command: sleep 5 \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/05-errors.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/05-errors.yaml new file mode 100644 index 0000000000..73d8431d86 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/05-errors.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +data: + foo: YmFy +kind: Secret +metadata: + name: newsecret + namespace: pol-clone-sync-delete-source +type: Opaque diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/README.md b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/README.md new file mode 100644 index 0000000000..91fd2bfb4e --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/README.md @@ -0,0 +1,11 @@ +## Description + +This test ensures that deletion of the source (upstream) resource used by a Policy `generate` rule with sync enabled using a clone declaration DOES cause deletion of downstream/cloned resources. + +## Expected Behavior + +After the source is deleted, the downstream resources should be deleted. If the downstream resource remains, the test fails. If the downstream resource is deleted, the test passes. + +## Reference Issue(s) + +N/A \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/cloned-secret.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/cloned-secret.yaml new file mode 100644 index 0000000000..33259284fe --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/cloned-secret.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +data: + foo: YmFy +kind: Secret +metadata: + name: newsecret + namespace: pol-clone-sync-delete-source +type: Opaque \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/create-cm.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/create-cm.yaml new file mode 100644 index 0000000000..106138d13b --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/create-cm.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: mycm + namespace: pol-clone-sync-delete-source +data: + food: cheese + day: monday + color: red \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/policy-ready.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/policy-ready.yaml new file mode 100644 index 0000000000..e3efbf79fa --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/policy-ready.yaml @@ -0,0 +1,10 @@ +apiVersion: kyverno.io/v2beta1 +kind: Policy +metadata: + name: pol-clone-sync-delete-source + namespace: pol-clone-sync-delete-source +status: + conditions: + - reason: Succeeded + status: "True" + type: Ready \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/policy.yaml b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/policy.yaml new file mode 100644 index 0000000000..d989af6f8f --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/clone/sync/pol-clone-sync-delete-source/policy.yaml @@ -0,0 +1,36 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: pol-clone-sync-delete-source +--- +apiVersion: v1 +data: + foo: YmFy +kind: Secret +metadata: + name: regcred + namespace: pol-clone-sync-delete-source +type: Opaque +--- +apiVersion: kyverno.io/v2beta1 +kind: Policy +metadata: + name: pol-clone-sync-delete-source + namespace: pol-clone-sync-delete-source +spec: + rules: + - name: pol-clone-sync-delete-source-secret + match: + any: + - resources: + kinds: + - ConfigMap + generate: + apiVersion: v1 + kind: Secret + name: newsecret + namespace: pol-clone-sync-delete-source + synchronize: true + clone: + namespace: pol-clone-sync-delete-source + name: regcred diff --git a/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/01-assert.yaml b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/01-assert.yaml new file mode 100644 index 0000000000..9cd68a01c7 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/01-assert.yaml @@ -0,0 +1,10 @@ +apiVersion: kyverno.io/v1 +kind: Policy +metadata: + name: multiple-gens + namespace: pol-data-sync-delete-rule +status: + conditions: + - reason: Succeeded + status: "True" + type: Ready diff --git a/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/01-manifests.yaml b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/01-manifests.yaml new file mode 100644 index 0000000000..1a4cf399fd --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/01-manifests.yaml @@ -0,0 +1,57 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: pol-data-sync-delete-rule +--- +apiVersion: kyverno.io/v1 +kind: Policy +metadata: + name: multiple-gens + namespace: pol-data-sync-delete-rule +spec: + generateExistingOnPolicyUpdate: false + rules: + - name: k-kafka-address + match: + any: + - resources: + kinds: + - Secret + names: + - trigger-secret + generate: + synchronize: true + apiVersion: v1 + kind: ConfigMap + name: zk-kafka-address + namespace: pol-data-sync-delete-rule + data: + kind: ConfigMap + metadata: + labels: + somekey: somevalue + data: + ZK_ADDRESS: "192.168.10.10:2181,192.168.10.11:2181,192.168.10.12:2181" + KAFKA_ADDRESS: "192.168.10.13:9092,192.168.10.14:9092,192.168.10.15:9092" + - name: super-secret + match: + any: + - resources: + kinds: + - Secret + names: + - trigger-secret + generate: + synchronize: true + apiVersion: v1 + kind: Secret + name: supersecret + namespace: pol-data-sync-delete-rule + data: + kind: Secret + type: Opaque + metadata: + labels: + somekey: somesecretvalue + data: + mysupersecretkey: bXlzdXBlcnNlY3JldHZhbHVl \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/02-trigger.yaml b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/02-trigger.yaml new file mode 100644 index 0000000000..d34c5e509a --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/02-trigger.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +data: + foo: YmFy +kind: Secret +metadata: + labels: + org: kyverno + name: trigger-secret + namespace: pol-data-sync-delete-rule +type: Opaque \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/03-check.yaml b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/03-check.yaml new file mode 100644 index 0000000000..fe3c44bda5 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/03-check.yaml @@ -0,0 +1,5 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +assert: +- secret.yaml +- configmap.yaml \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/04-assert.yaml b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/04-assert.yaml new file mode 100644 index 0000000000..9cd68a01c7 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/04-assert.yaml @@ -0,0 +1,10 @@ +apiVersion: kyverno.io/v1 +kind: Policy +metadata: + name: multiple-gens + namespace: pol-data-sync-delete-rule +status: + conditions: + - reason: Succeeded + status: "True" + type: Ready diff --git a/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/04-delete-rule.yaml b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/04-delete-rule.yaml new file mode 100644 index 0000000000..219b1f81fa --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/04-delete-rule.yaml @@ -0,0 +1,30 @@ +apiVersion: kyverno.io/v1 +kind: Policy +metadata: + name: multiple-gens + namespace: pol-data-sync-delete-rule +spec: + generateExistingOnPolicyUpdate: false + rules: + - name: super-secret + match: + any: + - resources: + kinds: + - Secret + names: + - trigger-secret + generate: + synchronize: true + apiVersion: v1 + kind: Secret + name: supersecret + namespace: pol-data-sync-delete-rule + data: + kind: Secret + type: Opaque + metadata: + labels: + somekey: somesecretvalue + data: + mysupersecretkey: bXlzdXBlcnNlY3JldHZhbHVl diff --git a/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/05-sleep.yaml b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/05-sleep.yaml new file mode 100644 index 0000000000..3bba5572a2 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/05-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 diff --git a/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/06-checks.yaml b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/06-checks.yaml new file mode 100644 index 0000000000..d25124adb7 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/06-checks.yaml @@ -0,0 +1,7 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +apply: +assert: +- secret.yaml +error: +- configmap.yaml diff --git a/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/README.md b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/README.md new file mode 100644 index 0000000000..75255c9be8 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/README.md @@ -0,0 +1,11 @@ +## Description + +This test checks to ensure that deletion of a rule in a Policy (Namespaced) generate rule, data declaration, with sync enabled, results in the downstream resource's deletion. + +## Expected Behavior + +The downstream (generated) resource is expected to be deleted if the corresponding rule within a Policy is deleted. If it is not deleted, the test fails. If it is deleted, the test passes. + +## Reference Issue(s) + +https://github.com/kyverno/kyverno/issues/5744 diff --git a/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/configmap.yaml b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/configmap.yaml new file mode 100644 index 0000000000..e97ab78537 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/configmap.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +data: + KAFKA_ADDRESS: 192.168.10.13:9092,192.168.10.14:9092,192.168.10.15:9092 + ZK_ADDRESS: 192.168.10.10:2181,192.168.10.11:2181,192.168.10.12:2181 +kind: ConfigMap +metadata: + labels: + somekey: somevalue + name: zk-kafka-address + namespace: pol-data-sync-delete-rule diff --git a/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/secret.yaml b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/secret.yaml new file mode 100644 index 0000000000..4c819cc6d6 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-delete-rule/secret.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +data: + mysupersecretkey: bXlzdXBlcnNlY3JldHZhbHVl +kind: Secret +metadata: + labels: + somekey: somesecretvalue + name: supersecret + namespace: pol-data-sync-delete-rule +type: Opaque \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/01-assert.yaml b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/01-assert.yaml new file mode 100644 index 0000000000..f76e4f71f5 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/01-assert.yaml @@ -0,0 +1,10 @@ +apiVersion: kyverno.io/v2beta1 +kind: Policy +metadata: + name: zk-kafka-address + namespace: pol-data-sync-modify-rule +status: + conditions: + - reason: Succeeded + status: "True" + type: Ready diff --git a/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/01-manifests.yaml b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/01-manifests.yaml new file mode 100644 index 0000000000..53f7c7deb6 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/01-manifests.yaml @@ -0,0 +1,33 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: pol-data-sync-modify-rule +--- +apiVersion: kyverno.io/v2beta1 +kind: Policy +metadata: + name: zk-kafka-address + namespace: pol-data-sync-modify-rule +spec: + generateExistingOnPolicyUpdate: true + rules: + - name: k-kafka-address + match: + any: + - resources: + kinds: + - Secret + generate: + synchronize: true + apiVersion: v1 + kind: ConfigMap + name: zk-kafka-address + namespace: pol-data-sync-modify-rule + data: + kind: ConfigMap + metadata: + labels: + somekey: somevalue + data: + ZK_ADDRESS: "192.168.10.10:2181,192.168.10.11:2181,192.168.10.12:2181" + KAFKA_ADDRESS: "192.168.10.13:9092,192.168.10.14:9092,192.168.10.15:9092" \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/02-trigger.yaml b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/02-trigger.yaml new file mode 100644 index 0000000000..81ba840078 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/02-trigger.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +data: + foo: YmFy +kind: Secret +metadata: + labels: + org: kyverno + name: trigger-secret + namespace: pol-data-sync-modify-rule +type: Opaque \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/03-assert.yaml b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/03-assert.yaml new file mode 100644 index 0000000000..4f48cf29a5 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/03-assert.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +data: + KAFKA_ADDRESS: 192.168.10.13:9092,192.168.10.14:9092,192.168.10.15:9999 + ZK_ADDRESS: 192.168.10.10:2181,192.168.10.11:2181,192.168.10.12:2181 +kind: ConfigMap +metadata: + labels: + somekey: somevalue + name: zk-kafka-address + namespace: pol-data-sync-modify-rule \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/03-policy-update.yaml b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/03-policy-update.yaml new file mode 100644 index 0000000000..a5fd100c54 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/03-policy-update.yaml @@ -0,0 +1,28 @@ +apiVersion: kyverno.io/v2beta1 +kind: Policy +metadata: + name: zk-kafka-address + namespace: pol-data-sync-modify-rule +spec: + generateExistingOnPolicyUpdate: true + rules: + - name: k-kafka-address + match: + any: + - resources: + kinds: + - Secret + generate: + synchronize: true + apiVersion: v1 + kind: ConfigMap + name: zk-kafka-address + namespace: pol-data-sync-modify-rule + data: + kind: ConfigMap + metadata: + labels: + somekey: somevalue + data: + ZK_ADDRESS: "192.168.10.10:2181,192.168.10.11:2181,192.168.10.12:2181" + KAFKA_ADDRESS: "192.168.10.13:9092,192.168.10.14:9092,192.168.10.15:9999" \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/04-assert.yaml b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/04-assert.yaml new file mode 100644 index 0000000000..4f48cf29a5 --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/04-assert.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +data: + KAFKA_ADDRESS: 192.168.10.13:9092,192.168.10.14:9092,192.168.10.15:9999 + ZK_ADDRESS: 192.168.10.10:2181,192.168.10.11:2181,192.168.10.12:2181 +kind: ConfigMap +metadata: + labels: + somekey: somevalue + name: zk-kafka-address + namespace: pol-data-sync-modify-rule \ No newline at end of file diff --git a/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/README.md b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/README.md new file mode 100644 index 0000000000..7effee6d5e --- /dev/null +++ b/test/conformance/kuttl/generate/policy/standard/data/sync/pol-data-sync-modify-rule/README.md @@ -0,0 +1,11 @@ +## Description + +This is a generate test to ensure a generate Policy using a data declaration with sync enabled and modifying the policy/rule propagates those changes to a downstream ConfigMap. + +## Expected Behavior + +The downstream (generated) resource is expected to be synced from the corresponding rule within a Policy is modified. If it is not sync, the test fails. If it is synced, the test passes. + +## Reference Issue(s) + +N/A