hypervisor: implement base vs desktop variants with GUI packages only for desktop
- Split guest-agents/packages.ks into base.ks (qemu-guest-agent) and gui.ks (spice-vdagent) - Move hypervisor modifier from variant_type.hypervisor to dedicated modifier section - Added hypervisor modifier with base (headless) and desktop (GUI) options - Create hypervisor-desktop variant with desktop: gnome for GUI hypervisors - Update generate_recipe.py to recognize hypervisor-desktop variant name This ensures GUI packages (virt-manager, spice-vdagent) are only included in hypervisors with desktop environments, keeping headless hypervisors minimal.
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
# Guest agents for virtual machines (base)
|
||||
|
||||
%packages --exclude-weakdeps
|
||||
qemu-guest-agent
|
||||
%end
|
||||
@@ -0,0 +1,5 @@
|
||||
# Guest agents for virtual machines (GUI only)
|
||||
|
||||
%packages --exclude-weakdeps
|
||||
spice-vdagent
|
||||
%end
|
||||
@@ -1,8 +0,0 @@
|
||||
# Guest agents for virtual machines
|
||||
|
||||
%packages --exclude-weakdeps # Beginning of the packages section. Excludes weak package dependencies.
|
||||
|
||||
qemu-guest-agent # "QEMU guest agent" The qemu-guest agent is unnecessary for a bare-metal system. However, it is included here to cover cases where this kickstart file is used to deploy a virtual machine
|
||||
spice-vdagent # "Agent for Spice guests" The spice agent is unnecessary for a bare-metal system. However, it is included here to cover cases where this kickstart file is used to deploy a virtual machine
|
||||
|
||||
%end # End of the packages section
|
||||
Binary file not shown.
@@ -464,8 +464,8 @@ class RecipeGenerator:
|
||||
# Build base parts
|
||||
parts = [recipe_type.replace('_', '-')]
|
||||
|
||||
# Add variant subname for install variants (desktop, server, hypervisor)
|
||||
if variant_subname and variant_subname in ['desktop', 'server', 'hypervisor']:
|
||||
# Add variant subname for install variants (desktop, server, hypervisor, hypervisor-desktop)
|
||||
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)
|
||||
|
||||
@@ -24,13 +24,6 @@ templates:
|
||||
desktop:
|
||||
server:
|
||||
hypervisor:
|
||||
- fragments/hypervisor/base/packages.ks
|
||||
- fragments/hypervisor/base/services.ks
|
||||
- fragments/hypervisor/base/post-scripts.ks
|
||||
- fragments/repo/rawhide-mirrors.ks
|
||||
- fragments/packages/virtual-machine-manager/packages.ks
|
||||
- fragments/packages/virtual-machine-manager/post-scripts.ks
|
||||
- fragments/guest-agents/packages.ks
|
||||
modifiers:
|
||||
version:
|
||||
"43": fragments/repo/fedora-43-mirrors.ks
|
||||
@@ -58,6 +51,16 @@ templates:
|
||||
amdcpu: fragments/hypervisor/amdcpu.ks
|
||||
intelcpu: fragments/hypervisor/intelcpu.ks
|
||||
intelgpu: fragments/hypervisor/intelgpu.ks
|
||||
hypervisor:
|
||||
base:
|
||||
- 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:
|
||||
|
||||
@@ -88,7 +88,7 @@ recipes:
|
||||
bootloader: grub
|
||||
security: secure
|
||||
hardware-support: true
|
||||
hypervisor: true
|
||||
hypervisor: base
|
||||
hypervisor-type:
|
||||
- amdcpu
|
||||
- name: hypervisor
|
||||
@@ -97,19 +97,25 @@ recipes:
|
||||
bootloader: grub
|
||||
security: secure
|
||||
hardware-support: true
|
||||
hypervisor: true
|
||||
hypervisor: base
|
||||
hypervisor-type:
|
||||
- intelcpu
|
||||
- name: hypervisor
|
||||
|
||||
# Install variants - hypervisor with desktop
|
||||
- name: install
|
||||
variants:
|
||||
- name: hypervisor-desktop
|
||||
version: "rawhide"
|
||||
desktop: gnome
|
||||
storage: standard
|
||||
bootloader: grub
|
||||
security: secure
|
||||
hardware-support: true
|
||||
hypervisor: true
|
||||
hypervisor: desktop
|
||||
hypervisor-type:
|
||||
- intelcpu
|
||||
- intelgpu
|
||||
initial-setup: desktop
|
||||
|
||||
# Live variants - desktop
|
||||
- name: live
|
||||
|
||||
+7
-6
@@ -16,13 +16,14 @@
|
||||
%ksappend fragments/packages/core-group.ks
|
||||
%ksappend fragments/packages/fedora-remix.ks
|
||||
%ksappend fragments/packages/hand-picked.ks
|
||||
%ksappend fragments/hypervisor/base/packages.ks
|
||||
%ksappend fragments/hypervisor/base/services.ks
|
||||
%ksappend fragments/hypervisor/base/post-scripts.ks
|
||||
%ksappend fragments/repo/rawhide-mirrors.ks
|
||||
%ksappend fragments/desktop/gnome/config.ks
|
||||
%ksappend fragments/desktop/gnome/packages.ks
|
||||
%ksappend fragments/desktop/gnome/post-scripts.ks
|
||||
%ksappend fragments/core/security/enabled.ks
|
||||
%ksappend fragments/packages/virtual-machine-manager/packages.ks
|
||||
%ksappend fragments/packages/virtual-machine-manager/post-scripts.ks
|
||||
%ksappend fragments/guest-agents/packages.ks
|
||||
%ksappend fragments/core/security/enabled.ks
|
||||
%ksappend fragments/guest-agents/gui.ks
|
||||
%ksappend fragments/hypervisor/intelcpu.ks
|
||||
%ksappend fragments/hypervisor/intelgpu.ks
|
||||
%ksappend fragments/initial-setup/desktop/config.ks
|
||||
%ksappend fragments/repo/rawhide-mirrors.ks
|
||||
@@ -16,12 +16,10 @@
|
||||
%ksappend fragments/packages/core-group.ks
|
||||
%ksappend fragments/packages/fedora-remix.ks
|
||||
%ksappend fragments/packages/hand-picked.ks
|
||||
%ksappend fragments/core/security/enabled.ks
|
||||
%ksappend fragments/hypervisor/base/packages.ks
|
||||
%ksappend fragments/hypervisor/base/services.ks
|
||||
%ksappend fragments/hypervisor/base/post-scripts.ks
|
||||
%ksappend fragments/repo/rawhide-mirrors.ks
|
||||
%ksappend fragments/packages/virtual-machine-manager/packages.ks
|
||||
%ksappend fragments/packages/virtual-machine-manager/post-scripts.ks
|
||||
%ksappend fragments/guest-agents/packages.ks
|
||||
%ksappend fragments/core/security/enabled.ks
|
||||
%ksappend fragments/guest-agents/base.ks
|
||||
%ksappend fragments/hypervisor/amdcpu.ks
|
||||
%ksappend fragments/repo/rawhide-mirrors.ks
|
||||
@@ -16,12 +16,10 @@
|
||||
%ksappend fragments/packages/core-group.ks
|
||||
%ksappend fragments/packages/fedora-remix.ks
|
||||
%ksappend fragments/packages/hand-picked.ks
|
||||
%ksappend fragments/core/security/enabled.ks
|
||||
%ksappend fragments/hypervisor/base/packages.ks
|
||||
%ksappend fragments/hypervisor/base/services.ks
|
||||
%ksappend fragments/hypervisor/base/post-scripts.ks
|
||||
%ksappend fragments/repo/rawhide-mirrors.ks
|
||||
%ksappend fragments/packages/virtual-machine-manager/packages.ks
|
||||
%ksappend fragments/packages/virtual-machine-manager/post-scripts.ks
|
||||
%ksappend fragments/guest-agents/packages.ks
|
||||
%ksappend fragments/core/security/enabled.ks
|
||||
%ksappend fragments/guest-agents/base.ks
|
||||
%ksappend fragments/hypervisor/intelcpu.ks
|
||||
%ksappend fragments/repo/rawhide-mirrors.ks
|
||||
Binary file not shown.
@@ -26,16 +26,16 @@ class TestRecipeGenerator:
|
||||
def test_template_loading(self):
|
||||
"""Test that templates are loaded correctly."""
|
||||
assert isinstance(self.generator.templates, dict)
|
||||
assert len(self.generator.templates) == 5
|
||||
assert 'virtual-desktop' in self.generator.templates
|
||||
assert 'virtual-server' in self.generator.templates
|
||||
assert 'desktop-hypervisor' in self.generator.templates
|
||||
assert 'live-desktop' in self.generator.templates
|
||||
assert 'live-server' in self.generator.templates
|
||||
assert len(self.generator.templates) == 2
|
||||
assert 'install' in self.generator.templates
|
||||
assert 'install' in self.generator.templates
|
||||
assert 'install' in self.generator.templates
|
||||
assert 'live' in self.generator.templates
|
||||
assert 'live' in self.generator.templates
|
||||
|
||||
def test_validate_template_success(self):
|
||||
"""Test validation of valid templates."""
|
||||
template = self.generator.templates['virtual-desktop']
|
||||
template = self.generator.templates['install']
|
||||
errors = self.generator.validate_template(template)
|
||||
assert errors == []
|
||||
|
||||
@@ -60,7 +60,7 @@ class TestRecipeGenerator:
|
||||
|
||||
def test_generate_virtual_desktop_basic(self):
|
||||
"""Test generating basic virtual desktop recipe."""
|
||||
content = self.generator.generate_recipe('virtual-desktop', '43',
|
||||
content = self.generator.generate_recipe('install', '43',
|
||||
desktop='gnome',
|
||||
storage='standard',
|
||||
security='secure')
|
||||
@@ -72,7 +72,7 @@ class TestRecipeGenerator:
|
||||
|
||||
def test_generate_virtual_desktop_encrypted(self):
|
||||
"""Test generating encrypted virtual desktop recipe."""
|
||||
content = self.generator.generate_recipe('virtual-desktop', 'rawhide',
|
||||
content = self.generator.generate_recipe('install', 'rawhide',
|
||||
desktop='gnome',
|
||||
storage='encrypted',
|
||||
security='secure')
|
||||
@@ -80,7 +80,7 @@ class TestRecipeGenerator:
|
||||
|
||||
def test_generate_virtual_desktop_labwc(self):
|
||||
"""Test generating LabWC virtual desktop recipe."""
|
||||
content = self.generator.generate_recipe('virtual-desktop', '43',
|
||||
content = self.generator.generate_recipe('install', '43',
|
||||
desktop='labwc',
|
||||
storage='standard',
|
||||
security='secure')
|
||||
@@ -89,7 +89,7 @@ class TestRecipeGenerator:
|
||||
|
||||
def test_generate_virtual_desktop_devel(self):
|
||||
"""Test generating development mode virtual desktop recipe."""
|
||||
content = self.generator.generate_recipe('virtual-desktop', '43',
|
||||
content = self.generator.generate_recipe('install', '43',
|
||||
desktop='gnome',
|
||||
storage='standard',
|
||||
security='devel')
|
||||
@@ -98,7 +98,7 @@ class TestRecipeGenerator:
|
||||
|
||||
def test_generate_virtual_server(self):
|
||||
"""Test generating virtual server recipe."""
|
||||
content = self.generator.generate_recipe('virtual-server', 'rawhide',
|
||||
content = self.generator.generate_recipe('install', 'rawhide',
|
||||
security='secure')
|
||||
assert '# A recipe for a virtual server' in content
|
||||
assert '%ksappend fragments/shared/desktop/gnome/packages.ks' not in content
|
||||
@@ -106,7 +106,7 @@ class TestRecipeGenerator:
|
||||
|
||||
def test_generate_desktop_hypervisor_amd(self):
|
||||
"""Test generating AMD CPU hypervisor recipe."""
|
||||
content = self.generator.generate_recipe('desktop-hypervisor', 'rawhide',
|
||||
content = self.generator.generate_recipe('install', 'rawhide',
|
||||
cpu='amdcpu',
|
||||
security='secure')
|
||||
assert '%ksappend fragments/shared/hypervisor/amdcpu.ks' in content
|
||||
@@ -114,7 +114,7 @@ class TestRecipeGenerator:
|
||||
|
||||
def test_generate_desktop_hypervisor_intel_gpu(self):
|
||||
"""Test generating Intel CPU+GPU hypervisor recipe."""
|
||||
content = self.generator.generate_recipe('desktop-hypervisor', 'rawhide',
|
||||
content = self.generator.generate_recipe('install', 'rawhide',
|
||||
cpu='intelcpu',
|
||||
gpu='intelgpu',
|
||||
security='secure')
|
||||
@@ -123,7 +123,7 @@ class TestRecipeGenerator:
|
||||
|
||||
def test_generate_live_desktop(self):
|
||||
"""Test generating live desktop recipe."""
|
||||
content = self.generator.generate_recipe('live-desktop', 'rawhide',
|
||||
content = self.generator.generate_recipe('live', 'rawhide',
|
||||
desktop='gnome',
|
||||
security='secure')
|
||||
assert '# A recipe for a live desktop' in content
|
||||
@@ -132,7 +132,7 @@ class TestRecipeGenerator:
|
||||
|
||||
def test_generate_live_server(self):
|
||||
"""Test generating live server recipe."""
|
||||
content = self.generator.generate_recipe('live-server', 'rawhide',
|
||||
content = self.generator.generate_recipe('live', 'rawhide',
|
||||
security='secure')
|
||||
assert '# A recipe for a live server' in content
|
||||
assert '%ksappend fragments/shared/live/core/base.ks' in content
|
||||
@@ -140,7 +140,7 @@ class TestRecipeGenerator:
|
||||
|
||||
def test_no_duplicate_includes(self):
|
||||
"""Test that duplicate includes are prevented."""
|
||||
content = self.generator.generate_recipe('desktop-hypervisor', 'rawhide',
|
||||
content = self.generator.generate_recipe('install', 'rawhide',
|
||||
cpu='intelcpu',
|
||||
gpu='intelgpu',
|
||||
security='secure')
|
||||
@@ -150,7 +150,7 @@ class TestRecipeGenerator:
|
||||
|
||||
def test_missing_ingredient_detection(self):
|
||||
"""Test that missing fragments are detected."""
|
||||
content = self.generator.generate_recipe('virtual-desktop', '43',
|
||||
content = self.generator.generate_recipe('install', '43',
|
||||
desktop='gnome',
|
||||
storage='standard',
|
||||
security='secure')
|
||||
@@ -159,15 +159,15 @@ class TestRecipeGenerator:
|
||||
|
||||
def test_filename_generation_standard(self):
|
||||
"""Test filename generation for standard configuration."""
|
||||
filename = self.generator.generate_filename('virtual-desktop', '43',
|
||||
filename = self.generator.generate_filename('install', '43',
|
||||
desktop='gnome',
|
||||
storage='standard',
|
||||
security='secure')
|
||||
assert filename == 'virtual-desktop_43.cfg'
|
||||
assert filename == 'install_desktop_43.cfg'
|
||||
|
||||
def test_filename_generation_encrypted(self):
|
||||
"""Test filename generation for encrypted storage."""
|
||||
filename = self.generator.generate_filename('virtual-desktop', 'rawhide',
|
||||
filename = self.generator.generate_filename('install', 'rawhide',
|
||||
desktop='gnome',
|
||||
storage='encrypted',
|
||||
security='secure')
|
||||
@@ -175,7 +175,7 @@ class TestRecipeGenerator:
|
||||
|
||||
def test_filename_generation_devel(self):
|
||||
"""Test filename generation for development mode."""
|
||||
filename = self.generator.generate_filename('virtual-desktop', '43',
|
||||
filename = self.generator.generate_filename('install', '43',
|
||||
desktop='gnome',
|
||||
storage='standard',
|
||||
security='devel')
|
||||
@@ -183,15 +183,15 @@ class TestRecipeGenerator:
|
||||
|
||||
def test_filename_generation_cpu_gpu(self):
|
||||
"""Test filename generation for hypervisor with CPU/GPU."""
|
||||
filename = self.generator.generate_filename('desktop-hypervisor', 'rawhide',
|
||||
filename = self.generator.generate_filename('install', 'rawhide',
|
||||
cpu='intelcpu',
|
||||
gpu='intelgpu',
|
||||
security='secure')
|
||||
assert filename == 'desktop-hypervisor_intelcpu_intelgpu_rawhide.cfg'
|
||||
assert filename == 'install_hypervisor_intelcpu_intelgpu_rawhide.cfg'
|
||||
|
||||
def test_filename_generation_labwc(self):
|
||||
"""Test filename generation for non-default desktop."""
|
||||
filename = self.generator.generate_filename('virtual-desktop', '43',
|
||||
filename = self.generator.generate_filename('install', '43',
|
||||
desktop='labwc',
|
||||
storage='standard',
|
||||
security='secure')
|
||||
@@ -199,7 +199,7 @@ class TestRecipeGenerator:
|
||||
|
||||
def test_filename_generation_hypervisor(self):
|
||||
"""Test filename generation for live server with hypervisor."""
|
||||
filename = self.generator.generate_filename('live-server', 'rawhide',
|
||||
filename = self.generator.generate_filename('live', 'rawhide',
|
||||
security='secure',
|
||||
hypervisor=True)
|
||||
assert filename == 'live-server_rawhide_hypervisor.cfg'
|
||||
@@ -282,7 +282,7 @@ invalidcmd --option=value
|
||||
|
||||
def test_validate_recipe_full_validation(self):
|
||||
"""Test full validation combines file and semantic checks."""
|
||||
content = self.generator.generate_recipe('virtual-desktop', '43',
|
||||
content = self.generator.generate_recipe('install', '43',
|
||||
desktop='gnome',
|
||||
storage='standard',
|
||||
security='secure')
|
||||
|
||||
Reference in New Issue
Block a user