To run it locally execute cargo run --release
.
To build and run it as a docker container execute:
docker build -t <IMAGE_NAME>:<TAG> .
docker run -p 3000:3000 <IMAGE_NAME>:<TAG>
Docker images are published as part of the CI/CD workflow. To pull and image run:
docker pull ghcr.io/aciba90/cloud-config-validator:main
To execute the unit test run cargo test
and to run the integration tests run tox
.
POST
/v1/{cloud-config,network-config}/validate
Validates a cloud-config or a network-config, responding with JSONPointers pointing to errors and deprecations
name type data type description None required JSON See Request body format
http code content-type response 200
application/json
See Response body format
{
"payload": "<cloud-config or networ-config>"
}
{
"annotations": [
{
"description": "<description>",
"instance_path": "<JSONPointer>"
}
],
"errors": [
{
"description": "<description>",
"instance_path": "<JSONPointer>"
}
],
"is_valid":true
}
docker run -p 3000:3000 ghcr.io/aciba90/cloud-config-validator:main
$ curl http://0.0.0.0:3000/v1/cloud-config/validate -H "Content-Type: application/json" -d '{"payload": "#cloud-config\nubuntu_advantage:\n features:\n disable_auto_attach: 1"}'
{"annotations":[],"errors":[{"description":"1 is not of type \"boolean\"","instance_path":"/ubuntu_advantage/features/disable_auto_attach"}],"is_valid":false}
$ curl http://0.0.0.0:3000/v1/cloud-config/validate -H "Content-Type: application/json" -d '{"payload": "#cloud-config\nusers:\n - name: a\n uid: \"1743\"" }'
{"annotations":[{"description":"Changed in version 22.3. The use of ``string`` type is deprecated. Use an ``integer`` instead.","instance_path":"/users/0/uid"}],"errors":[],"is_valid":true}
Axum server handling requests asynchronously with green threads over a multi-threaded runtime.
The validation endpoints execute the validation step (which is a blocking CPU-bound computation) within a separated rayon thread pool optimized for CPU-bound computations.
The jsonschema is parsed at start time and refreshed periodically. And it is shared across threads.