fix(argo): give container QA targets uinput access and setuptools - #619
Merged
Conversation
Two environment gaps surfaced once the headless drop-in let GNOME container lanes actually execute scenarios. /dev/uinput: podman gives the nested target its own tmpfs /dev -- a different device and inode from both the pod's and the node's -- and materializes the uinput node there as mode 0600 root:root with no group at all. Adding bluefin-test to `input` therefore could never grant access, and every dogtail/qecore key-combo step aborted with "does not have write permissions for '/dev/uinput'". Because the node is lane-local, chgrp'ing it to the target's own `input` group and setting 0660 is both sufficient and safe: it cannot affect concurrent lanes or ghost itself. pkg_resources: qecore's Sandbox._attach_version_status_to_report() imports pkg_resources from its after_scenario hook. That module ships only with setuptools, was removed in setuptools 81, and is no longer seeded into fresh Python 3.12+ environments, so every scenario emitted a ModuleNotFoundError traceback. @non_critical_execution swallows it, so this cost the HTML report's version table and buried real errors in noise rather than failing scenarios -- pin setuptools<81 alongside qecore for as long as qecore imports it. Also record a bounded environment snapshot before behave runs. Container lanes are only observable through Argo logs, and the facts that explain most environment failures -- whether the shell inherited --unsafe-mode, whether uinput is reachable, which desktop apps exist -- were previously only obtainable by exec'ing into a live lane. Assisted-by: Claude Opus 5 via GitHub Copilot CLI Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two nested-target environment gaps that only became visible once the headless
GNOME Shell drop-in (#614/#615) let container QA lanes execute scenarios at all.
/dev/uinput— 7 scenario failuresdogtail/qecoresynthesise key combos through/dev/uinputand were aborting with:Verified live inside lane
testsuite-738-…-zqkdc(the lane that produced thetriage evidence):
/etc/groupis not corrupt —video,renderandinputall resolve and alllist
bluefin-test. The node simply has mode0600 root:rootand no group, sogroup membership can never grant access.
/devis also not shared with the node — podman gives the target its own tmpfs:Because the node is lane-local,
chgrp input /dev/uinput && chmod 0660 /dev/uinputis both sufficient and safe: it cannot affect a concurrent lane or ghost itself.
pkg_resources— 124 log occurrencesTraced to a single call site:
pkg_resourcesships only with setuptools, was removed in setuptools 81, and is nolonger seeded into fresh Python 3.12+ environments.
Honest scoping: that method is decorated
@non_critical_execution(
qecore/utility.py:37), which catches the exception and embeds it. So these 124occurrences are lost version reporting and log noise, not scenario failures —
fixing it will not by itself move the pass tally. It is still worth fixing: it
restores the HTML report's version table and stops burying real errors under ~600
lines of traceback.
Environment snapshot
Container lanes are only observable through Argo logs. Every fact needed to triage
this batch (shell cmdline, uinput mode, app presence) required exec'ing into a live
lane. A bounded, non-fatal snapshot now runs before behave.
Explicitly not changed
--unsafe-moderegression. Verified on a live lane:/usr/bin/gnome-shell --mode=user --unsafe-mode --headless --virtual-monitor 1920x1080and
gdbus … org.gnome.Shell.Eval "global.context.unsafe_mode.toString()"→(true, '"true"'). TheShell.Eval … failed (rc=1)errors are transient gdbusfailures in testsuite step helpers, not a drop-in defect.
Created gbm renderer for '/dev/dri/renderD128'— a real render node. TheNo software rendering fallback (LLVMpipe)scenario stays semantically valid.@vm_only).Settings not found via AT-SPIis not an infrastructure gap:gnome-control-center-50.3-1.fc44is installed and launches under the sessionenvironment. Left for separate testsuite-side investigation rather than guessed at.
Validation
just lint✅bash -nclean on both the outer script and the extractedNESTED_SETUPbody ✅kubectl apply --dry-run=server✅python3 -m pytest tests/unit/ -q— only the 6 pre-existing failures on cleanmain(
test_bst_poller_admission, 3×test_recc_runner_seam,test_zot_cache_policy,test_page_dataset_collector; the last confirmed pre-existing by stashing this diff)The
NESTED_SETUPquoted heredoc is untouched; nobash -c '…'was introduced.Assisted-by: Claude Opus 5 via GitHub Copilot CLI