Commit Graph
718 Commits
Author SHA1 Message Date
Lukas Greve 435ce41c02 ci: re-trigger after pytest requirements fix
build-iso / validate (push) Successful in 11s
ci / cook (push) Successful in 13s
build-iso / build-iso (push) Failing after 27s
2026-09-19 14:10:52 +02:00
Lukas Greve 7197ed9be9 cook: add pytest to requirements (CI test step)
build-iso / validate (push) Successful in 10s
ci / cook (push) Successful in 13s
build-iso / build-iso (push) Failing after 28s
2026-09-19 14:10:02 +02:00
Lukas Greve da5bcf6b04 ci: install Python deps before lint
ci / cook (push) Failing after 13s
build-iso / validate (push) Successful in 13s
build-iso / build-iso (push) Failing after 38s
2026-09-19 14:08:07 +02:00
Lukas Greve f246dec765 runner disk extended to 100G; re-trigger CI
ci / cook (push) Failing after 1m41s
build-iso / validate (push) Successful in 1m47s
build-iso / build-iso (push) Failing after 29s
2026-09-19 14:02:04 +02:00
Lukas Greve bddd05f3a8 ci: bump (actions were disabled at last push)
build-iso / validate (push) Failing after 56s
ci / cook (push) Failing after 56s
build-iso / build-iso (push) Skipped
2026-09-19 12:10:52 +02:00
Lukas Greve c491aeb635 ci: add lint/test/validate workflow; fix stale fedora-cloud-42 label -> fedora 2026-09-19 12:08:18 +02:00
Lukas GreveandClaude Sonnet 5 dceb82f8f6 Add build-image.sh: raw/qcow2 disk images without libvirt/virt-install
Runs `livemedia-creator --no-virt --make-disk` directly on the host to
produce a disk image any VM manager can consume (e.g. via virtpull's
`virtpull local ... --wonder-vm NAME`), instead of deploy.sh's live
virt-install/libvirt session.

An earlier version wrapped this in `mock`, mirroring
.gitea/workflows/build-iso.yaml's ISO build. That doesn't work for
--make-disk: mock's chroot has no live systemd-udevd, so udev never
populates properties for the loop device livemedia-creator creates,
and blivet's device scan crashes. --make-iso never hits this since it
never touches block devices. Reproduced identically on Fedora 44 and
43 mock chroots, confirmed fixed by running directly on the host
instead (root required, for /dev/loop-control access).

Also fixes two real kickstart incompatibilities with the --no-virt
disk-image path (applied to a scratch copy, not the shared
ingredients): the `text` display-mode directive (needed for
virt-install's netinstall console) conflicts with livemedia-creator's
own display handling, and `part / --grow` with no explicit --size
crashes livemedia-creator's upfront disk-size calculation (works fine
under virt-install, which pre-creates the disk at a known size
instead) — now configurable via --root-size.

New --extra-ks FILE flag layers one-off local content (e.g. a bespoke
user/rootpw override) onto the scratch copy without touching tracked
ingredients, following the README's existing "bespoke dish not part
of the matrix" pattern.

