Add test to automatically validate checkpoint & restore 50/261950/1
authorMateusz Moscicki <m.moscicki2@partner.samsung.com>
Fri, 2 Jul 2021 14:55:52 +0000 (16:55 +0200)
committerMateusz Moscicki <m.moscicki2@partner.samsung.com>
Thu, 29 Jul 2021 10:37:43 +0000 (12:37 +0200)
To enable validation, create the appropriate file with content "INIT" on
inform partition before executing the system upgrade:

/mnt/inform/restart-progress-rw - to validate C&R during RW update
/mnt/inform/restart-progress-ro - to validate C&R during RO update

eg.:
    echo INIT > /mnt/inform/restart-progress-ro

Note:
    For RW update validation it is needed to set smack label:

    chsmack -a _ /mnt/inform/restart-progress-rw

During the upgrade, the progress_restart script will keep track of the
upgrade progress and when it increases by a set value, it will perform a
system reset.

Once all restarts are done, the upgrade should be successful.

Change-Id: Id10eb03b7aeaa28c598891ae39a455a4dbf5273e

packaging/initrd-fota.spec
scripts/40-fota.list.in
scripts/fota-init.sh
scripts/fus_rw-init.sh
scripts/progress_restart.sh [new file with mode: 0755]

index a99fb916bc320d7e04eb3594c2c5549812daaa35..af4d32a10f98b703feb7246d50caee58bb3ab56f 100755 (executable)
@@ -39,10 +39,14 @@ mkdir -p %{buildroot}/opt/data/update
 mkdir -p %{buildroot}%{init_script_dir}
 cp ./scripts/fota-init.sh %{buildroot}%{init_script_dir}/fota-init.sh
 cp ./scripts/fus_rw-init.sh %{buildroot}%{init_script_dir}/fus_rw-init.sh
+cp ./scripts/progress_restart.sh %{buildroot}%{init_script_dir}/progress_restart.sh
 
 mkdir -p %{buildroot}%{_datadir}/initrd-recovery/initrd.list.d
 cp ./scripts/40-fota.list %{buildroot}%{_datadir}/initrd-recovery/initrd.list.d
 
+%post
+chsmack -e "System::Privileged" %{buildroot}%{init_script_dir}/progress_restart.sh
+
 %files
 %manifest initrd-fota.manifest
 %license LICENSE
index 346170cfa6c8477146bd28a19dabab6a16f6ce95..d7f014e8e14d14cc03bf5c6ad9a5664651a6eb90 100755 (executable)
@@ -2,6 +2,7 @@
 MVWITHLIBS="
 @INITRD_FOTA_LIB_DIR@/initrd-recovery/fota/fota-init.sh
 @INITRD_FOTA_LIB_DIR@/initrd-recovery/fota/fus_rw-init.sh
+@INITRD_FOTA_LIB_DIR@/initrd-recovery/fota/progress_restart.sh
 @INITRD_FOTA_LIB_DIR@/initrd-recovery/minireboot
 "
 
@@ -44,4 +45,5 @@ SYMLINKS="
 /bin/sh:bash
 /sbin/fota-init:@INITRD_FOTA_LIB_DIR@/initrd-recovery/fota/fota-init.sh
 /sbin/fus_rw-init:@INITRD_FOTA_LIB_DIR@/initrd-recovery/fota/fus_rw-init.sh
+/sbin/progress_restart:@INITRD_FOTA_LIB_DIR@/initrd-recovery/fota/progress_restart.sh
 "
index 96228825c29b9e191e7e909e7da23f623a7aead2..10a2bd593bd7b1a8fc1d93f3b83eee4b1ed1b5ec 100755 (executable)
@@ -499,6 +499,7 @@ if [ "$FOTA_GUI_ENABLE" = "1" ]; then
        /usr/bin/fota_gui &
        /usr/bin/sleep 2
 fi
+/sbin/progress_restart RO &
 do_fota_update
 fota_result=$?
 if [ "$fota_result" = "0" ]; then
