Jsonnet requires validation functions to be written - with CUE it's built it and the result is much less verbose.
Jsonnet validation example (can be inlined with the schema, but gets verbose. Best split into a different file).
local std = std;
{| #@ load("@ytt:data", "data") | |
| #@ load("@ytt:struct", "struct") | |
| #@ load("@ytt:assert", "assert") | |
| #@ app = data.values.app | |
| ## Note how all the logic is written in yaml comments - hence why it's been excluded from the shortlist. | |
| --- | |
| apiVersion: apps/v1 |
| #@data/values-schema | |
| app: | |
| name: "" | |
| image: "nginx:1.27" | |
| replicas: 1 | |
| ingressClass: "nginx" | |
| serviceType: "ClusterIP" | |
| gatewayName: "default-gateway" | |
| endpoints: | |
| - name: "" |
| apiVersion: platform.example.org/v1alpha1 | |
| kind: WebApp | |
| metadata: | |
| name: react-app | |
| spec: | |
| image: ghcr.io/acme/react-app:main | |
| replicas: 2 | |
| endpoints: | |
| - name: react-ui | |
| host: app.foo.com |
| apiVersion: apiextensions.crossplane.io/v1 | |
| kind: Composition | |
| metadata: | |
| name: webapp | |
| spec: | |
| compositeTypeRef: | |
| apiVersion: platform.example.org/v1alpha1 | |
| kind: WebApp | |
| resources: | |
| - name: deployment |
| apiVersion: apiextensions.crossplane.io/v1 | |
| kind: CompositeResourceDefinition | |
| metadata: | |
| name: webapps.platform.example.org | |
| spec: | |
| group: platform.example.org | |
| names: | |
| kind: WebApp | |
| plural: webapps | |
| claimNames: |
| apiVersion: kro.run/v1alpha1 | |
| kind: ResourceGraphDefinition | |
| metadata: | |
| name: webapps.kro.run | |
| spec: | |
| schema: | |
| apiVersion: v1alpha1 | |
| kind: WebApp | |
| spec: | |
| name: string |
| local web = import 'webApp.libsonnet'; | |
| web.webApp({ | |
| name: 'react', | |
| image: 'ghcr.io/acme/react-app:main', | |
| replicas: 2, | |
| gatewayName: 'default-gateway', | |
| ingressClass: 'nginx', | |
| serviceType: 'ClusterIP', | |
| endpoints: [ |
| local std = std; | |
| { | |
| webApp(v): | |
| local name = v.name; | |
| local image = v.image; | |
| local replicas = std.get(v, 'replicas', 1); | |
| local ingressClass = std.get(v, 'ingressClass', 'nginx'); | |
| local serviceType = std.get(v, 'serviceType', 'ClusterIP'); | |
| local gatewayName = std.get(v, 'gatewayName', 'default-gateway'); |
| package webapp | |
| # This can be a 'normal' YAML as well. CUE can import raw YAMLs directly. | |
| app: { | |
| name: "react" | |
| image: "ghcr.io/acme/react-app:main" | |
| replicas: 2 | |
| ingressClass: "nginx" |