Refactor security and guest-agents config

- Move guest-agents from hypervisor modifier to independent optional feature
- Merge guest-agents/gui.ks into base.ks
- Remove security from required, add optional security modifier with off option
- Fix hypervisor-type modifier key normalization (underscore→hyphen)
- Add expand_variants() to handle list values in manifest
- Update all tests and expected recipes
This commit is contained in:
Lukas Greve
2026-03-25 21:18:01 +01:00
parent 5b8974a6ed
commit cd203b8799
55 changed files with 791 additions and 375 deletions
+48 -8
View File
@@ -10,6 +10,7 @@ import sys
import yaml
from pathlib import Path
from typing import Dict, List, Optional, Any
from itertools import product
# Deprecated/removed command mappings for Fedora 43 (F42) and rawhide
@@ -308,8 +309,10 @@ class RecipeGenerator:
# Handle modifiers section
for mod_key, mod_value in modifiers.items():
if mod_key in template.get('modifiers', {}):
mod_config = template['modifiers'][mod_key]
# Normalize key: convert underscores to hyphens for template lookup
mod_key_normalized = mod_key.replace('_', '-')
if mod_key_normalized in template.get('modifiers', {}):
mod_config = template['modifiers'][mod_key_normalized]
# Handle nested dict modifiers
if isinstance(mod_config, dict) and isinstance(mod_value, str):
@@ -460,6 +463,8 @@ class RecipeGenerator:
"""Generate recipe filename from parameters."""
# Extract variant subname if present
variant_subname = modifiers.get('variant_subname', '')
if not variant_subname:
variant_subname = modifiers.get('variant_type', '')
# Build base parts
parts = [recipe_type.replace('_', '-')]
@@ -468,10 +473,13 @@ class RecipeGenerator:
if variant_subname and variant_subname in ['desktop', 'server', 'hypervisor', 'hypervisor-desktop']:
parts.append(variant_subname)
# Add hypervisor-type (list, first type only for filename)
if modifiers.get('hypervisor-type') and isinstance(modifiers['hypervisor-type'], list):
types = modifiers['hypervisor-type']
parts.extend(types)
# Add hypervisor-type (list or single value for filename)
if modifiers.get('hypervisor_type'):
ht = modifiers['hypervisor_type']
if isinstance(ht, list):
parts.extend(ht)
else:
parts.append(ht)
# Add desktop (non-GNOME only, since GNOME is default)
if modifiers.get('desktop') and modifiers['desktop'] != 'gnome':
@@ -481,7 +489,7 @@ class RecipeGenerator:
parts.append(str(version))
# Add security suffix (devel only, since secure is default)
if modifiers.get('security') == 'devel':
if modifiers.get('security') == 'off':
parts.append('devel')
# Add storage suffix (encrypted only, since standard is default)
@@ -491,6 +499,36 @@ class RecipeGenerator:
return '_'.join(parts) + '.cfg'
def expand_variants(self, variants: List[Dict]) -> List[Dict]:
"""Expand variants with list values into individual variants."""
expanded = []
for variant in variants:
list_keys = {}
scalar_keys = {}
for key, value in variant.items():
if isinstance(value, list):
list_keys[key] = value
else:
scalar_keys[key] = value
if not list_keys:
expanded.append(variant)
continue
keys = list(list_keys.keys())
values_product = product(*[list_keys[k] for k in keys])
for combo in values_product:
new_variant = scalar_keys.copy()
for i, key in enumerate(keys):
new_variant[key] = combo[i]
expanded.append(new_variant)
return expanded
def main():
parser = argparse.ArgumentParser(
description='Generate Phyllome OS kickstart recipes from templates',
@@ -650,7 +688,9 @@ def main():
print(f"Error: Unknown recipe type in manifest: {recipe_type}", file=sys.stderr)
sys.exit(1)
for variant in recipe_config.get('variants', []):
variants = recipe_config.get('variants', [])
variants = generator.expand_variants(variants)
for variant in variants:
version = variant['version']
# Build modifiers dict (exclude 'name', 'version')
modifiers = {k: v for k, v in variant.items() if k not in ['name', 'version']}
+12 -12
View File
@@ -20,6 +20,7 @@ templates:
- hand-picked: fragments/packages/hand-picked.ks
optional:
hardware-support: fragments/packages/hardware-support.ks
guest-agents: fragments/guest-agents/base.ks
variant_type:
desktop:
server:
@@ -31,9 +32,6 @@ templates:
storage:
standard: fragments/storage/standard.ks
encrypted: fragments/storage/encrypted.ks
bootloader:
grub: fragments/bootloader/grub.ks
systemd-boot: fragments/bootloader/systemd-boot.ks
desktop:
gnome:
- fragments/desktop/gnome/config.ks
@@ -43,10 +41,12 @@ templates:
- fragments/desktop/labwc/config.ks
security:
secure: fragments/core/security/enabled.ks
devel: fragments/core/security/disabled.ks
"off": fragments/core/security/disabled.ks
initial-setup:
server: fragments/initial-setup/server/config.ks
desktop: fragments/initial-setup/desktop/config.ks
gnome: fragments/initial-setup/gnome/config.ks
generic-wayland: fragments/initial-setup/generic-wayland/config.ks
hypervisor-type:
amdcpu: fragments/hypervisor/amdcpu.ks
intelcpu: fragments/hypervisor/intelcpu.ks
@@ -56,11 +56,9 @@ templates:
- fragments/hypervisor/base/packages.ks
- fragments/hypervisor/base/services.ks
- fragments/hypervisor/base/post-scripts.ks
- fragments/guest-agents/base.ks
desktop:
- fragments/packages/virtual-machine-manager/packages.ks
- fragments/packages/virtual-machine-manager/post-scripts.ks
- fragments/guest-agents/gui.ks
# Live recipe - for live-desktop or live-server
live:
@@ -69,22 +67,24 @@ templates:
required:
- live-core: fragments/live/core/base.ks
- storage: fragments/live/core/storage.ks
- bootloader: fragments/bootloader/grub.ks
- bootloader: fragments/live/core/bootloader/grub.ks
- locale: fragments/core/locale.ks
- services: fragments/core/services.ks
- network: fragments/core/network.ks
- packages: fragments/live/core/packages.ks
- post: fragments/live/post/base.ks
- session: fragments/live/post/session.ks
- rpmfusion-nonfree: fragments/repo/rpmfusion-nonfree.ks
optional:
variant_type:
desktop:
server:
hardware-support: fragments/packages/hardware-support.ks
guest-agents: fragments/guest-agents/base.ks
hypervisor: fragments/live/hypervisor.ks
security:
secure: fragments/core/security/enabled.ks
devel: fragments/core/security/disabled.ks
hardware-support: fragments/packages/hardware-support.ks
hypervisor: fragments/live/hypervisor.ks
"off": fragments/core/security/disabled.ks
modifiers:
version:
"43": fragments/repo/fedora-43-mirrors.ks
@@ -93,5 +93,5 @@ templates:
standard: fragments/live/core/storage.ks
encrypted: fragments/live/core/storage.ks
bootloader:
grub: fragments/bootloader/grub.ks
systemd-boot: fragments/bootloader/systemd-boot.ks
grub: fragments/live/core/bootloader/grub.ks
systemd-boot: fragments/live/core/bootloader/systemd-boot.ks
+39 -95
View File
@@ -1,134 +1,78 @@
# Recipe Manifest for Phyllome OS
# Define all recipe variants using generators from recipe_templates.yaml
# Edit this file to add new variants, then run: make generate-recipes
#
# Supported syntax:
# - Single values: version: "43"
# - List values: version: ["43", "rawhide"] (expands to multiple variants)
# - List modifiers: hypervisor-type: ["amdcpu", "intelcpu"] (expands to separate variants)
recipes:
# Install variants - desktop
- name: install
variants:
- name: desktop
version: "43"
version: ["43", "rawhide"]
desktop: gnome
storage: standard
storage: ["standard", "encrypted"]
bootloader: grub
security: secure
hardware-support: true
initial-setup: server
- name: desktop
version: "43"
desktop: gnome
storage: standard
bootloader: grub
security: devel
hardware-support: true
initial-setup: server
- name: desktop
version: "43"
desktop: labwc
storage: standard
bootloader: grub
security: secure
hardware-support: true
initial-setup: server
- name: desktop
version: "rawhide"
desktop: gnome
storage: standard
bootloader: grub
security: secure
hardware-support: true
initial-setup: server
- name: desktop
version: "rawhide"
desktop: gnome
storage: encrypted
bootloader: grub
security: secure
hardware-support: true
hardware-support: [true, false]
guest-agents: [true, false]
initial-setup: server
security: [secure, 'off']
# Install variants - server (minimal, no desktop packages)
# Install variants - server
- name: install
variants:
- name: server
version: "43"
storage: standard
version: ["43", "rawhide"]
storage: ["standard", "encrypted"]
bootloader: grub
security: secure
hardware-support: true
initial-setup: server
- name: server
version: "43"
storage: standard
bootloader: grub
security: devel
hardware-support: true
initial-setup: server
- name: server
version: "rawhide"
storage: standard
bootloader: grub
security: secure
hardware-support: true
initial-setup: server
- name: server
version: "rawhide"
storage: standard
bootloader: grub
security: devel
hardware-support: true
hardware-support: [true, false]
guest-agents: [true, false]
initial-setup: server
security: [secure, 'off']
# Install variants - hypervisor
# Install variants - server hypervisor
- name: install
variants:
- name: hypervisor
version: "rawhide"
storage: standard
bootloader: grub
security: secure
hardware-support: true
hypervisor: base
hypervisor-type:
- amdcpu
- name: hypervisor
version: "rawhide"
storage: standard
bootloader: grub
security: secure
hardware-support: true
hypervisor: base
hypervisor-type:
- intelcpu
- name: hypervisor
version: ["43", "rawhide"]
storage: ["standard", "encrypted"]
bootloader: grub
hardware-support: [true, false]
guest-agents: [true, false]
hypervisor: base
hypervisor-type: ["amdcpu", "intelcpu"]
initial-setup: server
security: [secure, 'off']
# Install variants - hypervisor with desktop
# Install variants - desktop-hypervisor
- name: install
variants:
- name: hypervisor-desktop
version: "rawhide"
- name: desktop-hypervisor
version: ["43", "rawhide"]
desktop: gnome
storage: standard
storage: ["standard", "encrypted"]
bootloader: grub
security: secure
hardware-support: true
hardware-support: [true, false]
hypervisor: desktop
hypervisor-type:
- intelcpu
- intelgpu
initial-setup: desktop
hypervisor-type: ["amdcpu", "intelcpu"]
initial-setup: server
security: [secure, 'off']
# Live variants - desktop
- name: live
variants:
- name: desktop
version: "rawhide"
security: secure
hardware-support: true
hardware-support: [true, false]
guest-agents: [true, false]
# Live variants - server
- name: live
variants:
- name: server
version: "rawhide"
security: secure
hardware-support: true
hardware-support: [true, false]
guest-agents: [true, false]