All Policies
Generate Kasten Policy from Preset
Generates a Kasten policy for a new namespace that includes a valid "dataprotection" label, if the policy does not already exist. Use with "kasten-validate-ns-by-preset-label" policy to require "dataprotection" labeling on new namespaces.
Policy Definition
/kasten/kasten-generate-policy-by-preset-label/kasten-generate-policy-by-preset-label.yaml
1# This example assumes that Kasten policy presets named
2# "gold", "silver", and "bronze" have been pre-created
3# and Kasten was deployed into the `kasten-io` namespace.
4#
5# Additionally, the Kyverno background controller requires
6# additional permissions to create Kasten Policy resources.
7# Apply the create-kasten-policies-clusterrole.yaml manifest
8# first to grant the required permissions.
9apiVersion: kyverno.io/v1
10kind: ClusterPolicy
11metadata:
12 name: kasten-generate-policy-by-preset-label
13 annotations:
14 policies.kyverno.io/title: Generate Kasten Policy from Preset
15 policies.kyverno.io/category: Veeam Kasten
16 policies.kyverno.io/subject: Policy
17 kyverno.io/kyverno-version: 1.12.1
18 policies.kyverno.io/minversion: 1.12.0
19 kyverno.io/kubernetes-version: "1.24-1.30"
20 policies.kyverno.io/description: >-
21 Generates a Kasten policy for a new namespace that includes a valid "dataprotection" label, if the policy does not already exist.
22
23 Use with "kasten-validate-ns-by-preset-label" policy to require "dataprotection" labeling on new namespaces.
24spec:
25 rules:
26 - name: kasten-generate-policy-by-preset-label
27 match:
28 any:
29 - resources:
30 kinds:
31 - Namespace
32 selector:
33 matchExpressions:
34 - key: dataprotection
35 operator: In
36 values:
37 - gold
38 - silver
39 - bronze
40 context:
41 - name: existingPolicy
42 apiCall:
43 urlPath: "/apis/config.kio.kasten.io/v1alpha1/namespaces/kasten-io/policies" # returns list of Kasten policies from kasten-io namespace
44 jmesPath: "items[][[@.spec.presetRef][?name=='{{ request.object.metadata.labels.dataprotection }}'] && [@.spec.selector.matchExpressions[].values[?@=='{{ request.namespace }}']]][][][][] | length(@)" # queries if a policy based on the dataprotection label value, covering that app namespace already exists
45 preconditions:
46 any:
47 - key: "{{ existingPolicy }}"
48 operator: Equals
49 value: 0 # Only generate the policy if it does not already exist
50 generate:
51 apiVersion: config.kio.kasten.io/v1alpha1
52 kind: Policy
53 name: "{{ request.namespace }}-{{ request.object.metadata.labels.dataprotection }}-backup"
54 namespace: kasten-io
55 data:
56 spec:
57 comment: "Auto-generated by Kyverno"
58 paused: false
59 actions:
60 - action: backup
61 presetRef:
62 name: "{{ request.object.metadata.labels.dataprotection }}"
63 namespace: kasten-io
64 selector:
65 matchExpressions:
66 - key: k10.kasten.io/appNamespace
67 operator: In
68 values:
69 - "{{ request.namespace }}"