index 091092c95f325d3fabf18e58cb7c46d8a25c421c..bbce4d3c955dbbb13170e917f728db4bd46ce80c 100755 (executable)
@@ -61,6 +61,7 @@ do_reboot() {
 do_rw_update() {
        echo "Change into rw update mode" >> ${INT_LOG_FILE}
 
+       /sbin/progress_restart RW &
        # Go to system-update.target
        if [ $$ = 1 ]; then
                cd ${FAKE_ROOT}
diff --git a/scripts/progress_restart.sh b/scripts/progress_restart.sh
new file mode 100755 (executable)
index 0000000..0f61e2b
--- /dev/null
@@ -0,0 +1,120 @@
+#!/bin/bash
+PATH="/usr/bin:/bin:/usr/sbin:/sbin"
+MODE=${1}
+
+SCRIPT_NAME="progress_restart.sh"
+LAST_LOG="__NONE__"
+SAME_LOG_IT="0"
+#------------------------------------------------
+#       log msg [file]
+#------------------------------------------------
+function log {
+    # log format: [script_name][tag]actual_log
+    LOG="[${SCRIPT_NAME}]$1"
+    if [ "$LOG" == "$LAST_LOG" ]; then
+        SAME_LOG_IT=$((SAME_LOG_IT + 1))
+        if (( $SAME_LOG_IT > 10 )); then
+            return
+        fi
+    else
+        SAME_LOG_IT=0
+    fi
+    LAST_LOG="$LOG"
+    if [ "$2" != "" ]; then
+        echo "$LOG" >> "$2"
+    fi
+    echo "$LOG"
+}
+
+function info {
+       log "[INFO] ${1}"
+}
+
+function error {
+       log "[ERROR] ${1}"
+}
+
+
+info "[RESTART_TEST] Start"
+
+
+function init_ro {
+       info "[RESTART_TEST] Init RO restart test"
+       INIT_PROGRES=10
+       MAX_PROGRESS=100
+       EPSILON=10
+       RESTART_PROGRESS_FILE="/mnt/inform/restart-progress-ro"
+       PROGRESS_FILE="/tmp/upgrade/ro_progress"
+       DELAY=2
+}
+
+function init_rw {
+       info "[RESTART_TEST] Init RW restart test"
+       INIT_PROGRES=2
+       EPSILON=2
+       RESTART_PROGRESS_FILE="/mnt/inform/restart-progress-rw"
+       FAKE_ROOT=/system
+       PROGRESS_FILE="${FAKE_ROOT}/tmp/upgrade/progress"
+       DELAY=0.1
+}
+
+function cleanup {
+       info "[RESTART_TEST] Cleanup"
+       rm -rf "${RESTART_PROGRESS_FILE}"
+}
+
+function init_progress_file {
+       echo ${INIT_PROGRES} > "${RESTART_PROGRESS_FILE}"
+}
+
+function update_progress {
+       RESTART_PROGRESS=$(cat "${RESTART_PROGRESS_FILE}")
+       PROGRESS=$(cat "${PROGRESS_FILE}")
+       if [[ "${MODE}" == "RW" ]]; then
+               MAX_PROGRESS=$(cat "${FAKE_ROOT}/tmp/upgrade/total")
+       fi
+}
+
+
+if [[ "${MODE}" == "RO" ]]; then
+       init_ro
+elif [[ "${MODE}" == "RW" ]]; then
+       init_rw
+else
+       error "[RESTART_TEST] Invalid mode: ${MODE}"
+       exit
+fi
+
+if [ ! -f "${RESTART_PROGRESS_FILE}" ]; then
+       exit
+else
+       RESTART_PROGRESS=$(cat "${RESTART_PROGRESS_FILE}")
+       if [[ "${RESTART_PROGRESS}" == "INIT" ]]; then
+               init_progress_file
+       fi
+fi
+
+while true; do
+       if [ -f "${PROGRESS_FILE}" ]; then
+               update_progress
+
+               info "[RESTART_TEST] Current: ${PROGRESS} Next restart: ${RESTART_PROGRESS}"
+               if (( PROGRESS < 0 )); then
+                       info "[RESTART_TEST] End"
+                       cleanup
+                       exit
+               fi
+               if (( PROGRESS > RESTART_PROGRESS )); then
+                       if (( PROGRESS + EPSILON >= MAX_PROGRESS )); then
+                               cleanup
+                       else
+                               echo $((PROGRESS + EPSILON)) > "${RESTART_PROGRESS_FILE}"
+                       fi
+                       info "[RESTART_TEST] Restarting"
+                       reboot -ff fota
+               fi
+       else
+               error "[RESTART_TEST] No ${PROGRESS_FILE} :("
+       fi
+       sleep ${DELAY}
+done