package policy // import ( // "encoding/json" // "testing" // kyverno "github.com/kyverno/kyverno/api/kyverno/v1" // "github.com/kyverno/kyverno/pkg/engine/utils" // log "github.com/kyverno/kyverno/pkg/logging" // assertnew "github.com/stretchr/testify/assert" // "gotest.tools/assert" // ) // func compareJSONAsMap(t *testing.T, expected, actual []byte) { // var expectedMap, actualMap map[string]interface{} // assert.NilError(t, json.Unmarshal(expected, &expectedMap)) // assert.NilError(t, json.Unmarshal(actual, &actualMap)) // if !assertnew.Equal(t, expectedMap, actualMap) { // t.FailNow() // } // } // func TestGeneratePodControllerRule_NilAnnotation(t *testing.T) { // policyRaw := []byte(`{ // "apiVersion": "kyverno.io/v1", // "kind": "ClusterPolicy", // "metadata": { // "name": "add-safe-to-evict" // } // }`) // var policy kyverno.ClusterPolicy // assert.Assert(t, json.Unmarshal(policyRaw, &policy)) // patches, errs := policymutation.GeneratePodControllerRule(&policy, log.GlobalLogger()) // assert.Assert(t, len(errs) == 0) // p, err := utils.ApplyPatches(policyRaw, patches) // assert.NilError(t, err) // expectedPolicy := []byte(`{ // "apiVersion": "kyverno.io/v1", // "kind": "ClusterPolicy", // "metadata": { // "name": "add-safe-to-evict", // "annotations": { // "pod-policies.kyverno.io/autogen-controllers": "none" // } // } // }`) // compareJSONAsMap(t, p, expectedPolicy) // } // func TestGeneratePodControllerRule_PredefinedAnnotation(t *testing.T) { // policyRaw := []byte(`{ // "apiVersion": "kyverno.io/v1", // "kind": "ClusterPolicy", // "metadata": { // "name": "add-safe-to-evict", // "annotations": { // "pod-policies.kyverno.io/autogen-controllers": "StatefulSet,Pod" // } // } // }`) // var policy kyverno.ClusterPolicy // assert.Assert(t, json.Unmarshal(policyRaw, &policy)) // patches, errs := policymutation.GeneratePodControllerRule(&policy, log.GlobalLogger()) // assert.Assert(t, len(errs) == 0) // assert.Assert(t, len(patches) == 1) // } // func TestGeneratePodControllerRule_DisableFeature(t *testing.T) { // policyRaw := []byte(`{ // "apiVersion": "kyverno.io/v1", // "kind": "ClusterPolicy", // "metadata": { // "annotations": { // "a": "b", // "pod-policies.kyverno.io/autogen-controllers": "none" // }, // "name": "add-safe-to-evict" // }, // "spec": { // "rules": [ // { // "name": "annotate-empty-dir", // "match": { // "resources": { // "kinds": [ // "Pod" // ] // } // }, // "mutate": { // "patchStrategicMerge": { // "metadata": { // "annotations": { // "+(cluster-autoscaler.kubernetes.io/safe-to-evict)": "true" // } // }, // "spec": { // "volumes": [ // { // "(emptyDir)": { // } // } // ] // } // } // } // } // ] // } // }`) // var policy kyverno.ClusterPolicy // assert.Assert(t, json.Unmarshal(policyRaw, &policy)) // patches, errs := policymutation.GeneratePodControllerRule(&policy, log.GlobalLogger()) // assert.Assert(t, len(errs) == 0) // assert.Assert(t, len(patches) == 0) // } // func TestGeneratePodControllerRule_Mutate(t *testing.T) { // policyRaw := []byte(`{ // "apiVersion": "kyverno.io/v1", // "kind": "ClusterPolicy", // "metadata": { // "annotations": { // "a": "b", // "pod-policies.kyverno.io/autogen-controllers": "all" // }, // "name": "add-safe-to-evict" // }, // "spec": { // "rules": [ // { // "name": "annotate-empty-dir", // "match": { // "resources": { // "kinds": [ // "Pod" // ] // } // }, // "mutate": { // "patchStrategicMerge": { // "metadata": { // "annotations": { // "+(cluster-autoscaler.kubernetes.io/safe-to-evict)": "true" // } // }, // "spec": { // "volumes": [ // { // "(emptyDir)": { // } // } // ] // } // } // } // } // ] // } // }`) // var policy kyverno.ClusterPolicy // assert.Assert(t, json.Unmarshal(policyRaw, &policy)) // patches, errs := policymutation.GeneratePodControllerRule(&policy, log.GlobalLogger()) // assert.Assert(t, len(errs) == 0) // p, err := utils.ApplyPatches(policyRaw, patches) // assert.NilError(t, err) // expectedPolicy := []byte(`{ // "apiVersion": "kyverno.io/v1", // "kind": "ClusterPolicy", // "metadata": { // "annotations": { // "a": "b", // "pod-policies.kyverno.io/autogen-controllers": "all" // }, // "name": "add-safe-to-evict" // }, // "spec": { // "rules": [ // { // "name": "annotate-empty-dir", // "match": { // "resources": { // "kinds": [ // "Pod" // ] // } // }, // "mutate": { // "patchStrategicMerge": { // "metadata": { // "annotations": { // "+(cluster-autoscaler.kubernetes.io/safe-to-evict)": "true" // } // }, // "spec": { // "volumes": [ // { // "(emptyDir)": { // } // } // ] // } // } // } // }, // { // "name": "autogen-annotate-empty-dir", // "match": { // "resources": { // "kinds": [ // "DaemonSet", // "Deployment", // "Job", // "StatefulSet" // ] // } // }, // "mutate": { // "patchStrategicMerge": { // "spec": { // "template": { // "metadata": { // "annotations": { // "+(cluster-autoscaler.kubernetes.io/safe-to-evict)": "true" // } // }, // "spec": { // "volumes": [ // { // "(emptyDir)": { // } // } // ] // } // } // } // } // } // }, // { // "name": "autogen-cronjob-annotate-empty-dir", // "match": { // "resources": { // "kinds": [ // "CronJob" // ] // } // }, // "mutate": { // "patchStrategicMerge": { // "spec": { // "jobTemplate": { // "spec": { // "template": { // "metadata": { // "annotations": { // "+(cluster-autoscaler.kubernetes.io/safe-to-evict)": "true" // } // }, // "spec": { // "volumes": [ // { // "(emptyDir)": { // } // } // ] // } // } // } // } // } // } // } // } // ] // } // }`) // compareJSONAsMap(t, expectedPolicy, p) // } // func TestGeneratePodControllerRule_ExistOtherAnnotation(t *testing.T) { // policyRaw := []byte(`{ // "apiVersion": "kyverno.io/v1", // "kind": "ClusterPolicy", // "metadata": { // "name": "add-safe-to-evict", // "annotations": { // "test": "annotation" // } // } // }`) // var policy kyverno.ClusterPolicy // assert.Assert(t, json.Unmarshal(policyRaw, &policy)) // patches, errs := policymutation.GeneratePodControllerRule(&policy, log.GlobalLogger()) // assert.Assert(t, len(errs) == 0) // p, err := utils.ApplyPatches(policyRaw, patches) // assert.NilError(t, err) // expectedPolicy := []byte(`{ // "apiVersion": "kyverno.io/v1", // "kind": "ClusterPolicy", // "metadata": { // "name": "add-safe-to-evict", // "annotations": { // "pod-policies.kyverno.io/autogen-controllers": "none", // "test": "annotation" // } // } // }`) // compareJSONAsMap(t, p, expectedPolicy) // } // func TestGeneratePodControllerRule_ValidateAnyPattern(t *testing.T) { // policyRaw := []byte(`{ // "apiVersion": "kyverno.io/v1", // "kind": "ClusterPolicy", // "metadata": { // "annotations": { // "pod-policies.kyverno.io/autogen-controllers": "Deployment" // }, // "name": "add-safe-to-evict" // }, // "spec": { // "rules": [ // { // "name": "validate-runAsNonRoot", // "match": { // "resources": { // "kinds": [ // "Pod" // ] // } // }, // "validate": { // "message": "Running as root user is not allowed. Set runAsNonRoot to true", // "anyPattern": [ // { // "spec": { // "securityContext": { // "runAsNonRoot": true // } // } // }, // { // "spec": { // "containers": [ // { // "name": "*", // "securityContext": { // "runAsNonRoot": true // } // } // ] // } // } // ] // } // } // ] // } // }`) // var policy kyverno.ClusterPolicy // assert.Assert(t, json.Unmarshal(policyRaw, &policy)) // patches, errs := policymutation.GeneratePodControllerRule(&policy, log.GlobalLogger()) // assert.Assert(t, len(errs) == 0) // p, err := utils.ApplyPatches(policyRaw, patches) // assert.NilError(t, err) // expectedPolicy := []byte(`{ // "apiVersion": "kyverno.io/v1", // "kind": "ClusterPolicy", // "metadata": { // "annotations": { // "pod-policies.kyverno.io/autogen-controllers": "Deployment" // }, // "name": "add-safe-to-evict" // }, // "spec": { // "rules": [ // { // "name": "validate-runAsNonRoot", // "match": { // "resources": { // "kinds": [ // "Pod" // ] // } // }, // "validate": { // "message": "Running as root user is not allowed. Set runAsNonRoot to true", // "anyPattern": [ // { // "spec": { // "securityContext": { // "runAsNonRoot": true // } // } // }, // { // "spec": { // "containers": [ // { // "name": "*", // "securityContext": { // "runAsNonRoot": true // } // } // ] // } // } // ] // } // }, // { // "name": "autogen-validate-runAsNonRoot", // "match": { // "resources": { // "kinds": [ // "Deployment" // ] // } // }, // "validate": { // "message": "Running as root user is not allowed. Set runAsNonRoot to true", // "anyPattern": [ // { // "spec": { // "template": { // "spec": { // "securityContext": { // "runAsNonRoot": true // } // } // } // } // }, // { // "spec": { // "template": { // "spec": { // "containers": [ // { // "name": "*", // "securityContext": { // "runAsNonRoot": true // } // } // ] // } // } // } // } // ] // } // } // ] // } // }`) // compareJSONAsMap(t, p, expectedPolicy) // } // func TestGeneratePodControllerRule_ValidatePattern(t *testing.T) { // policyRaw := []byte(`{ // "apiVersion": "kyverno.io/v1", // "kind": "ClusterPolicy", // "metadata": { // "name": "add-safe-to-evict" // }, // "spec": { // "rules": [ // { // "name": "validate-docker-sock-mount", // "match": { // "resources": { // "kinds": [ // "Pod" // ] // } // }, // "validate": { // "message": "Use of the Docker Unix socket is not allowed", // "pattern": { // "spec": { // "=(volumes)": [ // { // "=(hostPath)": { // "path": "!/var/run/docker.sock" // } // } // ] // } // } // } // } // ] // } // }`) // var policy kyverno.ClusterPolicy // // var policy, generatePolicy unstructured.Unstructured // assert.Assert(t, json.Unmarshal(policyRaw, &policy)) // patches, errs := policymutation.GeneratePodControllerRule(&policy, log.GlobalLogger()) // assert.Assert(t, len(errs) == 0) // p, err := utils.ApplyPatches(policyRaw, patches) // assert.NilError(t, err) // expectedPolicy := []byte(`{ // "apiVersion": "kyverno.io/v1", // "kind": "ClusterPolicy", // "metadata": { // "annotations": { // "pod-policies.kyverno.io/autogen-controllers": "DaemonSet,Deployment,Job,StatefulSet,CronJob" // }, // "name": "add-safe-to-evict" // }, // "spec": { // "rules": [ // { // "name": "validate-docker-sock-mount", // "match": { // "resources": { // "kinds": [ // "Pod" // ] // } // }, // "validate": { // "message": "Use of the Docker Unix socket is not allowed", // "pattern": { // "spec": { // "=(volumes)": [ // { // "=(hostPath)": { // "path": "!/var/run/docker.sock" // } // } // ] // } // } // } // }, // { // "name": "autogen-validate-docker-sock-mount", // "match": { // "resources": { // "kinds": [ // "DaemonSet", // "Deployment", // "Job", // "StatefulSet" // ] // } // }, // "validate": { // "message": "Use of the Docker Unix socket is not allowed", // "pattern": { // "spec": { // "template": { // "spec": { // "=(volumes)": [ // { // "=(hostPath)": { // "path": "!/var/run/docker.sock" // } // } // ] // } // } // } // } // } // }, // { // "name": "autogen-cronjob-validate-docker-sock-mount", // "match": { // "resources": { // "kinds": [ // "CronJob" // ] // } // }, // "validate": { // "message": "Use of the Docker Unix socket is not allowed", // "pattern": { // "spec": { // "jobTemplate": { // "spec": { // "template": { // "spec": { // "=(volumes)": [ // { // "=(hostPath)": { // "path": "!/var/run/docker.sock" // } // } // ] // } // } // } // } // } // } // } // } // ] // } // }`) // compareJSONAsMap(t, expectedPolicy, p) // }