Factored deploy/deploy-distro.sh's dish-picker into deploy/select-dish.sh,
shared by both scripts.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-18 20:04:49 +02:00
Lukas Greve a8228df780 feat: add TPM2 auto-unlock support to encrypted storage ingredient
Add cryptsetup, tpm2-tools and tpm2-tss to every encrypted dish so the
initrd can be rebuilt with TPM2 support. A guarded %pre stashes a
preseeded LUKS passphrase from the kickstart, and a guarded %post
enrolls PCR 7-bound auto-unlock via systemd-cryptenroll, switches
crypttab to tpm2-device=auto and regenerates the initrd. Without a
preseeded passphrase or a TPM device the enrollment is skipped and the
system keeps the regular passphrase prompt.
2026-09-15 11:04:19 +02:00
Lukas Greve 0a553429ba fix: make amdcpu IOMMU %post layout-aware and idempotent
Same fix as cd4302c for intelcpu: the bare sed against /etc/default/grub
missed systemd-boot and already-generated GRUB+BLS boot entries. Update
every kernel-argument surface idempotently, guarded by file existence:
/etc/kernel/cmdline, /etc/default/grub, and the options line of every
/boot/loader/entries/*.conf. Guard the nested=1 append as well.
2026-09-12 20:11:02 +02:00
Lukas Greve cd4302cb09 fix: make intelcpu IOMMU %post layout-aware and idempotent
Anaconda always creates /etc/kernel/cmdline, even on GRUB+BLS installs, so
the previous if/else misdetected systemd-boot on GRUB systems: the IOMMU
arguments landed in /etc/kernel/cmdline after GRUB+BLS boot entries had
already been generated from it, and never reached the running kernel
(observed on thinkpad and nuc6i7kyb).

Instead of branching on one file, update every kernel-argument surface
idempotently, guarded by existence: /etc/kernel/cmdline (kernel-install
source for systemd-boot and GRUB+BLS future kernels), /etc/default/grub
(grub.cfg flows), and the options line of every already-generated
/boot/loader/entries/*.conf (same shape under both systemd-boot and
GRUB+BLS). Guard the nested=1 append as well.
2026-09-12 20:09:16 +02:00
Lukas Greve fff901ef1a feat: add GNOME desktop-hypervisor dish for BIOS laptops
- storage/biosboot.ks: GPT disk label with a 2 MiB BIOS boot partition,
  no ESP (pure legacy layout); registered as the 'biosboot' storage choice
- recipe_templates.yaml: make the desktop hypervisor a superset of the
  base hypervisor so GNOME hypervisor dishes get libvirtd + virt-manager
- recipes_manifest.yaml: enable the desktop-hypervisor group targeting
  Fedora 44 (gnome, biosboot, grub, security enabled, gnome initial-setup,
  hardware-support, intelcpu)
- initial-setup/gnome/config.ks: apply the vendor.conf fix (truncate and
  append skip=privacy / providers=local-first!) as an enabled %post
- tests: update BASE_FRAGMENTS fixture to core-explicit.ks (follow-up to
  ccf4f9d)
2026-09-12 10:31:39 +02:00
Lukas Greve e74a88d133 fix: explicitly include dbus-daemon and systemd-pam session-system essentials
With --exclude-weakdeps, two packages that nothing else hard-requires were
being silently dropped from the installed system:

- dbus-daemon (provides /usr/bin/dbus-run-session): gdm-wayland-session
  needs it to spawn the per-session D-Bus bus. Only anaconda-core requires
  it, and that is not installed into the target system.
- systemd-pam (provides pam_systemd.so): 'systemd' merely recommends it.
  Without pam_systemd, PAM 'optional' session rules fail silently, login
  sessions never register with logind, user@.service never starts, and the
  session bus lacks org.freedesktop.systemd1.

Result of either gap: gdm logs 'Session never registered, failing' five
times, then 'maximum number of display failures reached. Giving up.' and
the screen stays black — on VMs and bare metal alike (laptop bug).
Both packages validated live on a Fedora 44 guest; dnf5 check passes.
2026-09-11 22:14:06 +02:00
Lukas Greve ccf4f9d881 feat: break down core into explicit packages for Fedora remix compatibility
generic-release conflicts with fedora-release and generic-logos conflicts
with fedora-logos, so dishes shipping the remix packages cannot coexist
with @core pulling Fedora branding — the RPM transaction fails at prepare
time. Replace @core with the explicit core package list (mandatory +
default, plus basesystem/kernel/dhcp-client), add fedora-repos explicitly,
and deselect fedora-release/fedora-logos; the remix packages provide
system-release, system-release(44) and system-logos instead.

Verified on nuc6i7kyb: a Fedora 44 GNOME hypervisor desktop VM installed
cleanly from this configuration (982-package resolution scratch-tested
before the install).
2026-09-11 20:39:54 +02:00
Lukas Greve 698c7679be feat: enable Fedora 44 hypervisor recipe with systemd-boot
- uncomment the hypervisor recipe, targeting Fedora 44 with
  systemd-boot, hardware-support and the intelcpu variant
- make intelcpu.ks bootloader-aware: with systemd-boot kernel
  arguments must go to /etc/kernel/cmdline, not /etc/default/grub
2026-09-10 13:14:03 +02:00
Lukas Greve cdda0a57a3 Revert "fix: include weak dependencies to prevent scriptlet failures"
This reverts commit 6e040e05a7.
2026-09-05 21:45:42 +02:00
Lukas Greve b4010ee2fb fix: use grub2-tools, grub2-common %posttrans also needs grub2-mkconfig 2026-09-05 21:36:01 +02:00
Lukas Greve cd442c555f fix: add grub2-tools-minimal so grub2-common %posttrans does not fail the transaction 2026-09-05 21:27:16 +02:00
Lukas Greve 6e040e05a7 fix: include weak dependencies to prevent scriptlet failures 2026-09-05 21:17:01 +02:00
Lukas Greve 8a6a97559d feat: enable Fedora 44 server variant with systemd-boot
- re-enable the commented-out server recipe group
- repository: Fedora 44 only (was 43/rawhide)
- bootloader: systemd-boot (was grub)
- explicit initial-setup: server choice
- yields dish server_44_standard_systemd-boot_server_guest-agents.cfg
2026-09-05 13:51:16 +02:00
Lukas Greve 8ad3589223 feat: add Fedora 44 support alongside Fedora 43
- add fedora-44-mirrors ingredient and register it in the repository choices
- expand the desktop variant matrix to [43, 44, rawhide] (48 dishes)
- bump CI workflows and deploy fallback URL to Fedora 44
- cover both release repositories in tests
2026-09-04 13:55:24 +02:00
Lukas Greve c7142ac43a ci: build ISO from generated desktop dish via make all
- both ISO workflows run the new single 'make all' pipeline (they
  previously referenced the removed recipe-generator/ directory and
  nonexistent live kickstarts) and build from the generated
  desktop_43_standard_grub_gnome_guest-agents dish
- README: document the data-driven cooking pipeline (manifest +
  templates + make all), generated build products, and updated
  deploy/dish examples
2026-08-30 12:09:52 +02:00
Lukas Greve 73dd52e04e feat(deploy): generate dishes before deploy and fix dish selection
- deploy.sh now runs 'make all' in cook/ before deploying, since dishes
  are build products no longer tracked in git; failures show the make
  output and abort
- deploy-distro.sh selects dishes by the *guest-agents* marker (the new
  naming replaced the virtual* prefix) and uses --os-variant
  fedora-unknown instead of the stale fedora41 pin
2026-08-30 12:09:47 +02:00
Lukas Greve ae6eef4045 refactor(cook): data-driven recipe generation with in-process flatten and lint
Replace the hardcoded TEMPLATES dict and the ksflatten-relative wrapper
with a single data-driven pipeline:

- recipe_templates.yaml becomes the single source of truth with three
  sections: base (always included), choices (exactly-one per category,
  the invariant pykickstart cannot check) and features (additive flags
  or one-of values)
- generate_recipe.py is a pure YAML consumer: it resolves ingredients,
  renders dishes via pykickstart in-process (no ksflatten binary, no
  %include path munging), lints the invariants pykickstart cannot check
  (exactly-one per choice category, known keys, existing fragments,
  unique filenames) and validates every generated dish
- dish names are derived by a generic rule with canonical category order
  from the templates, independent of YAML key order; no committed
  generated files means no name burn-in
- recipes/ and dishes/ become gitignored build products; the 68 tracked
  generated files (already out of sync with the manifest) are removed
- delete dead ingredients (section-data/, validation/, initial-setup/
  desktop/, live/hypervisor.ks, rpmfusion-nonfree.ks), the stale
  all-ingredients.cfg (replaced by 'make inventory') and the
  bin/generate-recipe and bin/ksflatten-relative wrappers
- Makefile: single 'make all' step plus lint, validate, inventory, test
- add 16 pytest tests covering expansion, selection, naming, lint and
  flatten/validate round-trips
2026-08-30 12:09:42 +02:00
Lukas Greve 842f754681 bump kickstart version 2026-03-30 20:31:13 +02:00
Lukas Greve bbdbef980b fix path 2026-03-30 20:30:17 +02:00
Lukas Greve 1ea58e3452 remove handling of security as special case 2026-03-30 20:30:11 +02:00
Lukas Greve 5fcbdc2e9d Restore earlier README.md version and remove DEV guides for now 2026-03-30 20:02:58 +02:00
Lukas Greve 2fd464dd5c Fix path to match repo reorg 2026-03-30 17:28:45 +02:00
Lukas Greve 626f0f9110 updated recipes and dishes 2026-03-30 17:19:27 +02:00
Lukas Greve ca316af700 Fix repository in name generation and templates so that rawhide variants are correctly generated 2026-03-30 17:16:32 +02:00
Lukas Greve 3efe5c2ee2 Updated generated dishes and recipes 2026-03-28 21:53:30 +01:00
Lukas Greve d2bba00600 simplify f43 key 2026-03-28 21:53:01 +01:00
Lukas Greve 833446a000 remove unused security part 2026-03-28 21:52:13 +01:00
Lukas Greve 55d0a9f649 Extend Makefile to allow for the cleaning of recipes and dishes 2026-03-28 21:51:52 +01:00
Lukas Greve b2c14dbcca Change filename generation variant order 2026-03-28 21:50:34 +01:00
Lukas Greve 464fd8c158 remove old python scripts and add new updated recipes 2026-03-27 19:34:05 +01:00
Lukas Greve e9615b524d Add recipe generator and dish flattener
- create generate_recipe.py for universal template recipe generation
- support cartesian product expansion from recipes_manifest.yaml
- generate 72 unique recipes with proper filename disambiguation
- update Makefile with simplified validation using ksflatten
- keep ksflatten-relative script as-is for dish flattening

The generator reads recipe_templates.yaml and recipes_manifest.yaml to
produce recipe files that ksflatten then flattens into final dishes.
2026-03-27 19:29:27 +01:00
Lukas Greve 6f5d7478be Fix duplicate storage configuration in recipes
- Move storage options from 'modifiers' to 'required' in recipe_templates.yaml
- Changed required.storage from {'ext4': storage/standard.ks} to {'standard': ..., 'encrypted': ...}
- Removed storage from modifiers section
- This ensures storage: encrypted recipes include only storage/encrypted.ks
- Updated generated recipes and dishes to reflect the fix
2026-03-27 16:06:57 +01:00
Lukas Greve a4bc2967e5 Change: Update recipe generation to use single universal template
- Transition from multi-template (install/live recipe types) to single universal template (proteus)
- Remove recipe_type parameter from RecipeGenerator
- Update manifest format (remove recipe_type field)
- Simplify CLI (remove --type argument, use --output for single generation)
- Filename generation now uses primary modifier as first component
2026-03-27 15:39:30 +01:00
Lukas Greve 3ffb079981 refactor: Move recipe generator to cook/ directory and fix flattening bugs
- Move recipe-generator/ to cook/ for cleaner structure

- Fix ksflatten-relative path conversion to handle all %include paths

- Fix validation exit code to only fail on actual errors

- All recipes now generate and flatten successfully via make all
2026-03-27 14:02:59 +01:00
Lukas Greve 288ed0a249 refactor: Simplify template logic - reduce from 6 to 3 categories, remove variant_type, keep validation, remove tests
Simplified template logic: reduced from 6 categories (required, modifiers, optional, versioned, conditional, flags) to 3 categories (required, modifiers, optional). Removed variant_type and replaced with modifier-based approach (version, bootloader replaced, hardware_support). All validation methods kept for recipe generation and validation. Removed tests directory (tests/test_recipe_generator.py, tests/integration/, tests/container/). Removed non-ISO workflows (validate-recipes, test-generation, container-tests, validate-ingredients). Updated Makefile, requirements.txt, and documentation. All 20 recipes successfully generated, validated, and flattened.
2026-03-27 12:13:51 +01:00
Lukas Greve 789e0e05d4 refactor: Remove deprecated ingredients_dir parameter from RecipeGenerator
Simplify RecipeGenerator.__init__() to accept only templates_file parameter.
The old two-argument pattern RecipeGenerator(ingredients_dir, templates_file)
is no longer supported. All existing code already uses the new single-argument
style.

Changes:
- Remove ingredients_dir_or_templates parameter
- Remove backward compatibility logic
- Remove unused Optional import
- Update DEVELOPMENT.md example

Migration: Change RecipeGenerator(Path('ingredients'), Path('templates.yaml'))
           to RecipeGenerator(Path('templates.yaml'))
2026-03-27 11:07:53 +01:00
Lukas Greve 0a3c2b14d8 docs: Add comprehensive documentation to recipe generator
Add detailed docstrings and inline comments to all recipe generator modules explaining classes, functions, and complex logic in plain English.

Files updated:
- recipe-generator/recipe_generator.py: Module, class, and method docs
- recipe-generator/cli.py: CLI modes, arguments, and workflow docs
- recipe-generator/validators.py: Three-layer validation architecture docs
- recipe-generator/manifest.py: Manifest processing and variant expansion docs
- recipe-generator/generate_recipe.py: Entry point documentation
2026-03-27 11:07:16 +01:00
Lukas Greve 31955a8983 refactor: rename fragments directory to ingredients and update all references
- Directory rename: fragments/ → ingredients/ (54 .ks files)
- Updated all Python scripts:
  * tests/integration/conftest.py - fixture renames
  * tests/integration/test_integration.py - constant and path updates
  * tests/test_recipe_generator.py - updated test assertions
  * recipe-generator/validators.py - updated comments and error messages
  * recipe-generator/recipe_generator.py - updated comment
- Updated all YAML files:
  * recipe-generator/recipe_templates.yaml - 66 path references
  * .gitea/workflows/validate-fragments.yaml → validate-ingredients.yaml
  * .gitea/workflows/test-generation.yaml - path patterns
- Updated scripts:
  * bin/ksflatten-relative - updated path detection
- Updated test file:
  * tests/integration/test_fragments.py → test_ingredients.py
- Updated documentation:
  * DEVELOPMENT.md - simplified references
  * DEVELOPMENT_QUICK.md - updated examples
  * tests/container/README.md - test references
- Regenerated all recipes (16 files) with ingredient paths
- Updated test fixtures (7 files)
- All integration tests pass (5/5)
- All unit tests pass (29/31 - 2 pre-existing failures unrelated)
2026-03-26 20:27:56 +01:00
Lukas Greve 3eb4c75392 refactor: fix linting issues - remove unused kwargs, fix unused variable, and make method public 2026-03-26 19:26:31 +01:00
Lukas Greve 050f41787b Deleted extra dishes 2026-03-26 16:10:16 +01:00
Lukas Greve 05d611276d fix: Add _bare-metal suffix for False boolean modifiers to prevent filename collisions
The manifest uses hyphenated keys (guest-agents, hardware-support) but the filename
generation was looking for underscored keys, causing 16 variants to overwrite 4 files.

Added _get_modifier() helper to normalize both key formats and added _bare-metal suffix
for False values of guest_agents, ensuring unique filenames for all variant combinations.

This restores the intended 24 distinct variants from the manifest and adds support for
all modifiers (bootloader, initial-setup, desktop, security, storage, guest_agents, hardware_support).
2026-03-26 16:09:28 +01:00
Lukas Greve 81c8392874 refactor: Remove filename deduplication to generate all 24 variants
- Removed deduplication logic from cli.py
- All 24 variants now processed (some overwrite with same filename)
- manifests: Added comments explaining cartesian product and filename behavior
- tests: Updated assertions for correct filename generation order
- Added 3 new tests for guest_agents and hardware_support modifiers
2026-03-26 15:53:50 +01:00
Lukas Greve 898c831065 refactor: Modularize recipe generator
- Split generate_recipe.py into cli.py, recipe_generator.py, validators.py, manifest.py
- Removed override logic - modifiers now add fragments rather than replace
- Added filename deduplication to prevent overwriting recipes
- Updated CI workflows and tests to use new module structure
- Made pykickstart a hard dependency
- Removed ingredients/ directory support (only fragments/*.ks now used)
- New layout: 5 modules (~990 lines) vs single 769-line file
2026-03-26 15:31:18 +01:00
Lukas Greve 8f824cb977 Remove deprecated command tracking from generate_recipe
- Remove DEPRECATED_COMMANDS dictionary
- Remove _check_deprecated_commands() method
- Remove deprecated command checks from validation
- Remove test methods for deprecated commands
- Remove DEPRECATED_COMMANDS documentation reference

This shifts responsibility for tracking deprecated kickstart commands away
from the recipe generator, as this is not its primary role.
2026-03-26 14:29:22 +01:00