Add test to automatically validate checkpoint & restore sandbox/mmoscicki2/checkpointandrestore%topic=checkpoint-and-restore
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>
Fri, 2 Jul 2021 15:05:09 +0000 (17:05 +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.

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 b0e8e2507a4e3fd9a6efa5c5f7e8de0a2ea9f60c..7936a18e59cb3c76f9262d95c51843f313cf1940 100755 (executable)
@@ -442,6 +442,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 1b5f818278cda8f2c67fc97eaf5e4e0332c1be33..0637cb53f1f8e5bd5654e5556359fa26822d0aaa 100755 (executable)
@@ -110,6 +110,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..61e8efb
--- /dev/null
@@ -0,0 +1,122 @@
+#!/bin/bash
+set -x
+
+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 -f fota
+               fi
+       else
+               error "[RESTART_TEST] No ${PROGRESS_FILE} :("
+       fi
+       sleep ${DELAY}
+done