From 4bacd50968e8e8c46fde29ae221bbfeda96fdfeb Mon Sep 17 00:00:00 2001 From: Valentin David Date: Thu, 22 Feb 2024 13:24:57 +0100 Subject: [PATCH] snap-failure: set symlink before calling snapd --- cmd/snap-failure/cmd_snapd.go | 10 ++++++++++ cmd/snap-failure/cmd_snapd_test.go | 11 +++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/cmd/snap-failure/cmd_snapd.go b/cmd/snap-failure/cmd_snapd.go index e36a3762f34..fdd3fdad4ea 100644 --- a/cmd/snap-failure/cmd_snapd.go +++ b/cmd/snap-failure/cmd_snapd.go @@ -145,6 +145,16 @@ func (c *cmdSnapd) Execute(args []string) error { } logger.Noticef("restoring invoking snapd from: %v", snapdPath) + if prevRev != "0" { + // if prevRev was "0" it means we did *not* find a + // previous revision and we would obey the current + // symlink. So we overwrite the symlink only if + // prevRev != "0". + currentSymlink := filepath.Join(dirs.SnapMountDir, "snapd", "current") + if err := osutil.AtomicSymlink(prevRev, currentSymlink); err != nil { + return fmt.Errorf("cannot create symlink %s: %v", currentSymlink, err) + } + } // start previous snapd cmd := runCmd(snapdPath, nil, []string{"SNAPD_REVERT_TO_REV=" + prevRev, "SNAPD_DEBUG=1"}) if err = cmd.Run(); err != nil { diff --git a/cmd/snap-failure/cmd_snapd_test.go b/cmd/snap-failure/cmd_snapd_test.go index 4ad43a5b363..5837246748b 100644 --- a/cmd/snap-failure/cmd_snapd_test.go +++ b/cmd/snap-failure/cmd_snapd_test.go @@ -21,6 +21,7 @@ package main_test import ( "encoding/json" + "fmt" "os" "path/filepath" "time" @@ -72,9 +73,15 @@ func (r *failureSuite) TestCallPrevSnapdFromSnap(c *C) { {Revision: snap.R(123)}, }) + mockScript := ` +set -eu + +[ -L '%[1]s/snapd/current' ] +[ "$(readlink '%[1]s/snapd/current')" = 100 ] +[ "${SNAPD_REVERT_TO_REV}" = 100 ] +` // mock snapd command from 'previous' revision - snapdCmd := testutil.MockCommand(c, filepath.Join(dirs.SnapMountDir, "snapd", "100", "/usr/lib/snapd/snapd"), - `test "$SNAPD_REVERT_TO_REV" = "100"`) + snapdCmd := testutil.MockCommand(c, filepath.Join(dirs.SnapMountDir, "snapd", "100", "/usr/lib/snapd/snapd"), fmt.Sprintf(mockScript, dirs.SnapMountDir)) defer snapdCmd.Restore() systemctlCmd := testutil.MockCommand(c, "systemctl", "")