use kube_cel::{ValidationErrors, Validator};
use serde_json::json;
fn main() {
let schema = json!({
"type": "object",
"properties": {
"storageClass": {"type": "string"},
"replicas": {"type": "integer"}
},
"x-kubernetes-validations": [
{
"rule": "self.storageClass == oldSelf.storageClass",
"message": "storageClass is immutable"
},
{
"rule": "self.replicas >= oldSelf.replicas",
"message": "replicas cannot be decreased"
}
]
});
let validator = Validator::new();
let stored = json!({"storageClass": "fast-ssd", "replicas": 3});
let created = json!({"storageClass": "fast-ssd", "replicas": 3});
report("CREATE (old = None)", validator.validate(&schema, &created, None));
let scale_up = json!({"storageClass": "fast-ssd", "replicas": 5});
report(
"UPDATE scale up 3->5",
validator.validate(&schema, &scale_up, Some(&stored)),
);
let scale_down = json!({"storageClass": "fast-ssd", "replicas": 1});
report(
"UPDATE scale down 3->1",
validator.validate(&schema, &scale_down, Some(&stored)),
);
let restorage = json!({"storageClass": "cheap-hdd", "replicas": 3});
report(
"UPDATE change storageClass",
validator.validate(&schema, &restorage, Some(&stored)),
);
}
fn report(label: &str, result: Result<(), ValidationErrors>) {
match result {
Ok(()) => println!("{label}: OK"),
Err(errors) => {
println!("{label}: {} error(s)", errors.len());
for err in &errors {
println!(" - {}", err.message);
}
}
}
}