2021-04-09 01:14:08 +02:00
|
|
|
package mutate
|
|
|
|
|
2021-09-09 18:55:20 +03:00
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"github.com/kyverno/kyverno/test/e2e"
|
|
|
|
)
|
|
|
|
|
|
|
|
var podGVR = e2e.GetGVR("", "v1", "pods")
|
2021-09-11 00:08:47 +03:00
|
|
|
var deploymentGVR = e2e.GetGVR("apps", "v1", "deployments")
|
2021-05-13 12:03:13 -07:00
|
|
|
|
|
|
|
func newNamespaceYaml(name string) []byte {
|
|
|
|
ns := fmt.Sprintf(`
|
2021-04-09 01:14:08 +02:00
|
|
|
apiVersion: v1
|
|
|
|
kind: Namespace
|
|
|
|
metadata:
|
2021-05-13 12:03:13 -07:00
|
|
|
name: %s
|
|
|
|
`, name)
|
|
|
|
|
|
|
|
return []byte(ns)
|
|
|
|
}
|
2021-04-09 01:14:08 +02:00
|
|
|
|
|
|
|
// Cluster Policy to copy the copy me label from one configmap to the target
|
|
|
|
var configMapMutationYaml = []byte(`
|
|
|
|
apiVersion: kyverno.io/v1
|
|
|
|
kind: ClusterPolicy
|
|
|
|
metadata:
|
|
|
|
name: "mutate-policy"
|
|
|
|
spec:
|
|
|
|
rules:
|
|
|
|
- name: "gen-role"
|
|
|
|
match:
|
|
|
|
resources:
|
|
|
|
kinds:
|
|
|
|
- ConfigMap
|
|
|
|
context:
|
|
|
|
- name: labelValue
|
|
|
|
apiCall:
|
|
|
|
urlPath: "/api/v1/namespaces/{{ request.object.metadata.namespace }}/configmaps"
|
|
|
|
jmesPath: "items[*]"
|
|
|
|
mutate:
|
|
|
|
patchStrategicMerge:
|
|
|
|
metadata:
|
|
|
|
labels:
|
|
|
|
+(kyverno.key/copy-me): "{{ labelValue[?metadata.name == 'source'].metadata.labels.\"kyverno.key/copy-me\" | [0] }}"
|
|
|
|
`)
|
|
|
|
|
|
|
|
var configMapMutationWithContextLogicYaml = []byte(`
|
|
|
|
apiVersion: kyverno.io/v1
|
|
|
|
kind: ClusterPolicy
|
|
|
|
metadata:
|
|
|
|
name: "mutate-policy"
|
|
|
|
spec:
|
|
|
|
rules:
|
|
|
|
- name: "gen-role"
|
|
|
|
match:
|
|
|
|
resources:
|
|
|
|
kinds:
|
|
|
|
- ConfigMap
|
|
|
|
context:
|
|
|
|
- name: labelValue
|
|
|
|
apiCall:
|
|
|
|
urlPath: "/api/v1/namespaces/{{ request.object.metadata.namespace }}/configmaps"
|
|
|
|
jmesPath: "items[?metadata.name == 'source'].metadata.labels.\"kyverno.key/copy-me\" | [0]"
|
|
|
|
mutate:
|
|
|
|
patchStrategicMerge:
|
|
|
|
metadata:
|
|
|
|
labels:
|
|
|
|
+(kyverno.key/copy-me): "{{ labelValue }}"
|
|
|
|
`)
|
|
|
|
|
2021-04-26 23:02:52 +02:00
|
|
|
var configMapMutationWithContextLabelSelectionYaml = []byte(`
|
|
|
|
apiVersion: kyverno.io/v1
|
|
|
|
kind: ClusterPolicy
|
|
|
|
metadata:
|
|
|
|
name: "mutate-policy"
|
|
|
|
spec:
|
|
|
|
rules:
|
|
|
|
- name: "gen-role"
|
|
|
|
match:
|
|
|
|
resources:
|
|
|
|
kinds:
|
|
|
|
- ConfigMap
|
|
|
|
context:
|
|
|
|
- name: labelValue
|
|
|
|
apiCall:
|
|
|
|
urlPath: "/api/v1/namespaces/{{ request.object.metadata.namespace }}/configmaps"
|
|
|
|
jmesPath: "items[?metadata.name == '{{ request.object.metadata.labels.\"kyverno.key/copy-from\" }}'].metadata.labels.\"kyverno.key/copy-me\" | [0]"
|
|
|
|
mutate:
|
|
|
|
patchStrategicMerge:
|
|
|
|
metadata:
|
|
|
|
labels:
|
|
|
|
+(kyverno.key/copy-me): "{{ labelValue }}"
|
|
|
|
`)
|
|
|
|
|
2021-04-09 01:14:08 +02:00
|
|
|
// Source ConfigMap from which data is taken to copy
|
|
|
|
var sourceConfigMapYaml = []byte(`
|
|
|
|
apiVersion: v1
|
|
|
|
kind: ConfigMap
|
|
|
|
metadata:
|
|
|
|
name: source
|
|
|
|
namespace: test-mutate
|
|
|
|
labels:
|
|
|
|
kyverno.key/copy-me: sample-value
|
|
|
|
data:
|
|
|
|
data.yaml: |
|
|
|
|
some: data
|
|
|
|
`)
|
|
|
|
|
|
|
|
// Target ConfigMap which is mutated
|
|
|
|
var targetConfigMapYaml = []byte(`
|
|
|
|
apiVersion: v1
|
|
|
|
kind: ConfigMap
|
|
|
|
metadata:
|
|
|
|
name: target
|
|
|
|
namespace: test-mutate
|
2021-04-26 23:02:52 +02:00
|
|
|
labels:
|
|
|
|
kyverno.key/copy-from: source
|
2021-04-09 01:14:08 +02:00
|
|
|
data:
|
|
|
|
data.yaml: |
|
|
|
|
some: data
|
|
|
|
`)
|
2021-05-13 12:03:13 -07:00
|
|
|
|
|
|
|
var mutateIngressCpol = []byte(`
|
|
|
|
apiVersion: kyverno.io/v1
|
|
|
|
kind: ClusterPolicy
|
|
|
|
metadata:
|
|
|
|
name: mutate-ingress-host
|
|
|
|
spec:
|
|
|
|
rules:
|
|
|
|
- name: mutate-rules-host
|
|
|
|
match:
|
|
|
|
resources:
|
|
|
|
kinds:
|
|
|
|
- Ingress
|
|
|
|
namespaces:
|
|
|
|
- test-ingress
|
|
|
|
mutate:
|
|
|
|
patchesJson6902: |-
|
|
|
|
- op: replace
|
|
|
|
path: /spec/rules/0/host
|
2021-07-02 16:47:40 +03:00
|
|
|
value: "{{request.object.spec.rules[0].host}}.mycompany.com"
|
2021-05-13 12:03:13 -07:00
|
|
|
`)
|
|
|
|
|
|
|
|
var ingressNetworkingV1 = []byte(`
|
|
|
|
apiVersion: networking.k8s.io/v1
|
|
|
|
kind: Ingress
|
|
|
|
metadata:
|
|
|
|
name: kuard-v1
|
|
|
|
namespace: test-ingress
|
|
|
|
labels:
|
|
|
|
app: kuard
|
|
|
|
spec:
|
|
|
|
rules:
|
|
|
|
- host: kuard
|
|
|
|
http:
|
|
|
|
paths:
|
|
|
|
- backend:
|
|
|
|
service:
|
|
|
|
name: kuard
|
|
|
|
port:
|
|
|
|
number: 8080
|
|
|
|
path: /
|
|
|
|
pathType: ImplementationSpecific
|
|
|
|
tls:
|
|
|
|
- hosts:
|
|
|
|
- kuard
|
|
|
|
`)
|
|
|
|
|
|
|
|
var ingressNetworkingV1beta1 = []byte(`
|
|
|
|
apiVersion: networking.k8s.io/v1beta1
|
|
|
|
kind: Ingress
|
|
|
|
metadata:
|
|
|
|
labels:
|
|
|
|
app: kuard
|
|
|
|
name: kuard-v1beta1
|
|
|
|
namespace: test-ingress
|
|
|
|
spec:
|
|
|
|
rules:
|
|
|
|
- host: kuard
|
|
|
|
http:
|
|
|
|
paths:
|
|
|
|
- backend:
|
|
|
|
serviceName: kuard
|
|
|
|
servicePort: 8080
|
|
|
|
path: /
|
|
|
|
pathType: ImplementationSpecific
|
|
|
|
tls:
|
|
|
|
- hosts:
|
|
|
|
- kuard
|
|
|
|
`)
|
|
|
|
|
|
|
|
var ingressExtensionV1beta1 = []byte(`
|
|
|
|
apiVersion: extensions/v1beta1
|
|
|
|
kind: Ingress
|
|
|
|
metadata:
|
|
|
|
labels:
|
|
|
|
app: kuard
|
|
|
|
name: kuard-extensions
|
|
|
|
namespace: test-ingress
|
|
|
|
spec:
|
|
|
|
rules:
|
|
|
|
- host: kuard
|
|
|
|
http:
|
|
|
|
paths:
|
|
|
|
- backend:
|
|
|
|
serviceName: kuard
|
|
|
|
servicePort: 8080
|
|
|
|
path: /
|
|
|
|
pathType: ImplementationSpecific
|
|
|
|
tls:
|
|
|
|
- hosts:
|
|
|
|
- kuard
|
|
|
|
`)
|
2021-09-09 18:55:20 +03:00
|
|
|
|
|
|
|
var setRunAsNonRootTrue = []byte(`
|
|
|
|
apiVersion: kyverno.io/v1
|
|
|
|
kind: ClusterPolicy
|
|
|
|
metadata:
|
|
|
|
name: set-runasnonroot-true
|
|
|
|
spec:
|
|
|
|
rules:
|
|
|
|
- name: set-runasnonroot-true
|
|
|
|
match:
|
|
|
|
resources:
|
|
|
|
kinds:
|
|
|
|
- Pod
|
|
|
|
mutate:
|
|
|
|
patchStrategicMerge:
|
|
|
|
spec:
|
|
|
|
securityContext:
|
|
|
|
runAsNonRoot: true
|
|
|
|
initContainers:
|
|
|
|
- (name): "*"
|
|
|
|
securityContext:
|
|
|
|
runAsNonRoot: true
|
|
|
|
containers:
|
|
|
|
- (name): "*"
|
|
|
|
securityContext:
|
|
|
|
runAsNonRoot: true
|
|
|
|
`)
|
|
|
|
|
|
|
|
var podWithContainers = []byte(`
|
|
|
|
apiVersion: v1
|
|
|
|
kind: Pod
|
|
|
|
metadata:
|
|
|
|
name: foo
|
|
|
|
namespace: test-mutate
|
|
|
|
labels:
|
|
|
|
app: foo
|
|
|
|
spec:
|
|
|
|
containers:
|
|
|
|
- image: abc:1.28
|
|
|
|
name: busybox
|
|
|
|
`)
|
|
|
|
|
|
|
|
var podWithContainersPattern = []byte(`
|
|
|
|
apiVersion: v1
|
|
|
|
kind: Pod
|
|
|
|
metadata:
|
|
|
|
name: foo
|
|
|
|
namespace: test-mutate
|
|
|
|
labels:
|
|
|
|
app: foo
|
|
|
|
spec:
|
|
|
|
securityContext:
|
|
|
|
runAsNonRoot: true
|
|
|
|
containers:
|
|
|
|
- (name): "*"
|
|
|
|
securityContext:
|
|
|
|
runAsNonRoot: true
|
|
|
|
`)
|
|
|
|
|
|
|
|
var podWithContainersAndInitContainers = []byte(`
|
|
|
|
apiVersion: v1
|
|
|
|
kind: Pod
|
|
|
|
metadata:
|
|
|
|
name: foo
|
|
|
|
namespace: test-mutate1
|
|
|
|
labels:
|
|
|
|
app: foo
|
|
|
|
spec:
|
|
|
|
containers:
|
|
|
|
- image: abc:1.28
|
|
|
|
name: busybox
|
|
|
|
initContainers:
|
|
|
|
- image: bcd:1.29
|
|
|
|
name: nginx
|
|
|
|
`)
|
|
|
|
|
|
|
|
var podWithContainersAndInitContainersPattern = []byte(`
|
|
|
|
apiVersion: v1
|
|
|
|
kind: Pod
|
|
|
|
metadata:
|
|
|
|
name: foo
|
|
|
|
namespace: test-mutate1
|
|
|
|
labels:
|
|
|
|
app: foo
|
|
|
|
spec:
|
|
|
|
securityContext:
|
|
|
|
runAsNonRoot: true
|
|
|
|
containers:
|
|
|
|
- (name): "*"
|
|
|
|
securityContext:
|
|
|
|
runAsNonRoot: true
|
|
|
|
initContainers:
|
|
|
|
- (name): "*"
|
|
|
|
securityContext:
|
|
|
|
runAsNonRoot: true
|
|
|
|
`)
|
2021-09-11 00:08:47 +03:00
|
|
|
|
|
|
|
var kyverno_2316_policy = []byte(`
|
|
|
|
apiVersion: kyverno.io/v1
|
|
|
|
kind: ClusterPolicy
|
|
|
|
metadata:
|
|
|
|
name: structured-logs-sidecar
|
|
|
|
spec:
|
|
|
|
background: false
|
|
|
|
rules:
|
|
|
|
- name: add-annotations
|
|
|
|
match:
|
|
|
|
resources:
|
|
|
|
kinds:
|
|
|
|
- Deployment
|
|
|
|
annotations:
|
|
|
|
structured-logs: "true"
|
|
|
|
mutate:
|
|
|
|
patchStrategicMerge:
|
|
|
|
metadata:
|
|
|
|
annotations:
|
|
|
|
"fluentbit.io/exclude-{{request.object.spec.template.spec.containers[0].name}}": "true"
|
|
|
|
`)
|
|
|
|
|
|
|
|
var kyverno_2316_resource = []byte(`
|
|
|
|
apiVersion: apps/v1
|
|
|
|
kind: Deployment
|
|
|
|
metadata:
|
|
|
|
name: busybox
|
|
|
|
namespace: test-mutate2
|
|
|
|
annotations:
|
|
|
|
structured-logs: "true"
|
|
|
|
labels:
|
|
|
|
# app: busybox
|
|
|
|
color: red
|
|
|
|
animal: bear
|
|
|
|
food: pizza
|
|
|
|
car: jeep
|
|
|
|
env: qa
|
|
|
|
# foo: blaaah
|
|
|
|
spec:
|
|
|
|
replicas: 1
|
|
|
|
selector:
|
|
|
|
matchLabels:
|
|
|
|
appa: busybox
|
|
|
|
template:
|
|
|
|
metadata:
|
|
|
|
labels:
|
|
|
|
appa: busybox
|
|
|
|
# foo: blaaah
|
|
|
|
spec:
|
|
|
|
containers:
|
|
|
|
- image: busybox:1.28
|
|
|
|
name: busybox
|
|
|
|
command: ["sleep", "9999"]
|
|
|
|
resources:
|
|
|
|
requests:
|
|
|
|
cpu: 100m
|
|
|
|
memory: 10Mi
|
|
|
|
limits:
|
|
|
|
cpu: 100m
|
|
|
|
memory: 10Mi
|
|
|
|
- image: busybox:1.28
|
|
|
|
name: busybox1
|
|
|
|
command: ["sleep", "9999"]
|
|
|
|
resources:
|
|
|
|
requests:
|
|
|
|
cpu: 100m
|
|
|
|
memory: 10Mi
|
|
|
|
limits:
|
|
|
|
cpu: 100m
|
|
|
|
memory: 20Mi
|
|
|
|
`)
|
|
|
|
|
|
|
|
var kyverno_2316_pattern = []byte(`
|
|
|
|
metadata:
|
|
|
|
annotations:
|
|
|
|
fluentbit.io/exclude-busybox: "true"
|
|
|
|
`)
|