From 2c6474f3cbb246487bb134a562aedcfcb2fca545 Mon Sep 17 00:00:00 2001 From: Dan Bungert Date: Wed, 3 Mar 2021 11:25:23 -0700 Subject: [PATCH] Lock in current schema Accidental schema updates are unintended, so enforce that. Schema updates that don't break API are fine, we can handle that by manually regenerating the schema at such time. --- autoinstall-schema.json | 343 ++++++++++++++++++++++++++++++++++++++++ scripts/runtests.sh | 6 + 2 files changed, 349 insertions(+) create mode 100644 autoinstall-schema.json diff --git a/autoinstall-schema.json b/autoinstall-schema.json new file mode 100644 index 00000000..05e2fd7b --- /dev/null +++ b/autoinstall-schema.json @@ -0,0 +1,343 @@ +{ + "type": "object", + "properties": { + "version": { + "type": "integer", + "minimum": 1, + "maximum": 1 + }, + "early-commands": { + "type": "array", + "items": { + "type": [ + "string", + "array" + ], + "items": { + "type": "string" + } + } + }, + "reporting": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "type": { + "type": "string" + } + }, + "required": [ + "type" + ], + "additionalProperties": true + } + }, + "error-commands": { + "type": "array", + "items": { + "type": [ + "string", + "array" + ], + "items": { + "type": "string" + } + } + }, + "user-data": { + "type": "object" + }, + "packages": { + "type": "array", + "items": { + "type": "string" + } + }, + "debconf-selections": { + "type": "string" + }, + "locale": { + "type": "string" + }, + "refresh-installer": { + "type": "object", + "properties": { + "update": { + "type": "boolean" + }, + "channel": { + "type": "string" + } + }, + "additionalProperties": false + }, + "keyboard": { + "type": "object", + "properties": { + "layout": { + "type": "string" + }, + "variant": { + "type": "string" + }, + "toggle": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "layout" + ], + "additionalProperties": false + }, + "network": { + "oneOf": [ + { + "type": "object", + "properties": { + "version": { + "type": "integer", + "minimum": 2, + "maximum": 2 + }, + "ethernets": { + "type": "object", + "properties": { + "match": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "macaddress": { + "type": "string" + }, + "driver": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "wifis": { + "type": "object", + "properties": { + "match": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "macaddress": { + "type": "string" + }, + "driver": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "bridges": { + "type": "object" + }, + "bonds": { + "type": "object" + }, + "tunnels": { + "type": "object" + }, + "vlans": { + "type": "object" + } + }, + "required": [ + "version" + ] + }, + { + "type": "object", + "properties": { + "network": { + "type": "object", + "properties": { + "version": { + "type": "integer", + "minimum": 2, + "maximum": 2 + }, + "ethernets": { + "type": "object", + "properties": { + "match": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "macaddress": { + "type": "string" + }, + "driver": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "wifis": { + "type": "object", + "properties": { + "match": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "macaddress": { + "type": "string" + }, + "driver": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "bridges": { + "type": "object" + }, + "bonds": { + "type": "object" + }, + "tunnels": { + "type": "object" + }, + "vlans": { + "type": "object" + } + }, + "required": [ + "version" + ] + } + }, + "required": [ + "network" + ] + } + ] + }, + "proxy": { + "type": [ + "string", + "null" + ], + "format": "uri" + }, + "apt": { + "type": "object", + "properties": { + "preserve_sources_list": { + "type": "boolean" + }, + "primary": { + "type": "array" + }, + "geoip": { + "type": "boolean" + }, + "sources": { + "type": "object" + } + } + }, + "storage": { + "type": "object" + }, + "identity": { + "type": "object", + "properties": { + "realname": { + "type": "string" + }, + "username": { + "type": "string" + }, + "hostname": { + "type": "string" + }, + "password": { + "type": "string" + } + }, + "required": [ + "username", + "hostname", + "password" + ], + "additionalProperties": false + }, + "ssh": { + "type": "object", + "properties": { + "install-server": { + "type": "boolean" + }, + "authorized-keys": { + "type": "array", + "items": { + "type": "string" + } + }, + "allow-pw": { + "type": "boolean" + } + } + }, + "snaps": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "channel": { + "type": "string" + }, + "classic": { + "type": "boolean" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + } + }, + "late-commands": { + "type": "array", + "items": { + "type": [ + "string", + "array" + ], + "items": { + "type": "string" + } + } + } + }, + "required": [ + "version" + ], + "additionalProperties": true +} diff --git a/scripts/runtests.sh b/scripts/runtests.sh index 1de19b98..e3fd93ab 100755 --- a/scripts/runtests.sh +++ b/scripts/runtests.sh @@ -2,6 +2,8 @@ set -eux python3 -m unittest discover +testschema=.subiquity/test-autoinstall-schema.json + validate () { python3 scripts/validate-yaml.py .subiquity/subiquity-curtin-install.conf if [ ! -e .subiquity/subiquity-client-debug.log ] || [ ! -e .subiquity/subiquity-server-debug.log ]; then @@ -18,6 +20,7 @@ validate () { clean () { rm -f .subiquity/subiquity-curtin-install.conf rm -f .subiquity/subiquity-*.log + rm -f "$testschema" rm -rf .subiquity/run/ } @@ -54,3 +57,6 @@ clean timeout --foreground 60 sh -c "LANG=C.UTF-8 python3 -m subiquity.cmd.tui --autoinstall examples/autoinstall-user-data.yaml \ --dry-run --machine-config examples/simple.json --kernel-cmdline 'autoinstall'" validate + +python3 -m subiquity.cmd.schema > "$testschema" +diff -u "autoinstall-schema.json" "$testschema"