mirror of
https://github.com/token2/snapd.git
synced 2026-03-13 11:15:47 -07:00
* 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
85 lines
2.3 KiB
Go
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)
|
|
}
|