openSUSE Project Management Tool: Issueshttps://progress.opensuse.org/https://progress.opensuse.org/themes/openSUSE/favicon/favicon.ico?15829177842021-10-25T13:29:26ZopenSUSE Project Management Tool
Redmine openQA Project - action #101457 (New): Native per-module bug tagshttps://progress.opensuse.org/issues/1014572021-10-25T13:29:26Zrpalethorperichard.palethorpe@suse.com
<a name="Motivation"></a>
<h1 >Motivation<a href="#Motivation" class="wiki-anchor">¶</a></h1>
<p>We need to tag individual modules (e.g. LTP tests) within a job. Presently we (kernel qa) do this within job comments using syntax like "test123: bug#123". This requires parsing job comments.</p>
<p>Other teams have different solutions, like parsing external YAML files and marking individual modules as soft-failed.</p>
<p>Providing a single structured data source in OpenQA will simplify reporting and bug tag propagation.</p>
<a name="Goal"></a>
<h1 >Goal<a href="#Goal" class="wiki-anchor">¶</a></h1>
<p>Provide simple interface through OpenQA to:</p>
<ul>
<li>assign a bug to a job module</li>
<li>query the bug assigned to a job module</li>
<li>remove a bug from a job module</li>
</ul>
<p>I think a single reference to one bug tracker is sufficient. Related items in other trackers can be handled by one external tracker (e.g. Redmine).</p>
<a name="Non-Goals"></a>
<h1 >Non-Goals<a href="#Non-Goals" class="wiki-anchor">¶</a></h1>
<ul>
<li>Propagate bugs from one build to the next</li>
<li>Notifications or reporting</li>
</ul>
<a name="Alternatives"></a>
<h1 >Alternatives<a href="#Alternatives" class="wiki-anchor">¶</a></h1>
<ul>
<li>External service and database (e.g <a href="https://gitlab.suse.de/kernel-qa/bugtags" class="external">https://gitlab.suse.de/kernel-qa/bugtags</a>)</li>
</ul>
openQA Project - action #53891 (Resolved): [openqa] Posting comments results in getting comments ...https://progress.opensuse.org/issues/538912019-07-05T09:22:17Zrpalethorperichard.palethorpe@suse.com
<p>Take the following:</p>
<p>rich@rpws ~> openqa-client --host openqa.opensuse.org --apikey CB3705D3354546E0 --apisecret XXX jobs/975114/comments POST text=test123<br>
[<br>
{<br>
bugrefs => [],<br>
created => "2019-07-05 08:15:47 +0000",<br>
id => 43271,<br>
renderedMarkdown => "update comment test\n",<br>
text => "update comment test",<br>
updated => "2019-07-05 08:45:11 +0000",<br>
userName => "rpalethorpe",<br>
},<br>
]<br>
rich@rpws ~> openqa-client --host <a href="https://openqa.opensuse.org" class="external">https://openqa.opensuse.org</a> --apikey CB3705D3354546E0 --apisecret XXX jobs/975114/comments POST text=test123<br>
{ id => 43287 }</p>
<p>okurz thinks this may be due to <a href="https://github.com/os-autoinst/openQA/pull/2110" class="external">https://github.com/os-autoinst/openQA/pull/2110</a>.</p>
<p>Note that this only happens on O3 and not OSD. I also tried using two different versions of the openqa-client. Also the following works:</p>
<p>openqa-client --host openqa.opensuse.org --apikey CB3705D3354546E0 --apisecret XXX jobs/975114/comments/43271 PUT text="update comment test"<br>
{ id => 43271 }</p>
<p>So the problem maybe only effects POST requests.</p>
openQA Project - action #40538 (Workable): Reset/Clear guest RAM when it reboots in QEMU to reduc...https://progress.opensuse.org/issues/405382018-09-03T14:22:40Zrpalethorperichard.palethorpe@suse.com
<p>During installation 4GB+ of RAM can be used by the guest. Most of the time the RAM usage is much lower than this.</p>
<p>After installation completes the system is rebooted and then a snapshot is taken. In theory the snapshot should be very small because the system has only just booted, however it appears that QEMU thinks all the RAM is still in use and saves it to the snapshot. This might not be unexpected because on bare metal the RAM is preserved between reboots on modern systems. However, assuming that it is not relied upon by the guest OS, we don't need it to happen and can save some time.</p>
<p>Some ideas to solve this:</p>
<ul>
<li>Use the virtio memory balloon</li>
<li>Use the -no-reboot switch and restart the QEMU process if it exits unexpectedly.</li>
<li>Patch QEMU to clear (some of) the RAM when the guest initiates a reboot.</li>
</ul>
openQA Project - action #40520 (New): SKIPTO fails to load snapshotshttps://progress.opensuse.org/issues/405202018-09-03T10:41:57Zrpalethorperichard.palethorpe@suse.com
<p>There appear to be multiple problems with this feature. In particular when using MAKETESTSNAPSHOTS.</p>
<p>Sometimes loading snapshots works as expected, but others it fails with various different error messages. Some of them from QEMU directly and others from the QEMU backend.</p>
<p>One error from the backend is:<br>
DIE Sequence mismatch while loading 'shutdown-shutdown' snapshot state: 30 != 28 at /home/geekotest/os-autoinst/OpenQA/Qemu/SnapshotConf.pm line 102.</p>
<p>Another from QEMU is:<br>
[2018-09-03T10:33:04.0775 CEST] [debug] QEMU: qemu-system-aarch64: Unknown savevm section or instance '0000:00:06.0/virtio-scsi' 0<br>
[2018-09-03T10:33:04.0775 CEST] [debug] QEMU: qemu-system-aarch64: load of migration failed: Invalid argument</p>
<p>Restarting the same job multiple times with SKIPTO seems to increase the chances of a failure.</p>
openQA Project - action #36460 (Resolved): [kernel][tools] QEMU Refactor - Performance settingshttps://progress.opensuse.org/issues/364602018-05-23T14:02:30Zrpalethorperichard.palethorpe@suse.com
<p>Decide on cache mode and 'discard'.</p>
openQA Project - action #35815 (Resolved): [kernel][tools] Refactor QEMU backend - Fix VNC instal...https://progress.opensuse.org/issues/358152018-05-03T10:32:31Zrpalethorperichard.palethorpe@suse.com
<p>It appears that switching to the installation text console is broken with the new version (install-shell) in the logpackages test. Nothing happens when select console is called, it just stays in the graphical shell. However switching to the 'root-console' does work.</p>
openQA Project - action #32968 (Resolved): [kernel][tools] Refactor QEMU backend - Create QEMU pr...https://progress.opensuse.org/issues/329682018-03-09T09:34:47Zrpalethorperichard.palethorpe@suse.com
<p>Start moving the configuration of QEMU to a more abstract model where the parameters are generated from an object model. This should allows parameters to be added and removed between QEMU restarts as well as making the configuration more modular. There are too many parameters to create an object model for in a single refactoring (without breaking the small batch sizes principle), so we can split them into static parameters which are just an array of strings like in the current model and dynamic parameters which are stored as Perl objects and are serialised into parameter strings when required. The ultimate goal is to have an object model which completely decouples configuration from how the parameters are passed to QEMU. And possibly after that we could further generalise the object model between backends to allow some configuration options to be shared between backends. However it may not be necessary to go that far.</p>
<p>This ticket is just for creating the manager class with the static parameters.</p>
openQA Project - action #30649 (Resolved): [tools][openqa] Improve performance by using migration...https://progress.opensuse.org/issues/306492018-01-22T12:20:38Zrpalethorperichard.palethorpe@suse.com
<p>Sometimes snapshots fail to save, see <a href="https://bugzilla.suse.com/show_bug.cgi?id=1035453">https://bugzilla.suse.com/show_bug.cgi?id=1035453</a>. This is of high importance to kernel team because the LTP test runner now makes heavy use of snapshots.</p>
<p>According to the QEMU developers this is because 'internal' snapshots are slow and relatively untested so it is recommended that we use 'external' snapshots combined with the migration functionality[1]. This is currently how libvirt works when taking a snapshot. The downside to this is that it is more complex than simply calling savevm and loadvm.</p>
<p>It makes sense to fix upstream QEMU however this could potentially take a long time[2]. Therefore I think the best thing to do is to first implement a new snapshot method within OpenQA (os-autoinst) then consider making changes to QEMU based on the results. Ideally we want to align OpenQA with the common use case which is being actively maintained.</p>
<p>Alternatively we could convert the QEMU backend to use libvirt (or combine it with the existing virsh backend). However, this only removes some of the complication, but at the same time introduces another layer of indirection. It would be quite a large undertaking so I would put it outside of the scope of this task, at least to begin with.</p>
<p>From what I have seen, the new snapshot process would look something like this:</p>
<ul>
<li>Start QEMU with the deferred migration flag</li>
<li>...Do some work...</li>
<li>Pause the virtual machine</li>
<li>For each block storage device: start an incremental snapshot to an external file</li>
<li>Save the CPU, RAM and other device state by migrating the VM to a file[3]</li>
<li>Unpause the VM</li>
<li>...Continue until something bad happens...</li>
<li>Pause the VM</li>
<li>For each storage device: restore the corresponding snapshot file</li>
<li>Restore the CPU, RAM and other device state by starting an incoming migration</li>
<li>Unpause the VM</li>
</ul>
<p>The details of how to do this should be in the libvirt source. The worst part is migrating to a file which will possibly require passing a file handle to QEMU using SCM rights or opening another socket which it can send the data to.</p>
<p>[1] <a href="https://www.mail-archive.com/qemu-devel@nongnu.org/msg504839.html">https://www.mail-archive.com/qemu-devel@nongnu.org/msg504839.html</a><br>
[2] Ideally we want a clean simple interface which requires little knowledge about QEMU's internal workings. However the QMP interface is necessarily low level which conflicts with ease of use.<br>
[3] Note we are not performing a 'migration', just using the migration command to save the VM's state to a file which could then be used in a real migration. Obviously this does not include the storage device data which is taken care of separately.</p>
openQA Tests - action #19152 (Resolved): [aarch64] handle_uefi_boot_disk_workaround should use AR...https://progress.opensuse.org/issues/191522017-05-12T12:23:03Zrpalethorperichard.palethorpe@suse.com
<p>tests with aarch64-virtio set as the machine can not boot: <a href="https://openqa.suse.de/tests/932275#" class="external">https://openqa.suse.de/tests/932275#</a></p>
<p>probably because of openqabasetest.pm line ~317.</p>
openQA Project - action #18980 (Resolved): [ltp][openqa][virtio][ppc64le] It appears agetty is no...https://progress.opensuse.org/issues/189802017-05-05T13:25:35Zrpalethorperichard.palethorpe@suse.com
<p>Neither os-autoinst or QEMU throw an error when creating a virtio console device, connecting to its socket or sending data. However no I/O is recorded in QEMU's chardev log, nor is anything received from the SUT through the socket. It is a bit strange that not even data sent by os-autoinst is recorded in the log, although it might never log input data, but appears to under normal operation because echo is enabled on the TTY.</p>
<p>Unlike x86, ppc64le already uses /dev/hvc0 (on the SUT) for the regular serial port whereas virtio console would usually be on this device. However this should probably just mean that it uses /dev/hvc1 instead, os-autoinst would have no problem with this. Maybe SLE's systemd is not configured to start agetty on this device or the virtio_console driver works differently on ppc64le. Both seem quite strange.</p>
<p>This might be a product bug, but I need more information from the SUT to decide. It should just work.</p>
<p>UPDATE: for those who are searching here for <strong>OFW</strong>: it's ppc detectioni<br>
<a href="https://github.com/os-autoinst/os-autoinst-distri-opensuse/pull/4477" class="external">https://github.com/os-autoinst/os-autoinst-distri-opensuse/pull/4477</a><br>
(Replace check_var ARCH ppc64le by get_var OFW)</p>
openQA Tests - action #18674 (Resolved): [ltp][openqa] Remove or replace pidstat stuff in install...https://progress.opensuse.org/issues/186742017-04-20T09:46:41Zrpalethorperichard.palethorpe@suse.com
<p>It broke. So , replace with "script_run('(pidstat -p ALL 1 > ... &)'" and "script_run('kill $(ps -C pidstat -o pid --no-headers)'";</p>
<pre><code> ^
/ \
(0.o)
\____|____/
|
#
/
/ \
/ |
d h
</code></pre> openQA Project - action #16320 (Resolved): Random timeouts while waiting for serial output when u...https://progress.opensuse.org/issues/163202017-01-30T11:00:19Zrpalethorperichard.palethorpe@suse.com
<a name="Observation"></a>
<h2 >Observation<a href="#Observation" class="wiki-anchor">¶</a></h2>
<p>Tests timeout while waiting for output from an LTP test: <a href="https://openqa.suse.de/tests/743383" class="external">https://openqa.suse.de/tests/743383</a>.</p>
<p>It appears that the command text is sent to the SUT, but no response is received. In the serial log[1] for the above test it shows that the last test ran and returned a result. However nothing is read by the virtio console backend.</p>
<p>In this test: <a href="https://openqa.opensuse.org/tests/342884" class="external">https://openqa.opensuse.org/tests/342884</a> [2], one call to <code>wait_serial</code> fails, but then the next succeeds and then it fails again. The calls which pass do not use regular expressions to do the matching.</p>
<p>As a rough estimate this bug occurs in 1%-5% of tests.</p>
<a name="Problem"></a>
<h2 >Problem<a href="#Problem" class="wiki-anchor">¶</a></h2>
<ul>
<li>H1, QEMU is writing bytes to the log, but not the socket</li>
<li>H2, The virtio backend function <code>read_until</code> is not reading bytes from the socket correctly</li>
<li>H3, One or more of the read buffers in <code>read_until</code> are being dropped.</li>
</ul>
<a name="Suggestions"></a>
<h2 >Suggestions<a href="#Suggestions" class="wiki-anchor">¶</a></h2>
<ul>
<li>A0, Inspect more test failures.</li>
<li>A1, Run the virtio terminal unit tests repeatedly.</li>
<li>A2, Modify the virtio test module to perform a stress test.</li>
<li>A3, Investigate how QEMU passes the data.</li>
</ul>
<p>I am currently waiting for a crash dump of the SUT to be attempted after a freeze.</p>
<a name="workaround"></a>
<h2 >workaround<a href="#workaround" class="wiki-anchor">¶</a></h2>
<ul>
<li>W0, Retrigger the job manually.</li>
<li>W1, Retrigger the job automatically after a timeout.</li>
</ul>
<p>[1] The serial log is written by QEMU.<br>
[2] There is no virtio serial log for this test, possibly O3 needs updating.</p>
openQA Tests - action #15678 (Resolved): [LTP][OpenQA] misc: acpi_test_dev_callback failshttps://progress.opensuse.org/issues/156782016-12-29T09:16:53Zrpalethorperichard.palethorpe@suse.com
<p>The ltp_acpi tests fails when running a test inside the ltp_acpi_cmds kernel module called acpi_test_dev_callback.</p>
<p><a href="https://openqa.suse.de/tests/686455#step/run_ltp/45" class="external">https://openqa.suse.de/tests/686455#step/run_ltp/45</a></p>
openQA Tests - action #15626 (Resolved): [LTP][OpenQA] commands: du -a test failshttps://progress.opensuse.org/issues/156262016-12-22T12:46:21Zrpalethorperichard.palethorpe@suse.com
<p><a href="https://openqa.suse.de/tests/686450#step/run_ltp/111" class="external">https://openqa.suse.de/tests/686450#step/run_ltp/111</a></p>
openQA Project - coordination #14626 (New): [epic] backend and console capabilities interface to ...https://progress.opensuse.org/issues/146262016-11-03T13:28:48Zrpalethorperichard.palethorpe@suse.com
<a name="Motivation"></a>
<h2 >Motivation<a href="#Motivation" class="wiki-anchor">¶</a></h2>
<p>Prevent "if/else" in tests needing to distinguish different backends</p>
<a name="Acceptance-criteria"></a>
<h2 >Acceptance criteria<a href="#Acceptance-criteria" class="wiki-anchor">¶</a></h2>
<ul>
<li><strong>AC1:</strong> No obvious "if/else" for different types of consoles in os-autoinst-distri-opensuse are necessary anymore</li>
<li><strong>AC2:</strong> Same as <em>AC1</em> for different <em>backends</em></li>
</ul>
<a name="Suggestions"></a>
<h2 >Suggestions<a href="#Suggestions" class="wiki-anchor">¶</a></h2>
<ul>
<li>Read what had been done in <a href="https://github.com/os-autoinst/os-autoinst/pull/1232">https://github.com/os-autoinst/os-autoinst/pull/1232</a> and <a href="https://github.com/os-autoinst/os-autoinst-distri-opensuse/pull/8718">https://github.com/os-autoinst/os-autoinst-distri-opensuse/pull/8718</a> to define "persistent" consoles</li>
<li>Incorporate content from <a href="https://github.com/os-autoinst/os-autoinst-distri-opensuse/blob/master/lib/Utils/Backends.pm">https://github.com/os-autoinst/os-autoinst-distri-opensuse/blob/master/lib/Utils/Backends.pm</a> into os-autoinst as flags on backends rather than if/else in test code</li>
<li>Look for other "if/else" code in test distributions, e.g. os-autoinst-distri-opensuse", distinguishing different backends and consoles to provide as capabilities on backends/consoles</li>
</ul>
<a name="Further-details"></a>
<h2 >Further details<a href="#Further-details" class="wiki-anchor">¶</a></h2>
<a name="Background"></a>
<h3 >Background<a href="#Background" class="wiki-anchor">¶</a></h3>
<p>In an ideal world all the backends (QEMU, bare metal, Xen) and consoles (VNC, serial or hybrid) would be accessed in a uniform manner by testapi so that the distribution and test writers could write their test case once and then have it run across all available platforms without modification. In practice however different Operating systems, hardware, hypervisors and console combinations differ significantly enough in behaviour that a completely uniform API is not possible without either significantly disadvantaging some platforms or providing support for edge cases in the distribution itself.</p>
<p>While the functions in testapi can be kept mostly uniform in availability and behaviour it requires that the distribution handles changes in the Operating System's behaviour due to the machine (virtual or physical) which it is running on and what user interface (console) is selected. Many things can be abstracted away into the console or backend classes in os-autoinst, however OS specific behaviour can not be without making os-autoinst specific to one type of OS or even Linux distribution. Currently the SUSE os-autoinst distribution handles differences between backends by reading variables to determine which backend or architecture is being used in a variety of different places and performing some particular action for that backend. Unfortunately this doesn't just happen in (suse)distribution.pm or other modules in the lib folder, but throughout the test cases.</p>
<p>The problem with branching on a particular architecture or backend is that the contents of the branch statement may actually apply to a whole class of backends not just one. Thus by restricting it to one particular backend you have missed an opportunity to maximise the benefit of your code, which will lead to duplication of effort. However in some cases it may be wasted effort to try inventing general abstractions when they will only be used in one or two instances, but then that is a universal problem, we just have to make a judgement on each and every case.</p>
<a name="Proposal"></a>
<h3 >Proposal<a href="#Proposal" class="wiki-anchor">¶</a></h3>
<p>At any rate my proposal is to introduce the notion of capabilities which can apply to consoles or backends. Any console or backend should have to declare its capabilities in a standard way which can then be read by the distribution and in some very rare cases, the distribution's test modules. Capabilities should be validated against a central list in the appropriate base class, attempting to access or set a capability which does not exist should be an error. This should make them better structured than simply adding more global variables which already serve this purpose to some extent. A list of quirks could also be maintained to indicate negative platform attributes.</p>
<p>The actual implementation could be done using a Perl map, object mixins from some Perl OO library or something else.</p>
<a name="Further-rambling"></a>
<h3 >Further rambling<a href="#Further-rambling" class="wiki-anchor">¶</a></h3>
<p>In the case of the serial terminal feature, I would remove the new testapi function I have added called is_serial_terminal and instead replace it with one or more console/backend capabilities. Perhaps something like <code>direct_read_text</code> and <code>direct_write_text</code> which indicates to the distribution that we are reading and writing raw text to the terminal, the backend would of course require a serial port capability to activate the console. The Linux VNC text console would have something like <code>redirect_write_text</code> which indicates we can redirect output to the serial port and some other capabilities to indicate that we can use needles and send key presses. Any console on some other OS/hardware combo which doesn't support serial ports will be missing the capabilities which indicate we can do this so either <code>run_script</code> and <code>wait_serial</code> will return an error indicating the missing capability or the distribution will have to implement the testapi functions using some other capabilities or workarounds.</p>
<p>Along with having capabilities comes the idea of having interfaces to take advantage of them, so that a backend, console and distribution with compatible capabilities can be plugged together. Such interfaces and their associated capabilities can be invented and implemented on a rolling basis rather than attempting to do some massive overhaul of the code base. This may slow down feature development for some time, but will eventually speed it up and creates a basis for a backend/console plugin architecture. I am willing to implement this in so far that it is required for <a class="issue tracker-4 status-3 priority-5 priority-high3 closed" title="action: Add virtio serial console backend and API (Resolved)" href="https://progress.opensuse.org/issues/14582">#14582</a> and other platform specific features I think that the LTP, and other test suites I may work with, can take advantage of.</p>
<a name="Alternatives"></a>
<h3 >Alternatives<a href="#Alternatives" class="wiki-anchor">¶</a></h3>
<p>The alternatives are to forgo taking advantage of platform specific features or add the occasional function to the testapi like <code>is_serial_terminal</code> and use the existing vars mechanism. At least for what I am currently doing, the latter choice is acceptable to me, but it is not extensible beyond a point. There is also the console proxy feature which allows you to tightly couple your test module to a particular console implementation completely bypassing all layers of abstraction while at the same time obfuscating the code flow using Perl meta programming which should be avoided at least from tests perspective.</p>
<a name="Problems"></a>
<h3 >Problems<a href="#Problems" class="wiki-anchor">¶</a></h3>
<p>It is more difficult to identify and isolate a class of behaviour shared by multiple entities and create an abstraction to encapsulate it than just to write code for a specific case. Sometimes people may attempt to create capabilities when there is no significant advantage to doing so or they may be tempted not to when there clearly is an advantage. The feature will need documenting and require effort on the part of reviewers to learn it and enforce its use. It will probably increase the codebases complexity initially until it has been reasonably taken advantage of. There is the danger of an explosion in capabilities which makes it difficult to write a new distribution which covers multiple platforms without understanding a large number of them. Regressions may be introduced while moving backends and consoles over to this system.</p>