Skip to content

Commit 4682198

Browse files
arkqpull[bot]
authored andcommitted
[Tizen] Fix systemd services race when running tests (#25460)
* [Tizen] Fix systemd services race when running tests On the Tizen QEMU image tests are launched by the serial-getty service after auto login to root. However, there is no explicit before/after ordering between serial-getty service and ISO image mounting service. On slow systems (e.g. CI) it might happen that the serial-getty is started before ISO image mount target. This results in tests being not launched... This commit adds explicit run ordering between serial-getty and multi-user target, which shall guarantee that tests will be launched after CHIP ISO image is mounted and all Tizen services are ready. * Do not run runner script in the interactive mode * Add libncurses5 (required by GDB) to Tizen docker image
1 parent 6ab5964 commit 4682198

File tree

4 files changed

+49
-19
lines changed

4 files changed

+49
-19
lines changed

integrations/docker/images/chip-build-tizen-qemu/Dockerfile

+28-17
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ RUN set -x \
6868
RUN set -x \
6969
&& mkdir -p /tmp/workdir && cd /tmp/workdir \
7070
&& SYSTEMD_SYSTEM=/usr/lib/systemd/system \
71+
&& SYSTEMD_REQUIRES_LOCAL_FS=$SYSTEMD_SYSTEM/local-fs.target.requires \
7172
# Download Tizen images
7273
&& wget --progress=dot:giga -r -nd --no-parent -e robots=off -A 'tizen-*.tar.gz' \
7374
http://download.tizen.org/snapshots/TIZEN/Tizen-$TIZEN_VERSION/Tizen-$TIZEN_VERSION-Unified/latest/images/standard/tizen-headless-armv7l/ \
@@ -80,7 +81,7 @@ RUN set -x \
8081
&& apt-get update \
8182
&& DEBIAN_FRONTEND=noninteractive apt-get install -fy --no-install-recommends libguestfs-tools linux-image-generic \
8283
# Add extra libraries to the root image
83-
&& guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda glob copy-in \
84+
&& guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda copy-in \
8485
$TIZEN_SDK_TOOLCHAIN/arm-tizen-linux-gnueabi/lib/libasan.so.* \
8586
$TIZEN_SDK_TOOLCHAIN/arm-tizen-linux-gnueabi/lib/libubsan.so.* \
8687
$TIZEN_SDK_SYSROOT/usr/lib/libbluetooth-api.so.* \
@@ -89,17 +90,22 @@ RUN set -x \
8990
$TIZEN_SDK_SYSROOT/usr/lib/libnsd-dns-sd.so.* \
9091
/usr/lib/ \
9192
# Disable failing systemd services
92-
&& guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda glob rm $SYSTEMD_SYSTEM/deviced.service \
93-
&& guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda glob rm $SYSTEMD_SYSTEM/mnt-inform.mount \
94-
&& guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda glob rm $SYSTEMD_SYSTEM/murphyd.service \
95-
&& guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda glob rm $SYSTEMD_SYSTEM/pulseaudio.service \
93+
&& guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda \
94+
glob rm $SYSTEMD_SYSTEM/clone_partitions.service : \
95+
glob rm $SYSTEMD_SYSTEM/deviced.service : \
96+
glob rm $SYSTEMD_SYSTEM/mm-resource-managerd.service : \
97+
glob rm $SYSTEMD_SYSTEM/mnt-inform.mount : \
98+
glob rm $SYSTEMD_SYSTEM/muse-server.* : \
99+
glob rm $SYSTEMD_SYSTEM/murphyd.service : \
100+
glob rm $SYSTEMD_SYSTEM/pulseaudio.service \
96101
# Mount Tizen system partition on /opt-ro instead of /opt
97102
&& SYSTEMD_UNIT_OPT_RO_MOUNT=$SYSTEMD_SYSTEM/opt\\x2dro.mount \
98-
&& guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda ln-sf $SYSTEMD_UNIT_OPT_RO_MOUNT $SYSTEMD_SYSTEM/local-fs.target.requires \
99-
&& guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda mv $SYSTEMD_SYSTEM/opt.mount $SYSTEMD_UNIT_OPT_RO_MOUNT \
103+
&& guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda \
104+
mv $SYSTEMD_SYSTEM/opt.mount $SYSTEMD_UNIT_OPT_RO_MOUNT : \
105+
ln-sf $SYSTEMD_UNIT_OPT_RO_MOUNT $SYSTEMD_REQUIRES_LOCAL_FS : \
106+
mkdir /opt-ro \
100107
&& virt-edit $TIZEN_IOT_IMAGE_ROOT -e 's#/opt#/opt-ro#g' $SYSTEMD_UNIT_OPT_RO_MOUNT \
101108
&& virt-edit $TIZEN_IOT_IMAGE_ROOT -e 's#Options=#Options=ro,#' $SYSTEMD_UNIT_OPT_RO_MOUNT \
102-
&& guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda mkdir /opt-ro \
103109
# Create /tmp/.opt-upper and /tmp/.opt-work after /tmp is mounted
104110
&& SYSTEMD_UNIT_OPT_PRE_MOUNT=$SYSTEMD_SYSTEM/opt.pre-mount.service \
105111
&& echo -n \
@@ -113,7 +119,6 @@ RUN set -x \
113119
| guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda upload - $SYSTEMD_UNIT_OPT_PRE_MOUNT \
114120
# Mount Tizen system partition as a tmp-based overlay
115121
&& SYSTEMD_UNIT_OPT_MOUNT=$SYSTEMD_SYSTEM/opt.mount \
116-
&& guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda ln-sf $SYSTEMD_UNIT_OPT_MOUNT $SYSTEMD_SYSTEM/local-fs.target.requires \
117122
&& echo -n \
118123
"[Unit]\nConditionPathIsMountPoint=!/opt\n" \
119124
"RequiresMountsFor=/opt-ro /tmp\n" \
@@ -124,10 +129,10 @@ RUN set -x \
124129
"Where=/opt\n" \
125130
"Type=overlay\n" \
126131
"Options=lowerdir=/opt-ro,upperdir=/tmp/.opt-upper,workdir=/tmp/.opt-work\n" \
127-
| guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda upload - $SYSTEMD_UNIT_OPT_MOUNT \
132+
| guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda upload - $SYSTEMD_UNIT_OPT_MOUNT : \
133+
ln-sf $SYSTEMD_UNIT_OPT_MOUNT $SYSTEMD_REQUIRES_LOCAL_FS \
128134
# Fix SMACK label for /tmp/.opt-work/work
129135
&& SYSTEMD_UNIT_OPT_POST_MOUNT=$SYSTEMD_SYSTEM/opt.post-mount.service \
130-
&& guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda ln-sf $SYSTEMD_UNIT_OPT_POST_MOUNT $SYSTEMD_SYSTEM/local-fs.target.requires \
131136
&& echo -n \
132137
"[Unit]\n" \
133138
"DefaultDependencies=no\n" \
@@ -136,30 +141,37 @@ RUN set -x \
136141
"Type=oneshot\n" \
137142
"ExecStart=chsmack -a * /tmp/.opt-work/work\n" \
138143
"RemainAfterExit=yes\n" \
139-
| guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda upload - $SYSTEMD_UNIT_OPT_POST_MOUNT \
144+
| guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda upload - $SYSTEMD_UNIT_OPT_POST_MOUNT : \
145+
ln-sf $SYSTEMD_UNIT_OPT_POST_MOUNT $SYSTEMD_REQUIRES_LOCAL_FS \
140146
# Mount Matter ISO image on startup
141147
&& SYSTEMD_UNIT_CHIP_MOUNT=$SYSTEMD_SYSTEM/mnt-chip.mount \
142-
&& guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda ln-sf $SYSTEMD_UNIT_CHIP_MOUNT $SYSTEMD_SYSTEM/local-fs.target.requires \
143148
&& echo -n \
144149
"[Unit]\n" \
145150
"ConditionPathIsMountPoint=!/mnt/chip\n" \
146151
"[Mount]\n" \
147152
"What=/dev/disk/by-label/CHIP\n" \
148153
"Where=/mnt/chip\n" \
149154
"Options=nofail\n" \
150-
| guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda upload - $SYSTEMD_UNIT_CHIP_MOUNT \
151-
&& guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda mkdir /mnt/chip \
155+
| guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda upload - $SYSTEMD_UNIT_CHIP_MOUNT : \
156+
ln-sf $SYSTEMD_UNIT_CHIP_MOUNT $SYSTEMD_REQUIRES_LOCAL_FS : \
157+
mkdir /mnt/chip \
152158
# Setup auto-login for root user
153159
&& SYSTEMD_UNIT_SERIAL_GETTY=$SYSTEMD_SYSTEM/serial-getty@.service \
154160
&& virt-edit $TIZEN_IOT_IMAGE_ROOT -e \
155161
's#^ExecStart=.*#ExecStart=-/sbin/agetty -o "-p -f root" --noclear -a root --keep-baud 115200 %I \$TERM#' $SYSTEMD_UNIT_SERIAL_GETTY \
162+
# Run serial-getty.service after multi-user.target
163+
&& SYSTEMD_WANTS_GRAPHICAL=$SYSTEMD_SYSTEM/graphical.target.wants \
164+
&& SYSTEMD_WANTS_MULTI_USER=$SYSTEMD_SYSTEM/multi-user.target.wants \
165+
&& guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda mv $SYSTEMD_WANTS_MULTI_USER/getty.target $SYSTEMD_WANTS_GRAPHICAL \
166+
&& virt-edit $TIZEN_IOT_IMAGE_ROOT -e 's#^After=#Before=serial-getty\@ttyAMA0.service\nAfter=#' $SYSTEMD_SYSTEM/multi-user.target \
156167
# Execute launcher script after root login
157168
&& echo -n \
158169
"[ -x /launcher.sh ] && /launcher.sh\n" \
159170
| guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda upload - /root/.profile \
160171
# Launcher script
161172
&& echo -n \
162173
"#!/bin/bash\n" \
174+
"grep -q 'rootshell' /proc/cmdline && exit\n" \
163175
"if [[ -x /mnt/chip/runner.sh ]]; then\n" \
164176
" echo '### RUNNER START ###'\n" \
165177
" /mnt/chip/runner.sh\n" \
@@ -169,8 +181,7 @@ RUN set -x \
169181
"fi\n" \
170182
"echo 'Shutting down emulated system...'\n" \
171183
"echo o > /proc/sysrq-trigger\n" \
172-
| guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda upload - /launcher.sh \
173-
&& guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda chmod 0755 /launcher.sh \
184+
| guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda upload - /launcher.sh : chmod 0755 /launcher.sh \
174185
# Remove ALL previously installed packages
175186
&& apt-get autopurge -fy $(tail -2 /var/log/apt/history.log | grep ^Install | cut -c 10- | sed 's/([^)]*),\?//g') \
176187
&& rm -rf /var/lib/apt/lists \

integrations/docker/images/chip-build-tizen/Dockerfile

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ RUN set -x \
1919
&& apt-get update \
2020
&& DEBIAN_FRONTEND=noninteractive apt-get install -fy --no-install-recommends \
2121
cpio \
22+
libncurses5 \
2223
obs-build \
2324
openjdk-8-jre-headless \
2425
wget \
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.6.48 Version bump reason: [android] Correct kotlinc path for vscode image
1+
0.6.49 Version bump reason: Fix systemd services run race in Tizen QEMU image

third_party/tizen/tizen_qemu.py

+19-1
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,24 @@
1515
# limitations under the License.
1616

1717
import argparse
18+
import logging
1819
import os
1920
import re
21+
import shlex
2022
import subprocess
2123
import sys
2224

2325
# Absolute path to Tizen Studio CLI tool.
2426
tizen_sdk_root = os.environ["TIZEN_SDK_ROOT"]
2527

28+
# Setup basic logging capabilities.
29+
logging.basicConfig(level=logging.DEBUG)
30+
2631
parser = argparse.ArgumentParser(
2732
description="Run Tizen on QEMU.")
33+
parser.add_argument(
34+
'-i', '--interactive', action='store_true',
35+
help="run QEMU in interactive mode (no output redirection, no runner)")
2836
parser.add_argument(
2937
'--smp', metavar='NUM', type=int, default=2,
3038
help=("the number of CPUs available in QEMU; default: %(default)s"))
@@ -94,14 +102,24 @@
94102
'-drive', 'file=%s,id=virtio-blk1,if=none,format=raw,readonly=on' % args.image_root,
95103
]
96104

105+
kernel_args = "console=ttyAMA0 earlyprintk earlycon root=/dev/vda"
106+
if args.interactive:
107+
# Run root shell instead of the runner script.
108+
kernel_args += " rootshell"
109+
97110
qemu_args += [
98111
'-kernel', args.kernel,
99-
'-append', "console=ttyAMA0 earlyprintk earlycon root=/dev/vda",
112+
'-append', kernel_args,
100113
]
101114

115+
if args.interactive:
116+
# Run QEMU in interactive mode.
117+
sys.exit(subprocess.call(qemu_args))
118+
102119
status = 0
103120
# Run QEMU.
104121
with open(args.output, "wb") as output:
122+
logging.info("run: %s", " ".join(map(shlex.quote, qemu_args)))
105123
with subprocess.Popen(qemu_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as proc:
106124
for line in iter(proc.stdout.readline, b''):
107125

0 commit comments

Comments
 (0)