Skip to content

osbuild: compare Go against JSON#2529

Open
supakeen wants to merge 1 commit into
osbuild:mainfrom
supakeen:read-osbuild-stage-schemas
Open

osbuild: compare Go against JSON#2529
supakeen wants to merge 1 commit into
osbuild:mainfrom
supakeen:read-osbuild-stage-schemas

Conversation

@supakeen

@supakeen supakeen commented Jul 19, 2026

Copy link
Copy Markdown
Member

New test that parses the Go implementation of the osbuild stages using the ast module (this was quite a bit of work, but surprisingly straightforward even if verbose).

Ensures types in the JSON files match types in the Go files, including any type aliases.

Outputs informational bits about missing properties on the Go side or osbuild side. Outputs information about stages that in osbuild that do not have any Go counterpart.

Does not properly validate anyOf/enum/etc. But this basic validation is already helpful and followups are very possible.

By default looks in /usr/lib/osbuild; if no stages can be found the test is skipped. Custom directory can be passed through TEST_OSBUILD_STAGES_DIR.


Example (verbose) output:

€ TEST_OSBUILD_STAGES_DIR=/home/user/src/github.com/osbuild/osbuild/stages go test ./pkg/osbuild -v -run TestStageOptionsMatchOsbuildSchemas
=== RUN   TestStageOptionsMatchOsbuildSchemas
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.zstd
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.tuned
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.lvm2.metadata
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.groups
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.selinux
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.selinux.config
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.ovf
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.encapsulate
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.modprobe
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.tar
    schema_validation_test.go:60: schema properties not in Go struct: [sparse]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.fix-bls
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.bootctl.install.root
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.udev.rules
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.zipl.inst
    schema_validation_test.go:60: schema properties not in Go struct: [kernel_opts_append]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.chrony
    schema_validation_test.go:60: schema properties not in Go struct: [timeservers]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.buildstamp
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.selinux
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.rhsm
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.container-deploy
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.bootiso.mono
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.qemu
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.init
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.rpm
    schema_validation_test.go:60: schema properties not in Go struct: [nodeps]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.authconfig
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.erofs
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.systemd-logind
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.dnf-automatic.config
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.discinfo
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.systemd.unit.create
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.xorrisofs
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.systemd.unit
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.xz
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.sfdisk
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.timezone
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.firewall
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.nm.conf
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.oscap.autotailor
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.deploy.container
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.keymap
    schema_validation_test.go:60: schema properties not in Go struct: [font]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.copy
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.mkfs.xfs
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.cloud-init
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.anaconda
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.dnf4.versionlock
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.mkfs.ext4
    schema_validation_test.go:60: schema properties not in Go struct: [lazy_init metadata_csum_seed orphan_file]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.systemd-journald
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.fstab
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.containers.storage.conf
    schema_validation_test.go:60: schema properties not in Go struct: [filebase]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.config
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.chmod
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.wsl.conf
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.insights-client.config
    schema_validation_test.go:60: schema properties not in Go struct: [path]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.mkfs.fat
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.luks2.remove-key
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.sgdisk
    schema_validation_test.go:60: schema properties not in Go struct: [label quote_partition_name]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.mkdir
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.oci-archive
    schema_validation_test.go:60: schema properties not in Go struct: [annotations]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.dnf.module-config
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.rhsm.facts
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.truncate
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.sysconfig
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.write-device
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.deploy
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.users
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.shell.init
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.grub2.iso
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.kernel-cmdline
    schema_validation_test.go:60: schema properties not in Go struct: [kernel_cmdline_size]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.ignition
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.systemd.preset
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.first-boot
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.waagent.conf
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.kickstart
    schema_validation_test.go:60: schema properties not in Go struct: [bootc]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.pull
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.oscap.remediation
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.locale
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.zipl
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.mkfs.btrfs
    schema_validation_test.go:60: schema properties not in Go struct: [metadata]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.chown
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.clevis.luks-bind
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.grub2
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.commit
    schema_validation_test.go:60: schema properties not in Go struct: [selinux-label-version]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.dracut.conf
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.yum.config
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.bootc.install-to-filesystem
    schema_validation_test.go:60: schema properties not in Go struct: [boot-mount-spec bootupd-skip-boot-uuid root-mount-spec stateroot]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.mks390image
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.btrfs.subvol
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.gcp.guest-agent.conf
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.remotes
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.preptree
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.grub2.iso.legacy
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.vagrant
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.hmac
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.sysctld
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.bootupd
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.createaddrsize
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.nginx.conf
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.flatpak.build-import-bundle.oci
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.pwquality.conf
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.bootc.install.config
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.machine-id
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.yum.repos
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.authselect
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.isolinux
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.systemd
    schema_validation_test.go:60: schema properties not in Go struct: [masked_generators]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.implantisomd5
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.tmpfilesd
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.os-init
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.fillvar
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.squashfs
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.pam.limits.conf
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.update-crypto-policies
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.gzip
    schema_validation_test.go:60: schema properties not in Go struct: [level]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.dracut
    schema_validation_test.go:60: schema properties not in Go struct: [initoverlayfs omit_drivers remove]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.dnf.config
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.skopeo
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.lorax-script
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.lvm2.create
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.grub2
    schema_validation_test.go:60: schema properties not in Go struct: [bootfs rootfs write_defaults]
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.mkswap
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.sshd.config
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.grub2.legacy
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.grub2.inst
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.hostname
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.wsl-distribution.conf
=== RUN   TestStageOptionsMatchOsbuildSchemas/org.osbuild.luks2.format
    schema_validation_test.go:60: schema properties not in Go struct: [integrity]
