Message ID | 20230216095440.1990542-1-lrannou@baylibre.com |
---|---|
State | New |
Headers | show |
Series | [1/2] oeqa/utils/qemurunner: change the serial runner usage | expand |
I applied just this one, as the other one doesn't apply and most of the builds failed with an error similar to this one; 2023-02-16 09:14:29,678 - oe-selftest - INFO - ====================================================================== 2023-02-16 09:14:29,678 - oe-selftest - INFO - ERROR: overlayfs.OverlayFSEtcRunTimeTests.test_sbin_init_original (subunit.RemotedTestCase) 2023-02-16 09:14:29,679 - oe-selftest - INFO - ---------------------------------------------------------------------- 2023-02-16 09:14:29,679 - oe-selftest - INFO - testtools.testresult.real._StringException: Traceback (most recent call last): File "/home/pokybuild/yocto-worker/oe-selftest-debian/build/meta/lib/oeqa/core/decorator/__init__.py", line 35, in wrapped_f return func(*args, **kwargs) File "/home/pokybuild/yocto-worker/oe-selftest-debian/build/meta/lib/oeqa/selftest/cases/overlayfs.py", line 380, in test_sbin_init_original self.run_sbin_init(True) File "/home/pokybuild/yocto-worker/oe-selftest-debian/build/meta/lib/oeqa/selftest/cases/overlayfs.py", line 415, in run_sbin_init status, output = qemu.run_serial("touch " + testFile) File "/home/pokybuild/yocto-worker/oe-selftest-debian/build/meta/lib/oeqa/targetcontrol.py", line 211, in run_serial return self.runner.run_serial(command, timeout=timeout) File "/home/pokybuild/yocto-worker/oe-selftest-debian/build/meta/lib/oeqa/utils/qemurunner.py", line 642, in run_serial (status, output) = self.run_serial_socket(command, raw, timeout) File "/home/pokybuild/yocto-worker/oe-selftest-debian/build/meta/lib/oeqa/utils/qemurunner.py", line 693, in run_serial_socket raise Exception('serial run failed: no result') Exception: serial run failed: no result On 16/02/2023 10:54:39+0100, Louis Rannou wrote: > [YOCTO #15021] > > Create a new runner run_serial_socket which usage matches the traditional ssh > runner. Its return status is 0 when the command succeeded or 0 when it > failed. If an error is encountered, it raises an Exception. > > The previous serial runner is maintained and marked as deprecated. > > Signed-off-by: Louis Rannou <lrannou@baylibre.com> > --- > meta/lib/oeqa/targetcontrol.py | 3 +++ > meta/lib/oeqa/utils/qemurunner.py | 42 ++++++++++++++++++++----------- > 2 files changed, 30 insertions(+), 15 deletions(-) > > diff --git a/meta/lib/oeqa/targetcontrol.py b/meta/lib/oeqa/targetcontrol.py > index 1fdff82889..99fbcb5879 100644 > --- a/meta/lib/oeqa/targetcontrol.py > +++ b/meta/lib/oeqa/targetcontrol.py > @@ -210,6 +210,9 @@ class QemuTarget(BaseTarget): > def run_serial(self, command, timeout=60): > return self.runner.run_serial(command, timeout=timeout) > > + def run_serial_socket(self, command, timeout=60): > + return self.runner.run_serial_socket(command, timeout=timeout) > + > > class SimpleRemoteTarget(BaseTarget): > > diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py > index c19164e6e7..c8fffd8fd1 100644 > --- a/meta/lib/oeqa/utils/qemurunner.py > +++ b/meta/lib/oeqa/utils/qemurunner.py > @@ -618,7 +618,13 @@ class QemuRunner: > return self.qmp.cmd(command) > > def run_serial(self, command, raw=False, timeout=60): > + # Deprecated > # Returns (status, output) where status is 1 on success and 0 on error > + (status, output) = self.run_serial_socket(command, raw, timeout) > + return (0 if status else 1, output) > + > + def run_serial_socket(self, command, raw=False, timeout=60): > + # Returns (status, output) where status is 0 on success and a negative value on error. > > # We assume target system have echo to get command status > if not raw: > @@ -632,7 +638,7 @@ class QemuRunner: > while True: > now = time.time() > if now >= end: > - data += "<<< run_serial(): command timed out after %d seconds without output >>>\r\n\r\n" % timeout > + data += "<<< run_serial_socket(): command timed out after %d seconds without output >>>\r\n\r\n" % timeout > break > try: > sread, _, _ = select.select([self.server_socket],[],[], end - now) > @@ -650,21 +656,27 @@ class QemuRunner: > return (1, "") > raise Exception("No data on serial console socket, connection closed?") > > - if data: > - if raw: > - status = 1 > + if not data: > + self.logger.error("serial run returned no data") > + raise subprocess.SubprocessError('serial run failed: no data') > + > + if raw: > + status = 0 > + else: > + # Remove first line (command line) and last line (prompt) > + data = data[data.find('$?\r\n')+4:data.rfind('\r\n')] > + index = data.rfind('\r\n') > + if index == -1: > + data = "" > + self.logger.error("serial run returned no result") > + raise Exception('serial run failed: no result') > else: > - # Remove first line (command line) and last line (prompt) > - data = data[data.find('$?\r\n')+4:data.rfind('\r\n')] > - index = data.rfind('\r\n') > - if index == -1: > - status_cmd = data > - data = "" > - else: > - status_cmd = data[index+2:] > - data = data[:index] > - if (status_cmd == "0"): > - status = 1 > + status_cmd = data[index+2:] > + data = data[:index] > + try: > + status = int(status_cmd) > + except ValueError as e: > + raise Exception('Could not convert to integer: {}'.format(str(e))) > return (status, str(data)) > > > -- > 2.39.1 > > > -=-=-=-=-=-=-=-=-=-=-=- > Links: You receive all messages sent to this group. > View/Reply Online (#177280): https://lists.openembedded.org/g/openembedded-core/message/177280 > Mute This Topic: https://lists.openembedded.org/mt/97002779/3617179 > Group Owner: openembedded-core+owner@lists.openembedded.org > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alexandre.belloni@bootlin.com] > -=-=-=-=-=-=-=-=-=-=-=- >
diff --git a/meta/lib/oeqa/targetcontrol.py b/meta/lib/oeqa/targetcontrol.py index 1fdff82889..99fbcb5879 100644 --- a/meta/lib/oeqa/targetcontrol.py +++ b/meta/lib/oeqa/targetcontrol.py @@ -210,6 +210,9 @@ class QemuTarget(BaseTarget): def run_serial(self, command, timeout=60): return self.runner.run_serial(command, timeout=timeout) + def run_serial_socket(self, command, timeout=60): + return self.runner.run_serial_socket(command, timeout=timeout) + class SimpleRemoteTarget(BaseTarget): diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py index c19164e6e7..c8fffd8fd1 100644 --- a/meta/lib/oeqa/utils/qemurunner.py +++ b/meta/lib/oeqa/utils/qemurunner.py @@ -618,7 +618,13 @@ class QemuRunner: return self.qmp.cmd(command) def run_serial(self, command, raw=False, timeout=60): + # Deprecated # Returns (status, output) where status is 1 on success and 0 on error + (status, output) = self.run_serial_socket(command, raw, timeout) + return (0 if status else 1, output) + + def run_serial_socket(self, command, raw=False, timeout=60): + # Returns (status, output) where status is 0 on success and a negative value on error. # We assume target system have echo to get command status if not raw: @@ -632,7 +638,7 @@ class QemuRunner: while True: now = time.time() if now >= end: - data += "<<< run_serial(): command timed out after %d seconds without output >>>\r\n\r\n" % timeout + data += "<<< run_serial_socket(): command timed out after %d seconds without output >>>\r\n\r\n" % timeout break try: sread, _, _ = select.select([self.server_socket],[],[], end - now) @@ -650,21 +656,27 @@ class QemuRunner: return (1, "") raise Exception("No data on serial console socket, connection closed?") - if data: - if raw: - status = 1 + if not data: + self.logger.error("serial run returned no data") + raise subprocess.SubprocessError('serial run failed: no data') + + if raw: + status = 0 + else: + # Remove first line (command line) and last line (prompt) + data = data[data.find('$?\r\n')+4:data.rfind('\r\n')] + index = data.rfind('\r\n') + if index == -1: + data = "" + self.logger.error("serial run returned no result") + raise Exception('serial run failed: no result') else: - # Remove first line (command line) and last line (prompt) - data = data[data.find('$?\r\n')+4:data.rfind('\r\n')] - index = data.rfind('\r\n') - if index == -1: - status_cmd = data - data = "" - else: - status_cmd = data[index+2:] - data = data[:index] - if (status_cmd == "0"): - status = 1 + status_cmd = data[index+2:] + data = data[:index] + try: + status = int(status_cmd) + except ValueError as e: + raise Exception('Could not convert to integer: {}'.format(str(e))) return (status, str(data))
[YOCTO #15021] Create a new runner run_serial_socket which usage matches the traditional ssh runner. Its return status is 0 when the command succeeded or 0 when it failed. If an error is encountered, it raises an Exception. The previous serial runner is maintained and marked as deprecated. Signed-off-by: Louis Rannou <lrannou@baylibre.com> --- meta/lib/oeqa/targetcontrol.py | 3 +++ meta/lib/oeqa/utils/qemurunner.py | 42 ++++++++++++++++++++----------- 2 files changed, 30 insertions(+), 15 deletions(-)