1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-28 02:18:15 +00:00

fix: Remove ownerReferences when cloning across Namespaces (#7517)

Signed-off-by: Mike Bryant <mike.bryant@mettle.co.uk>
Co-authored-by: shuting <shuting@nirmata.com>
This commit is contained in:
Mike Bryant 2023-06-13 16:35:10 +01:00 committed by GitHub
parent 71ff19476d
commit 93bbc57c7a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 114 additions and 4 deletions

View file

@ -46,6 +46,11 @@ func manageClone(log logr.Logger, target, sourceSpec kyvernov1.ResourceSpec, pol
sourceObjCopy := sourceObj.DeepCopy()
addSourceLabels(sourceObjCopy)
if sourceObjCopy.GetNamespace() != target.GetNamespace() && sourceObjCopy.GetOwnerReferences() != nil {
sourceObjCopy.SetOwnerReferences(nil)
}
targetObj, err := client.GetResource(context.TODO(), target.GetAPIVersion(), target.GetKind(), target.GetNamespace(), target.GetName())
if err != nil {
if apierrors.IsNotFound(err) && len(ur.Status.GeneratedResources) != 0 && !clone.Synchronize {
@ -58,10 +63,6 @@ func manageClone(log logr.Logger, target, sourceSpec kyvernov1.ResourceSpec, pol
return newSkipGenerateResponse(nil, target, fmt.Errorf("failed to get the target source: %v", err))
}
if sourceObjCopy.GetNamespace() != target.GetNamespace() && sourceObjCopy.GetOwnerReferences() != nil {
sourceObjCopy.SetOwnerReferences(nil)
}
if targetObj != nil {
sourceObjCopy.SetUID(targetObj.GetUID())
sourceObjCopy.SetSelfLink(targetObj.GetSelfLink())

View file

@ -0,0 +1,6 @@
apiVersion: kuttl.dev/v1beta1
kind: TestStep
apply:
- policy.yaml
assert:
- policy-ready.yaml

View file

@ -0,0 +1,16 @@
apiVersion: kuttl.dev/v1beta1
kind: TestStep
commands:
- script: >
kubectl -n cpol-clone-delete-ownerreferences-across-namespaces-source-ns get configmap owner -o json |
jq '{
"metadata": {
"ownerReferences": [{
"apiVersion": "v1",
"kind": "ConfigMap",
"name": "owner",
"uid": .metadata.uid
}]
}
}' |
kubectl patch -n cpol-clone-delete-ownerreferences-across-namespaces-source-ns secret cpol-clone-delete-ownerreferences-across-namespaces --patch-file=/dev/stdin

View file

@ -0,0 +1,6 @@
apiVersion: kuttl.dev/v1beta1
kind: TestStep
apply:
- trigger.yaml
assert:
- created-secret.yaml

View file

@ -0,0 +1,6 @@
apiVersion: kuttl.dev/v1beta1
kind: TestStep
commands:
- script: >
kubectl --namespace cpol-clone-delete-ownerreferences-across-namespaces-target-ns get secret cpol-clone-delete-ownerreferences-across-namespaces -o json |
jq -e '.metadata.ownerReferences == null'

View file

@ -0,0 +1,11 @@
## Description
This tests that the ownerReferences of cloned objects in different Namespaces are removed. Otherwise these objects will be immediately garbage-collected
## Expected Behavior
The background controller will strip the ownerReference when cloning between Namespaces, if it exists.
## Reference Issue(s)
- https://github.com/kyverno/kyverno/issues/2276

View file

@ -0,0 +1,8 @@
apiVersion: v1
data:
foo: YmFy
kind: Secret
metadata:
name: cpol-clone-delete-ownerreferences-across-namespaces
namespace: cpol-clone-delete-ownerreferences-across-namespaces-target-ns
type: Opaque

View file

@ -0,0 +1,9 @@
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: cpol-clone-delete-ownerreferences-across-namespaces
status:
conditions:
- reason: Succeeded
status: "True"
type: Ready

View file

@ -0,0 +1,43 @@
apiVersion: v1
kind: Namespace
metadata:
name: cpol-clone-delete-ownerreferences-across-namespaces-source-ns
---
apiVersion: v1
kind: ConfigMap
metadata:
name: owner
namespace: cpol-clone-delete-ownerreferences-across-namespaces-source-ns
type: Opaque
---
apiVersion: v1
data:
foo: YmFy
kind: Secret
metadata:
name: cpol-clone-delete-ownerreferences-across-namespaces
namespace: cpol-clone-delete-ownerreferences-across-namespaces-source-ns
type: Opaque
---
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: cpol-clone-delete-ownerreferences-across-namespaces
spec:
generateExisting: true
rules:
- generate:
apiVersion: v1
clone:
name: cpol-clone-delete-ownerreferences-across-namespaces
namespace: cpol-clone-delete-ownerreferences-across-namespaces-source-ns
kind: Secret
name: cpol-clone-delete-ownerreferences-across-namespaces
namespace: '{{request.object.metadata.name}}'
synchronize: true
match:
any:
- resources:
kinds:
- Namespace
name: clone-secret

View file

@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: cpol-clone-delete-ownerreferences-across-namespaces-target-ns