=== NAME  TestStageOptionsMatchOsbuildSchemas
    schema_validation_test.go:78: compared 125 stages (125 Go stages total, 175 osbuild schemas total, 0 Go-only, 50 schema-only)
    schema_validation_test.go:84: stages in osbuild schemas but not in Go: [org.osbuild.bfb org.osbuild.bootupd.gen-metadata org.osbuild.chattr org.osbuild.containers.unit.create org.osbuild.coreos.live-artifacts.mono org.osbuild.coreos.platform org.osbuild.cpio.out org.osbuild.cron.script org.osbuild.crypttab org.osbuild.debug-shell org.osbuild.dmverity org.osbuild.dnf4.mark org.osbuild.error org.osbuild.experimental.ostree.config org.osbuild.fdo org.osbuild.greenboot org.osbuild.grub2.d org.osbuild.gunzip org.osbuild.idmap org.osbuild.kernel-cmdline.bls-append org.osbuild.livesys org.osbuild.ln org.osbuild.mkinitcpio org.osbuild.nm.conn org.osbuild.noop org.osbuild.ostree org.osbuild.ostree.aleph org.osbuild.ostree.genkey org.osbuild.ostree.init-fs org.osbuild.ostree.passwd org.osbuild.ostree.post-copy org.osbuild.ostree.sign org.osbuild.pacman org.osbuild.pacman-keyring org.osbuild.pacman.conf org.osbuild.pacman.mirrorlist.conf org.osbuild.parted org.osbuild.pki.update-ca-trust org.osbuild.resolv-conf org.osbuild.rpm-ostree org.osbuild.rpm.macros org.osbuild.rpmkeys.import org.osbuild.systemd-repart.create org.osbuild.systemd-sysusers org.osbuild.systemd-sysusers.d org.osbuild.test org.osbuild.treeinfo org.osbuild.uki org.osbuild.untar org.osbuild.zip]
--- PASS: TestStageOptionsMatchOsbuildSchemas (0.03s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.zstd (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.tuned (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.lvm2.metadata (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.groups (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.selinux (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.selinux.config (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.ovf (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.encapsulate (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.modprobe (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.tar (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.fix-bls (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.bootctl.install.root (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.udev.rules (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.zipl.inst (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.chrony (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.buildstamp (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.selinux (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.rhsm (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.container-deploy (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.bootiso.mono (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.qemu (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.init (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.rpm (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.authconfig (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.erofs (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.systemd-logind (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.dnf-automatic.config (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.discinfo (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.systemd.unit.create (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.xorrisofs (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.systemd.unit (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.xz (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.sfdisk (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.timezone (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.firewall (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.nm.conf (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.oscap.autotailor (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.deploy.container (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.keymap (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.copy (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.mkfs.xfs (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.cloud-init (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.anaconda (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.dnf4.versionlock (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.mkfs.ext4 (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.systemd-journald (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.fstab (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.containers.storage.conf (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.config (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.chmod (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.wsl.conf (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.insights-client.config (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.mkfs.fat (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.luks2.remove-key (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.sgdisk (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.mkdir (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.oci-archive (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.dnf.module-config (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.rhsm.facts (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.truncate (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.sysconfig (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.write-device (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.deploy (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.users (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.shell.init (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.grub2.iso (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.kernel-cmdline (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.ignition (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.systemd.preset (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.first-boot (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.waagent.conf (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.kickstart (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.pull (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.oscap.remediation (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.locale (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.zipl (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.mkfs.btrfs (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.chown (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.clevis.luks-bind (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.grub2 (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.commit (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.dracut.conf (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.yum.config (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.bootc.install-to-filesystem (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.mks390image (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.btrfs.subvol (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.gcp.guest-agent.conf (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.remotes (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.preptree (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.grub2.iso.legacy (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.vagrant (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.hmac (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.sysctld (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.bootupd (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.createaddrsize (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.nginx.conf (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.flatpak.build-import-bundle.oci (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.pwquality.conf (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.bootc.install.config (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.machine-id (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.yum.repos (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.authselect (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.isolinux (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.systemd (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.implantisomd5 (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.tmpfilesd (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.os-init (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.ostree.fillvar (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.squashfs (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.pam.limits.conf (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.update-crypto-policies (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.gzip (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.dracut (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.dnf.config (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.skopeo (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.lorax-script (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.lvm2.create (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.grub2 (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.mkswap (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.sshd.config (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.grub2.legacy (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.grub2.inst (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.hostname (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.wsl-distribution.conf (0.00s)
    --- PASS: TestStageOptionsMatchOsbuildSchemas/org.osbuild.luks2.format (0.00s)
PASS
ok      github.com/osbuild/image-builder/pkg/osbuild    (cached)

@supakeen
supakeen requested a review from a team as a code owner July 19, 2026 06:25
New test that parses the Go implementation of the `osbuild` stages using
the `ast` module (this was quite a bit of work, but surprisingly
straightforward even if verbose).

Ensures types in the JSON files match types in the Go files, including
any type aliases.

Outputs informational bits about missing properties on the Go side or
osbuild side. Outputs information about stages that in osbuild that do
not have any Go counterpart.

Does *not* properly validate `anyOf`/`enum`/etc. But this basic
validation is already helpful and followups are very possible.

By default looks in `/usr/lib/osbuild`; if no stages can be found the
test is skipped. Custom directory can be passed through
`TEST_OSBUILD_STAGES_DIR`.

Signed-off-by: Simon de Vlieger <cmdr@supakeen.com>
@supakeen
supakeen force-pushed the read-osbuild-stage-schemas branch from f69744f to 5e94b00 Compare July 19, 2026 06:31
@brlane-rht

Copy link
Copy Markdown
Contributor

A commit title like 'osbuild: Verify stage metadata JSON' might be better. Just looking at the title I wasn't sure what was going on until I read the description :)

@brlane-rht brlane-rht left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants