Skip to content

Deferred template - #870

Open
ben-grande wants to merge 5 commits into
QubesOS:mainfrom
ben-grande:deferred-template
Open

ben-grande wants to merge 5 commits into
QubesOS:mainfrom
ben-grande:deferred-template

Conversation

@ben-grande

@ben-grande ben-grande commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Add ability for template based qubes (AppVM and DispVM) to be able to change the template while running. When the qube is running and you modify the template property, it is set to the newvalue, while the active_template changes to the oldvalue if it is still the default.

The use of separate properties doesn't break new clients. For example, Qube Manager reacts to property-set:template and adapts the field to the current value, despite it not being the active one. This is what happens for other properties also, such as virt_mode and kernel, you may change it live, but it only applies on the next boot.

Fixes: QubesOS/qubes-issues#8070

Clients should deal with the new property this way:

  • react to property-(re)?set:(active_)?template)
  • if active_template property is default, show only it, else, show it alongside the template indicating that it is deferred, this is for a minimal view with less clutter. On clients that would be better to show two columns containing both values, that is also fine.

@codecov

codecov Bot commented Aug 13, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 84.26966% with 14 lines in your changes missing coverage. Please review.
✅ Project coverage is 70.77%. Comparing base (e231e51) to head (4c8fbb0).
⚠️ Report is 11 commits behind head on main.

Files with missing lines Patch % Lines
qubes/vm/dispvm.py 58.82% 7 Missing ⚠️
qubes/api/admin.py 71.42% 4 Missing ⚠️
qubes/features.py 83.33% 2 Missing ⚠️
qubes/vm/appvm.py 96.66% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #870      +/-   ##
==========================================
+ Coverage   70.51%   70.77%   +0.26%     
==========================================
  Files          61       61              
  Lines       14371    14366       -5     
==========================================
+ Hits        10133    10168      +35     
+ Misses       4238     4198      -40     
Flag Coverage Δ
unittests 70.77% <84.26%> (+0.26%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

ben-grande added a commit to ben-grande/qubes-manager that referenced this pull request Aug 18, 2026
With a server that supports deferred template, clients don't need to
worry about the qube state to block template change, in this case, there
were only things to remove, as showing "active_template" is irrelevant
here, the user just wants to change the "template" property to a new
value.

For: QubesOS/qubes-issues#8070
Requires: QubesOS/qubes-core-admin#870
Requires: QubesOS/qubes-core-admin-client#496
@ben-grande

Copy link
Copy Markdown
Contributor Author

openQArun PR_LABEL=openqa-group-2

@qubesos-bot

qubesos-bot commented Aug 18, 2026

Copy link
Copy Markdown

OpenQA test summary

Complete test suite and dependencies: https://openqa.qubes-os.org/tests/overview?distri=qubesos&version=4.3&build=2026083116-devel&flavor=pull-requests

Test run included the following:

New failures, excluding unstable

Compared to: https://openqa.qubes-os.org/tests/overview?distri=qubesos&version=4.3&build=2026050504-devel&flavor=update

  • system_tests_extra

    • TC_00_QVCTest_debian-13-xfce: test_010_screenshare (failure)
      ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^... AssertionError: 1179648 != 0

    • TC_00_QVCTest_fedora-44-xfce: test_010_screenshare (failure + cleanup)
      ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^... AssertionError: 1179648 != 0

  • system_tests_usbproxy

    • TC_20_USBProxy_core3_fedora-44-xfce: test_030_detach (error)
      qubesusbproxy.core3ext.QubesUSBException: Device detach failed: 20...
  • system_tests_gpu_passthrough@hw13

    • gpu_passthrough: Failed (test died)
      # Test died: command 'ansible-playbook -i inventory -e pci_devices=...
  • system_tests_qwt_win10@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/install-complete-\d+-/...
  • system_tests_qwt_win10_seamless@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/install-complete-\d+-/...

    • windows_install: Failed (test died + timed out)
      # Test died: Install timed out at qubesos/tests/windows_install.pm ...

  • system_tests_qwt_win11@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/install-complete-\d+-/...

Failed tests

13 failures
  • system_tests_whonix

    • [unstable] whonixcheck: fail (unknown)
      Whonixcheck for anon-whonix failed...

    • [unstable] whonixcheck: Failed (test died)
      # Test died: systemcheck failed at qubesos/tests/whonixcheck.pm lin...

  • system_tests_extra

    • TC_00_QVCTest_debian-13-xfce: test_010_screenshare (failure)
      ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^... AssertionError: 1179648 != 0

    • TC_00_QVCTest_fedora-44-xfce: test_010_screenshare (failure + cleanup)
      ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^... AssertionError: 1179648 != 0

  • system_tests_usbproxy

    • TC_20_USBProxy_core3_fedora-44-xfce: test_030_detach (error)
      qubesusbproxy.core3ext.QubesUSBException: Device detach failed: 20...
  • system_tests_dispvm

  • system_tests_gpu_passthrough@hw13

    • gpu_passthrough: Failed (test died)
      # Test died: command 'ansible-playbook -i inventory -e pci_devices=...
  • system_tests_qwt_win10@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/install-complete-\d+-/...

    • windows_install: Failed (test died + timed out)
      # Test died: Install timed out at qubesos/tests/windows_install.pm ...

  • system_tests_qwt_win10_seamless@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/install-complete-\d+-/...

    • windows_install: Failed (test died + timed out)
      # Test died: Install timed out at qubesos/tests/windows_install.pm ...

  • system_tests_qwt_win11@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/install-complete-\d+-/...

    • windows_install: Failed (test died + timed out)
      # Test died: Install timed out at qubesos/tests/windows_install.pm ...

Fixed failures

Compared to: https://openqa.qubes-os.org/tests/176874#dependencies

34 fixed
  • system_tests_pvgrub_salt_storage

    • system_tests: Fail (unknown)
      Tests qubes.tests.integ.grub failed (exit code 1), details reported...

    • system_tests: Failed (test died)
      # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...

    • TC_41_HVMGrub_debian-13-xfce: test_000_standalone_vm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_41_HVMGrub_debian-13-xfce: test_001_standalone_vm_dracut (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_41_HVMGrub_debian-13-xfce: test_010_template_based_vm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_41_HVMGrub_debian-13-xfce: test_011_template_based_vm_dracut (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_41_HVMGrub_fedora-43-xfce: test_010_template_based_vm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

  • system_tests_extra

    • TC_01_InputProxyExclude_debian-13-xfce: test_000_qemu_tablet (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_01_InputProxyExclude_fedora-43-xfce: test_000_qemu_tablet (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_00_QVCTest_fedora-43-xfce: test_010_screenshare (failure + cleanup)
      ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^... AssertionError: 1179648 != 0

    • TC_00_QVCTest_whonix-gateway-18: test_010_screenshare (failure + cleanup)
      AssertionError: 2.3156185715769593 not less than 2.0

    • TC_00_PDFConverter_fedora-43-xfce: test_004_cancel_stops_conversion (failure)
      AssertionError: DispVM not cleaned up 10s after cancel: {<DispVM at...

  • system_tests_usbproxy

    • system_tests: wait_serial (wait serial expected)
      # wait_serial expected: qr/h3uXO-\d+-/...

    • TC_20_USBProxy_core3_fedora-43-xfce: test_090_attach_stubdom (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

  • system_tests_network_ipv6

    • system_tests: Fail (unknown)
      Tests qubes.tests.integ.network_ipv6 failed (exit code 1), details ...

    • system_tests: Failed (test died)
      # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...

    • VmIPv6Networking_fedora-43-xfce: test_001_simple_networking_paused_from_none_to_existent (error)
      raise TimeoutError from exc_val... TimeoutError

  • system_tests_audio

  • system_tests_whonix@hw1

    • whonixcheck: fail (unknown)
      Whonixcheck for sys-whonix failed...

    • whonixcheck: Failed (test died)
      # Test died: systemcheck failed at qubesos/tests/whonixcheck.pm lin...

  • system_tests_qwt_win10_seamless@hw13

    • windows_clipboard_and_filecopy: unnamed test (unknown)
    • windows_clipboard_and_filecopy: Failed (test died)
      # Test died: no candidate needle with tag(s) 'windows-Edge-address-...
  • system_tests_audio@hw1

    • system_tests: Fail (unknown)
      Tests qubes.tests.integ.audio failed (exit code 1), details reporte...

    • system_tests: Failed (test died)
      # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...

    • TC_20_AudioVM_Pulse_debian-13-xfce: test_222_audio_rec_unmuted_pulseaudio (failure)
      AssertionError: only silence detected, no useful audio data

  • system_tests_guivm_gpu_gui_interactive@hw13

    • shutdown: unnamed test (unknown)
    • shutdown: Failed (test died)
      # Test died: no candidate needle with tag(s) 'text-logged-in-root' ...

Unstable tests

Details
  • system_tests_whonix

    whonixcheck/Failed (1/5 times with errors)
    • job 193726 # Test died: command 'qvm-run -ap whonix-gateway-18 'LC_ALL=C whon...
    whonixcheck/Failed (1/5 times with errors)
    • job 192973 # Test died: systemcheck failed at qubesos/tests/whonixcheck.pm lin...
    whonixcheck/fail (1/5 times with errors)
    • job 193726 Whonixcheck for anon-whonix failed...
    whonixcheck/fail (1/5 times with errors)
    whonixcheck/wait_serial (1/5 times with errors)
    • job 193726 # Command: qvm-run -ap whonix-gateway-18 'LC_ALL=C whonixcheck --v...
  • system_tests_extra

    system_tests/Failed (1/5 times with errors)
    • job 192562 # Test died: command 'testfunc qubes.tests.extra' timed out at qube...
    system_tests/Failed (1/5 times with errors)
    • job 193751 # Test died: command 'curl --form upload=@nose2-junit.xml --form up...
    system_tests/wait_serial (1/5 times with errors)
    • job 192562 # Command: testfunc qubes.tests.extra...
  • system_tests_gui_interactive

    clipboard_and_web/ (1/5 times with errors)
    clipboard_and_web/Failed (1/5 times with errors)
    • job 193803 # Test died: no candidate needle with tag(s) 'clipboard-paste-notif...
    gui_keyboard_layout/Failed (1/5 times with errors)
    • job 193752 # Test died: command 'qvm-run -pu root work systemctl --wait is-sys...
  • system_tests_guivm_gui_interactive

    clipboard_and_web/ (1/5 times with errors)
    clipboard_and_web/Failed (1/5 times with errors)
    • job 193754 # Test died: no candidate needle with tag(s) 'clipboard-paste-notif...
  • system_tests_qrexec

    system_tests/Fail (1/5 times with errors)
    • job 193759 Tests qubes.tests.integ.qrexec failed (exit code 1), details report...
    system_tests/Failed (1/5 times with errors)
    • job 193759 # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...
    TC_00_Qrexec_whonix-workstation-18/test_050_qrexec_simple_eof (1/5 times with errors)
    • job 193759 AssertionError: Timeout, probably EOF wasn't transferred to the VM ...
  • system_tests_network_updates

    system_tests/Fail (1/5 times with errors)
    • job 193004 Tests qubes.tests.integ.dom0_update failed (exit code 1), details r...
    system_tests/Fail (1/5 times with errors)
    • job 193841 Tests qubes.tests.integ.dom0_update failed (exit code 1), details r...
    system_tests/Fail (1/5 times with errors)
    • job 193757 Tests qubes.tests.integ.vm_template_upgrade failed (exit code 1), d...
    system_tests/Fail (1/5 times with errors)
    • job 193841 Tests qubes.tests.integ.vm_template_upgrade failed (exit code 1), d...
    system_tests/Failed (1/5 times with errors)
    • job 193004 # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...
    system_tests/Failed (1/5 times with errors)
    • job 193757 # Test died: command 'sudo python3 split_logs.py --junit-xml=nose2-...
    system_tests/Failed (1/5 times with errors)
    • job 193841 # Test died: command 'sudo python3 split_logs.py --junit-xml=nose2-...
    TC_00_Dom0Upgrade_whonix-gateway-18/test_000_update_qubes_vm_update (1/5 times with errors)
    • job 193841 ~~~~~~~~~^^^^^^^^^^^^^^^^^^... AssertionError: qubes-vm-update failed:
    TC_00_Dom0Upgrade_whonix-gateway-18/test_010_instal (1/5 times with errors)
    • job 193004 Error: Failed to download metadata for repo 'test': Cannot download...
    TC_11_QvmTemplateMgmtVM_fedora-44-xfce/test_010_template_install (1/5 times with errors)
    • job 193004 AssertionError: qvm-template failed: [Qrexec] ERROR: dnf command is...
    integ/vm_template_upgrade (2/5 times with errors)
    • job 193757 ModuleNotFoundError: No module named 'qubes.tests.integ.vm_template...
    • job 193841 ModuleNotFoundError: No module named 'qubes.tests.integ.vm_template...
  • system_tests_dispvm

    system_tests/Fail (1/5 times with errors)
    • job 193804 Tests qubes.tests.integ.dispvm failed (exit code 1), details report...
    system_tests/Fail (1/5 times with errors)
    • job 193750 Tests qubes.tests.integ.dispvm failed (exit code 1), details report...
    system_tests/Failed (1/5 times with errors)
    • job 193804 # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...
    system_tests/Failed (1/5 times with errors)
    • job 193750 # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...
    TC_21_DispVM_Preload/test_012_preload_low_mem (2/5 times with errors)
    • job 193750 ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^... AssertionError: 1 != 0
    • job 193804 ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^... AssertionError: 1 != 0
    TC_21_DispVM_Preload/test_012_preload_low_mem_early_startup (2/5 times with errors)
    • job 193750 AssertionError: last preloaded didn't complete in time
    • job 193804 AssertionError: last preloaded didn't complete in time
    TC_20_DispVM_debian-13-xfce/test_013_preload_gui (2/5 times with errors)
    • job 193750 AssertionError: last preloaded didn't complete in time
    • job 193804 AssertionError: last preloaded didn't complete in time
    TC_20_DispVM_fedora-44-xfce/test_013_preload_gui (2/5 times with errors)
    • job 193750 AssertionError: last preloaded didn't complete in time
    • job 193804 AssertionError: last preloaded didn't complete in time
    TC_20_DispVM_whonix-workstation-18/test_013_preload_gui (2/5 times with errors)
    • job 193750 AssertionError: last preloaded didn't complete in time
    • job 193804 AssertionError: last preloaded didn't complete in time
    TC_21_DispVM_Preload/test_015_preload_race_more (2/5 times with errors)
    • job 193750 AssertionError: last preloaded didn't complete in time
    • job 193804 AssertionError: last preloaded didn't complete in time
    TC_21_DispVM_Preload/test_017_preload_autostart (2/5 times with errors)
    • job 193750 AssertionError: last preloaded didn't complete in time
    • job 193804 AssertionError: last preloaded didn't complete in time
    TC_21_DispVM_Preload/test_018_preload_global (2/5 times with errors)
    • job 193750 AssertionError: last preloaded didn't complete in time
    • job 193804 AssertionError: last preloaded didn't complete in time
    TC_21_DispVM_Preload/test_019_preload_discard_outdated_volumes (2/5 times with errors)
    • job 193750 AssertionError: last preloaded didn't complete in time
    • job 193804 AssertionError: last preloaded didn't complete in time
    TC_21_DispVM_Preload/test_020_preload_discard_outdated_volume_size (2/5 times with errors)
    • job 193750 AssertionError: last preloaded didn't complete in time
    • job 193804 AssertionError: last preloaded didn't complete in time
    TC_21_DispVM_Preload/test_021_preload_discard_outdated_setting (2/5 times with errors)
    • job 193750 AssertionError: last preloaded didn't complete in time
    • job 193804 AssertionError: last preloaded didn't complete in time
  • system_tests_kde_gui_interactive

    gui_keyboard_layout/Failed (1/5 times with errors)
    • job 193730 # Test died: command 'qvm-run -pu root work systemctl --wait is-sys...
  • system_tests_guivm_vnc_gui_interactive

    guivm_manager/ (1/5 times with errors)
    guivm_manager/Failed (1/5 times with errors)
    • job 193734 # Test died: no candidate needle with tag(s) 'menu-qubes-tools' mat...
  • system_tests_audio

    system_tests/Fail (1/5 times with errors)
    • job 192976 Tests qubes.tests.integ.audio failed (exit code 1), details reporte...
    system_tests/Failed (1/5 times with errors)
    • job 192976 # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...
    TC_20_AudioVM_Pulse_whonix-workstation-18/test_220_audio_play_pulseaudio (1/5 times with errors)
    • job 192976 AssertionError: too short audio, expected 10s, got 9.49, saved to /...
    TC_20_AudioVM_Pulse_whonix-workstation-18/test_222_audio_rec_unmuted_pulseaudio (1/5 times with errors)
    • job 192976 AssertionError: too short audio, expected 10s, got 9.05251700680272...
    TC_20_AudioVM_PipeWire_whonix-workstation-18/test_226_audio_playback_pipewire (1/5 times with errors)
    • job 192976 AssertionError: too short audio, expected 10s, got 8.97385487528344...
  • system_tests_whonix@hw1

    whonixcheck/Failed (1/5 times with errors)
    • job 193726 # Test died: command 'qvm-run -ap whonix-gateway-18 'LC_ALL=C whon...
    whonixcheck/Failed (1/5 times with errors)
    • job 192973 # Test died: systemcheck failed at qubesos/tests/whonixcheck.pm lin...
    whonixcheck/fail (1/5 times with errors)
    • job 193726 Whonixcheck for anon-whonix failed...
    whonixcheck/fail (1/5 times with errors)
    whonixcheck/wait_serial (1/5 times with errors)
    • job 193726 # Command: qvm-run -ap whonix-gateway-18 'LC_ALL=C whonixcheck --v...
  • system_tests_gui_interactive@hw7

    clipboard_and_web/ (1/5 times with errors)
    clipboard_and_web/Failed (1/5 times with errors)
    • job 193803 # Test died: no candidate needle with tag(s) 'clipboard-paste-notif...
    gui_keyboard_layout/Failed (1/5 times with errors)
    • job 193752 # Test died: command 'qvm-run -pu root work systemctl --wait is-sys...
  • system_tests_audio@hw1

    system_tests/Fail (1/5 times with errors)
    • job 192976 Tests qubes.tests.integ.audio failed (exit code 1), details reporte...
    system_tests/Failed (1/5 times with errors)
    • job 192976 # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...
    TC_20_AudioVM_Pulse_whonix-workstation-18/test_220_audio_play_pulseaudio (1/5 times with errors)
    • job 192976 AssertionError: too short audio, expected 10s, got 9.49, saved to /...
    TC_20_AudioVM_Pulse_whonix-workstation-18/test_222_audio_rec_unmuted_pulseaudio (1/5 times with errors)
    • job 192976 AssertionError: too short audio, expected 10s, got 9.05251700680272...
    TC_20_AudioVM_PipeWire_whonix-workstation-18/test_226_audio_playback_pipewire (1/5 times with errors)
    • job 192976 AssertionError: too short audio, expected 10s, got 8.97385487528344...

Performance Tests

Performance degradation:

19 performance degradations
  • whonix-gateway-18_exec-root: 146.66 🔻 ( previous job: 126.14, degradation: 116.26%)
  • whonix-gateway-18_socket: 10.67 🔻 ( previous job: 8.63, degradation: 123.65%)
  • whonix-gateway-18_socket-root: 10.55 🔻 ( previous job: 8.37, degradation: 126.06%)
  • whonix-gateway-18_socket-data-duplex: 115.84 🔻 ( previous job: 90.03, degradation: 128.67%)
  • whonix-workstation-18_exec-root: 162.64 🔻 ( previous job: 144.02, degradation: 112.93%)
  • whonix-workstation-18_exec-data-duplex-root: 158.36 🔻 ( previous job: 130.67, degradation: 121.19%)
  • dom0_root_seq1m_q1t1_write 3:write_bandwidth_kb: 159488.00 🔻 ( previous job: 199974.00, degradation: 79.75%)
  • dom0_varlibqubes_seq1m_q8t1_read 3:read_bandwidth_kb: 376643.00 🔻 ( previous job: 429040.00, degradation: 87.79%)
  • dom0_varlibqubes_rnd4k_q32t1_read 3:read_bandwidth_kb: 25601.00 🔻 ( previous job: 102155.00, degradation: 25.06%)
  • dom0_varlibqubes_rnd4k_q1t1_write 3:write_bandwidth_kb: 3916.00 🔻 ( previous job: 4404.00, degradation: 88.92%)
  • debian-13-xfce_dom0-dispvm-gui-api (mean:8.639): 103.66 🔻 ( previous job: 93.50, degradation: 110.87%)
  • debian-13-xfce_dom0-dispvm-preload-4-delay-0-api (mean:2.716): 32.59 🔻 ( previous job: 29.50, degradation: 110.49%)
  • debian-13-xfce_dom0-dispvm-preload-2-gui-api (mean:4.937): 59.25 🔻 ( previous job: 53.65, degradation: 110.43%)
  • whonix-workstation-18_dom0-dispvm-api (mean:9.768): 117.22 🔻 ( previous job: 97.14, degradation: 120.67%)
  • whonix-workstation-18_dom0-dispvm-gui-api (mean:11.537): 138.44 🔻 ( previous job: 121.86, degradation: 113.61%)
  • whonix-workstation-18_dom0-dispvm-preload-2-api (mean:4.801): 57.62 🔻 ( previous job: 48.39, degradation: 119.07%)
  • whonix-workstation-18_dom0-dispvm-preload-2-delay-0-api (mean:4.447): 53.37 🔻 ( previous job: 48.26, degradation: 110.57%)
  • whonix-workstation-18_dom0-dispvm-preload-4-gui-api (mean:4.848): 58.18 🔻 ( previous job: 52.81, degradation: 110.16%)
  • whonix-workstation-18_dom0-vm-api (mean:0.041): 0.49 🔻 ( previous job: 0.43, degradation: 113.16%)

Remaining performance tests:

92 tests
  • debian-13-xfce_exec: 8.47 🔻 ( previous job: 7.85, degradation: 107.87%)
  • debian-13-xfce_exec-root: 26.99 🔻 ( previous job: 26.74, degradation: 100.93%)
  • debian-13-xfce_socket: 9.16 🔻 ( previous job: 8.37, degradation: 109.47%)
  • debian-13-xfce_socket-root: 9.45 🔻 ( previous job: 9.13, degradation: 103.58%)
  • debian-13-xfce_exec-data-simplex: 67.56 🔻 ( previous job: 63.05, degradation: 107.15%)
  • debian-13-xfce_exec-data-duplex: 66.96 🔻 ( previous job: 62.45, degradation: 107.22%)
  • debian-13-xfce_exec-data-duplex-root: 79.39 🔻 ( previous job: 78.04, degradation: 101.73%)
  • debian-13-xfce_socket-data-duplex: 79.81 🟢 ( previous job: 85.67, improvement: 93.17%)
  • fedora-44-xfce_exec: 9.27
  • fedora-44-xfce_exec-root: 71.41
  • fedora-44-xfce_socket: 8.19
  • fedora-44-xfce_socket-root: 8.58
  • fedora-44-xfce_exec-data-simplex: 71.47
  • fedora-44-xfce_exec-data-duplex: 70.64
  • fedora-44-xfce_exec-data-duplex-root: 111.57
  • fedora-44-xfce_socket-data-duplex: 91.49
  • whonix-gateway-18_exec: 7.38 🟢 ( previous job: 8.01, improvement: 92.20%)
  • whonix-gateway-18_exec-data-simplex: 66.81 🔻 ( previous job: 62.50, degradation: 106.90%)
  • whonix-gateway-18_exec-data-duplex: 69.57 🔻 ( previous job: 68.01, degradation: 102.30%)
  • whonix-gateway-18_exec-data-duplex-root: 146.58 🔻 ( previous job: 137.28, degradation: 106.77%)
  • whonix-workstation-18_exec: 8.45 🔻 ( previous job: 8.14, degradation: 103.80%)
  • whonix-workstation-18_socket: 8.32 🔻 ( previous job: 7.66, degradation: 108.58%)
  • whonix-workstation-18_socket-root: 9.07 🔻 ( previous job: 8.87, degradation: 102.29%)
  • whonix-workstation-18_exec-data-simplex: 67.57 🔻 ( previous job: 66.36, degradation: 101.83%)
  • whonix-workstation-18_exec-data-duplex: 72.05 🔻 ( previous job: 65.56, degradation: 109.91%)
  • whonix-workstation-18_socket-data-duplex: 87.91 🟢 ( previous job: 92.97, improvement: 94.55%)
  • dom0_root_seq1m_q8t1_read 3:read_bandwidth_kb: 410723.00 🟢 ( previous job: 388793.00, improvement: 105.64%)
  • dom0_root_seq1m_q8t1_write 3:write_bandwidth_kb: 250316.00 🟢 ( previous job: 119690.00, improvement: 209.14%)
  • dom0_root_seq1m_q1t1_read 3:read_bandwidth_kb: 432402.00 🟢 ( previous job: 245223.00, improvement: 176.33%)
  • dom0_root_rnd4k_q32t1_read 3:read_bandwidth_kb: 107046.00 🟢 ( previous job: 13948.00, improvement: 767.46%)
  • dom0_root_rnd4k_q32t1_write 3:write_bandwidth_kb: 9847.00 🟢 ( previous job: 6899.00, improvement: 142.73%)
  • dom0_root_rnd4k_q1t1_read 3:read_bandwidth_kb: 8543.00 🔻 ( previous job: 8963.00, degradation: 95.31%)
  • dom0_root_rnd4k_q1t1_write 3:write_bandwidth_kb: 4811.00 🔻 ( previous job: 5055.00, degradation: 95.17%)
  • dom0_varlibqubes_seq1m_q8t1_write 3:write_bandwidth_kb: 317269.00 🟢 ( previous job: 257066.00, improvement: 123.42%)
  • dom0_varlibqubes_seq1m_q1t1_read 3:read_bandwidth_kb: 437271.00 🔻 ( previous job: 446202.00, degradation: 98.00%)
  • dom0_varlibqubes_seq1m_q1t1_write 3:write_bandwidth_kb: 190288.00 🔻 ( previous job: 201978.00, degradation: 94.21%)
  • dom0_varlibqubes_rnd4k_q32t1_write 3:write_bandwidth_kb: 10342.00 🔻 ( previous job: 10623.00, degradation: 97.35%)
  • dom0_varlibqubes_rnd4k_q1t1_read 3:read_bandwidth_kb: 7699.00 🔻 ( previous job: 8179.00, degradation: 94.13%)
  • fedora-44-xfce_root_seq1m_q8t1_read 3:read_bandwidth_kb: 394498.00
  • fedora-44-xfce_root_seq1m_q8t1_write 3:write_bandwidth_kb: 150403.00
  • fedora-44-xfce_root_seq1m_q1t1_read 3:read_bandwidth_kb: 285094.00
  • fedora-44-xfce_root_seq1m_q1t1_write 3:write_bandwidth_kb: 37232.00
  • fedora-44-xfce_root_rnd4k_q32t1_read 3:read_bandwidth_kb: 71238.00
  • fedora-44-xfce_root_rnd4k_q32t1_write 3:write_bandwidth_kb: 2561.00
  • fedora-44-xfce_root_rnd4k_q1t1_read 3:read_bandwidth_kb: 8830.00
  • fedora-44-xfce_root_rnd4k_q1t1_write 3:write_bandwidth_kb: 362.00
  • fedora-44-xfce_private_seq1m_q8t1_read 3:read_bandwidth_kb: 384093.00
  • fedora-44-xfce_private_seq1m_q8t1_write 3:write_bandwidth_kb: 164194.00
  • fedora-44-xfce_private_seq1m_q1t1_read 3:read_bandwidth_kb: 259999.00
  • fedora-44-xfce_private_seq1m_q1t1_write 3:write_bandwidth_kb: 44565.00
  • fedora-44-xfce_private_rnd4k_q32t1_read 3:read_bandwidth_kb: 93144.00
  • fedora-44-xfce_private_rnd4k_q32t1_write 3:write_bandwidth_kb: 2311.00
  • fedora-44-xfce_private_rnd4k_q1t1_read 3:read_bandwidth_kb: 8819.00
  • fedora-44-xfce_private_rnd4k_q1t1_write 3:write_bandwidth_kb: 301.00
  • fedora-44-xfce_volatile_seq1m_q8t1_read 3:read_bandwidth_kb: 320763.00
  • fedora-44-xfce_volatile_seq1m_q8t1_write 3:write_bandwidth_kb: 61116.00
  • fedora-44-xfce_volatile_seq1m_q1t1_read 3:read_bandwidth_kb: 342559.00
  • fedora-44-xfce_volatile_seq1m_q1t1_write 3:write_bandwidth_kb: 16398.00
  • fedora-44-xfce_volatile_rnd4k_q32t1_read 3:read_bandwidth_kb: 78674.00
  • fedora-44-xfce_volatile_rnd4k_q32t1_write 3:write_bandwidth_kb: 1784.00
  • fedora-44-xfce_volatile_rnd4k_q1t1_read 3:read_bandwidth_kb: 8690.00
  • fedora-44-xfce_volatile_rnd4k_q1t1_write 3:write_bandwidth_kb: 1624.00
  • debian-13-xfce_dom0-dispvm-api (mean:6.549): 78.59 🔻 ( previous job: 74.50, degradation: 105.49%)
  • debian-13-xfce_dom0-dispvm-preload-2-api (mean:3.401): 40.81 🔻 ( previous job: 37.79, degradation: 107.99%)
  • debian-13-xfce_dom0-dispvm-preload-2-delay-0-api (mean:3.086): 37.03 🔻 ( previous job: 34.29, degradation: 108.00%)
  • debian-13-xfce_dom0-dispvm-preload-2-delay-minus-1d2-api (mean:3.5): 42.00 🔻 ( previous job: 38.52, degradation: 109.04%)
  • debian-13-xfce_dom0-dispvm-preload-4-api (mean:2.545): 30.54 🟢 ( previous job: 30.73, improvement: 99.36%)
  • debian-13-xfce_dom0-dispvm-preload-4-delay-minus-1d2-api (mean:2.544): 30.53 🔻 ( previous job: 28.74, degradation: 106.22%)
  • debian-13-xfce_dom0-dispvm-preload-4-gui-api (mean:3.931): 47.17 🔻 ( previous job: 44.40, degradation: 106.24%)
  • debian-13-xfce_dom0-dispvm-preload-6-gui-api (mean:3.408): 40.89 🟢 ( previous job: 41.47, improvement: 98.61%)
  • debian-13-xfce_dom0-vm-api (mean:0.027): 0.33 🟢 ( previous job: 0.62, improvement: 52.90%)
  • debian-13-xfce_dom0-vm-gui-api (mean:0.031): 0.37 🟢 ( previous job: 0.47, improvement: 78.92%)
  • fedora-44-xfce_dom0-dispvm-api (mean:8.349): 100.19
  • fedora-44-xfce_dom0-dispvm-gui-api (mean:10.178): 122.14
  • fedora-44-xfce_dom0-dispvm-preload-2-api (mean:3.806): 45.68
  • fedora-44-xfce_dom0-dispvm-preload-2-delay-0-api (mean:3.899): 46.78
  • fedora-44-xfce_dom0-dispvm-preload-2-delay-minus-1d2-api (mean:4.06): 48.72
  • fedora-44-xfce_dom0-dispvm-preload-4-api (mean:2.927): 35.13
  • fedora-44-xfce_dom0-dispvm-preload-4-delay-0-api (mean:2.844): 34.13
  • fedora-44-xfce_dom0-dispvm-preload-4-delay-minus-1d2-api (mean:3.302): 39.63
  • fedora-44-xfce_dom0-dispvm-preload-2-gui-api (mean:5.094): 61.12
  • fedora-44-xfce_dom0-dispvm-preload-4-gui-api (mean:4.218): 50.61
  • fedora-44-xfce_dom0-dispvm-preload-6-gui-api (mean:3.75): 45.00
  • fedora-44-xfce_dom0-vm-api (mean:0.042): 0.50
  • fedora-44-xfce_dom0-vm-gui-api (mean:0.041): 0.49
  • whonix-workstation-18_dom0-dispvm-preload-2-delay-minus-1d2-api (mean:5.005): 60.06 🔻 ( previous job: 59.22, degradation: 101.43%)
  • whonix-workstation-18_dom0-dispvm-preload-4-api (mean:3.456): 41.48 🔻 ( previous job: 38.29, degradation: 108.33%)
  • whonix-workstation-18_dom0-dispvm-preload-4-delay-0-api (mean:3.415): 40.98 🟢 ( previous job: 43.23, improvement: 94.78%)
  • whonix-workstation-18_dom0-dispvm-preload-4-delay-minus-1d2-api (mean:3.703): 44.43 🔻 ( previous job: 42.67, degradation: 104.14%)
  • whonix-workstation-18_dom0-dispvm-preload-2-gui-api (mean:6.43): 77.17 🔻 ( previous job: 72.05, degradation: 107.10%)
  • whonix-workstation-18_dom0-dispvm-preload-6-gui-api (mean:4.168): 50.02 🟢 ( previous job: 50.72, improvement: 98.62%)
  • whonix-workstation-18_dom0-vm-gui-api (mean:0.025): 0.30 🟢 ( previous job: 0.56, improvement: 53.78%)

ben-grande added a commit to ben-grande/qubes-core-admin-addon-kicksecure that referenced this pull request Aug 19, 2026
With the introduction of deferred templates, the "active_template"
should be preferred in favor of the "template" property.

For: QubesOS/qubes-issues#8070
Requires: QubesOS/qubes-core-admin#870
ben-grande added a commit to ben-grande/qubes-core-admin-addon-whonix that referenced this pull request Aug 19, 2026
With the introduction of deferred templates, the "active_template"
should be preferred in favor of the "template" property.

For: QubesOS/qubes-issues#8070
Requires: QubesOS/qubes-core-admin#870
ben-grande added a commit to ben-grande/qubes-manager that referenced this pull request Aug 19, 2026
With a server that supports deferred template, clients don't need to
worry about the qube state to block template change, in this case, there
were only things to remove, as showing "active_template" is irrelevant
here, the user just wants to change the "template" property to a new
value.

For: QubesOS/qubes-issues#8070
Requires: QubesOS/qubes-core-admin#870
Requires: QubesOS/qubes-core-admin-client#496
Add ability for template based qubes (AppVM and DispVM) to be able to change
the template while running. When the qube is running and you modify the
"template" property, it is set to the "newvalue", while the "active_template"
changes to the "oldvalue" if it is still the default.

The use of separate properties doesn't break new clients. For example, Qube
Manager reacts to "property-set:template" and adapts the field to the current
value, despite it not being the active one. This is what happens for other
properties also, such as "virt_mode" and "kernel", you may change it live, but
it only applies on the next boot.

Fixes: QubesOS/qubes-issues#8070
Until the template has changed, querying features from the active
template is saner, as the qube has the volume from the template, and
that affects many calls, such as "vmexec", "supported-rpc.*",
"os-version" and many others.

Having the option to disable query of "active_template" and go straight
to "template" is necessary when when want values that would only be
relevant on the next boot.
@ben-grande

ben-grande commented Aug 19, 2026

Copy link
Copy Markdown
Contributor Author

https://openqa.qubes-os.org/tests/192952#step/TC_00_Basic/19

system_tests_basic_vm_qrexec_gui_btrfs

# test_300_deferred_template
# failure: 

# timestamp 2026-08-19T15:29:38.593611
Traceback (most recent call last):
  File "/usr/lib64/python3.13/contextlib.py", line 85, in inner
    return func(*args, **kwds)
  File "/usr/lib/python3.13/site-packages/qubes/tests/integ/basic.py", line 590, in test_300_deferred_template
    self.loop.run_until_complete(self._test_300_deferred_template())
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib64/python3.13/asyncio/base_events.py", line 725, in run_until_complete
    return future.result()
           ~~~~~~~~~~~~~^^
  File "/usr/lib/python3.13/site-packages/qubes/tests/integ/basic.py", line 600, in _test_300_deferred_template
    await self.defer_tpl(appvm)
  File "/usr/lib/python3.13/site-packages/qubes/tests/__init__.py", line 1790, in defer_tpl
    check_deferred(qube, active=template, deferred=template)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/qubes/tests/__init__.py", line 1770, in check_deferred
    self.assertEqual(get_tpl_vol_vid(qube), get_tpl_vol_path(active))
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 'fedora-44-xfce-pool/root' != 'vm-fedora-44-xfce-pool-root'
- fedora-44-xfce-pool/root
?                    ^
+ vm-fedora-44-xfce-pool-root
? +++                   ^

Different fs are having different names here... I need to compare the volume vid and the path differently...

@ben-grande

Copy link
Copy Markdown
Contributor Author
    self.assertEqual(get_tpl_vol_vid(qube), get_tpl_vol_path(active))
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 'fedora-44-xfce-pool/root' != 'vm-fedora-44-xfce-pool-root'
- fedora-44-xfce-pool/root
?                    ^
+ vm-fedora-44-xfce-pool-root
? +++                   ^

I didn't find an easy way to compare. Technically, each pool type should have the same method to query it's format, by providing the qube name and volume name, and then it returns the volume string. I also noticed the pools are switched by OpenQA, so there isn't a test doing that that I can run locally, well, I could copy the whole pool switch code... I ended up checking each pool volume format, and just ThinPool for LVM uses a certain format with - while the others use /.

@ben-grande

Copy link
Copy Markdown
Contributor Author

openQArun PR_LABEL=openqa-group-2

@marmarek

Copy link
Copy Markdown
Member

Can't you simply take properties of relevant volume objects instead of building the id manually?

@ben-grande

Copy link
Copy Markdown
Contributor Author

openQArun PR_LABEL=openqa-group-2

ben-grande added a commit to ben-grande/qubes-core-admin-addon-whonix that referenced this pull request Aug 22, 2026
With the introduction of deferred templates, the "active_template"
should be preferred in favor of the "template" property.

For: QubesOS/qubes-issues#8070
Requires: QubesOS/qubes-core-admin#870
ben-grande added a commit to ben-grande/qubes-core-admin-addon-kicksecure that referenced this pull request Aug 22, 2026
With the introduction of deferred templates, the "active_template"
should be preferred in favor of the "template" property.

For: QubesOS/qubes-issues#8070
Requires: QubesOS/qubes-core-admin#870
ben-grande added a commit to ben-grande/qubes-core-admin-addon-whonix that referenced this pull request Aug 22, 2026
With the introduction of deferred templates, the "active_template"
should be preferred in favor of the "template" property.

For: QubesOS/qubes-issues#8070
Requires: QubesOS/qubes-core-admin#870
ben-grande added a commit to ben-grande/qubes-core-admin-addon-kicksecure that referenced this pull request Aug 22, 2026
With the introduction of deferred templates, the "active_template"
should be preferred in favor of the "template" property.

For: QubesOS/qubes-issues#8070
Requires: QubesOS/qubes-core-admin#870
ben-grande added a commit to ben-grande/qubes-core-admin-addon-whonix that referenced this pull request Aug 22, 2026
With the introduction of deferred templates, the "active_template"
should be preferred in favor of the "template" property.

For: QubesOS/qubes-issues#8070
Requires: QubesOS/qubes-core-admin#870
ben-grande added a commit to ben-grande/qubes-core-admin-addon-whonix that referenced this pull request Aug 22, 2026
With the introduction of deferred templates, the "active_template"
should be preferred in favor of the "template" property.

For: QubesOS/qubes-issues#8070
Requires: QubesOS/qubes-core-admin#870
ben-grande added a commit to ben-grande/qubes-core-admin-addon-whonix that referenced this pull request Aug 22, 2026
With the introduction of deferred templates, the "active_template"
should be preferred in favor of the "template" property.

For: QubesOS/qubes-issues#8070
Requires: QubesOS/qubes-core-admin#870
@ben-grande

Copy link
Copy Markdown
Contributor Author

openQArun PR_LABEL=openqa-group-2

@ben-grande

Copy link
Copy Markdown
Contributor Author

@ben-grande

Copy link
Copy Markdown
Contributor Author

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Allow deferred template changes

3 participants