transition_rules/
transition_rules.rs1use kube_cel::Validator;
15use serde_json::json;
16
17fn main() {
18 let schema = json!({
19 "type": "object",
20 "properties": {
21 "storageClass": {"type": "string"},
22 "replicas": {"type": "integer"}
23 },
24 "x-kubernetes-validations": [
25 {
27 "rule": "self.storageClass == oldSelf.storageClass",
28 "message": "storageClass is immutable"
29 },
30 {
32 "rule": "self.replicas >= oldSelf.replicas",
33 "message": "replicas cannot be decreased"
34 }
35 ]
36 });
37
38 let validator = Validator::new();
39 let stored = json!({"storageClass": "fast-ssd", "replicas": 3});
40
41 let created = json!({"storageClass": "fast-ssd", "replicas": 3});
43 report("CREATE (old = None)", validator.validate(&schema, &created, None));
44
45 let scale_up = json!({"storageClass": "fast-ssd", "replicas": 5});
47 report(
48 "UPDATE scale up 3->5",
49 validator.validate(&schema, &scale_up, Some(&stored)),
50 );
51
52 let scale_down = json!({"storageClass": "fast-ssd", "replicas": 1});
54 report(
55 "UPDATE scale down 3->1",
56 validator.validate(&schema, &scale_down, Some(&stored)),
57 );
58
59 let restorage = json!({"storageClass": "cheap-hdd", "replicas": 3});
61 report(
62 "UPDATE change storageClass",
63 validator.validate(&schema, &restorage, Some(&stored)),
64 );
65}
66
67fn report(label: &str, errors: Vec<kube_cel::ValidationError>) {
68 if errors.is_empty() {
69 println!("{label}: OK");
70 } else {
71 println!("{label}: {} error(s)", errors.len());
72 for err in &errors {
73 println!(" - {}", err.message);
74 }
75 }
76}