Files
snapd/boot/kernel_os.go
alfonsosanchezbeato 91622c094b many: introduce IsUndo flag in LinkContext
* many: introduce IsUndo flag in LinkContext

Some times LinkSnap is called in an undo task when we want to revert
to a previous snap revision. Introduce a flag to make LinkSnap and
boot code aware of when this happen, as some of the logic for snap
installations should not be applied when doing a revert. Specifically,
avoid the "try" logic that applies to kernels and bases: we are
reverting to a known snap that is expected to work, and making the
current snap the fallback provokes failures as we are removing it (and
also probably we are removing it because it has failed).

* tests: check that kernel with failing post-refresh is reverted

Check that a kernel with failing post-refresh hook is reverted
properly. In this case a second reboot to go back to the previous
kernel is needed.

* tests: check that base with failing post-refresh is reverted

Check that a base with failing post-refresh hook is reverted
properly. In this case a second reboot to go back to the previous
base is needed.

* boot,overlord: replace isUndo flags with NextBootContext

Replace isUndo flags with the NextBootContext struct, so we have
further information in the type and we can add flags in the future.

* boot: some style changes as suggested by review

* overlord: SetNextBoot call in maybeUndoRemodelBootChanges as undo type

* boot: add tests for the IsUndoingInstall true case

* overlord: fix remodel test for undos

* boot,overlord: implement the undo install for core16/18

* tests: added method to repack kernel snap also for core16/18

* tests: run revert after boot tests for UC16/18 too

* tests/nested/core/base-revert-after-boot: fix var usage

* tests: consider right channel/snap for uc16 in revert tests

* boot: minor stylistic changes

* boot: add tests for the undoing install case for core16/18

* boot,overlord: rename IsUndoingInstall to BootWithoutTry

* boot: use constant instead of literal for status
2022-07-11 17:49:06 +02:00

85 lines
2.3 KiB
Go

// -*- Mode: Go; indent-tabs-mode: t -*-
/*
* Copyright (C) 2014-2019 Canonical Ltd
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package boot
import (
"fmt"
"github.com/snapcore/snapd/bootloader"
"github.com/snapcore/snapd/snap"
)
type coreBootParticipant struct {
s snap.PlaceInfo
bs bootState
}
// ensure coreBootParticipant is a BootParticipant
var _ BootParticipant = (*coreBootParticipant)(nil)
func (*coreBootParticipant) IsTrivial() bool { return false }
func (bp *coreBootParticipant) SetNextBoot(bootCtx NextBootContext) (rebootInfo RebootInfo, err error) {
const errPrefix = "cannot set next boot: %s"
rebootInfo, u, err := bp.bs.setNext(bp.s, bootCtx)
if err != nil {
return RebootInfo{RebootRequired: false}, fmt.Errorf(errPrefix, err)
}
if u != nil {
if err := u.commit(); err != nil {
return RebootInfo{RebootRequired: false}, fmt.Errorf(errPrefix, err)
}
}
return rebootInfo, nil
}
type coreKernel struct {
s snap.PlaceInfo
bopts *bootloader.Options
}
// ensure coreKernel is a Kernel
var _ BootKernel = (*coreKernel)(nil)
func (*coreKernel) IsTrivial() bool { return false }
func (k *coreKernel) RemoveKernelAssets() error {
// XXX: shouldn't we check the snap type?
bootloader, err := bootloader.Find("", k.bopts)
if err != nil {
return fmt.Errorf("cannot remove kernel assets: %s", err)
}
// ask bootloader to remove the kernel assets if needed
return bootloader.RemoveKernelAssets(k.s)
}
func (k *coreKernel) ExtractKernelAssets(snapf snap.Container) error {
bootloader, err := bootloader.Find("", k.bopts)
if err != nil {
return fmt.Errorf("cannot extract kernel assets: %s", err)
}
// ask bootloader to extract the kernel assets if needed
return bootloader.ExtractKernelAssets(k.s, snapf)
}