func (s *kernelOSSuite) TestExtractKernelAssetsError(c *C) { info := &snap.Info{} info.Type = snap.TypeApp err := boot.ExtractKernelAssets(info, nil) c.Assert(err, ErrorMatches, `cannot extract kernel assets from snap type "app"`) }
// SetupSnap does prepare and mount the snap for further processing. func (b Backend) SetupSnap(snapFilePath string, sideInfo *snap.SideInfo, meter progress.Meter) error { // This assumes that the snap was already verified or --dangerous was used. s, snapf, err := OpenSnapFile(snapFilePath, sideInfo) if err != nil { return err } instdir := s.MountDir() if err := os.MkdirAll(instdir, 0755); err != nil { return err } if err := snapf.Install(s.MountFile(), instdir); err != nil { return err } // generate the mount unit for the squashfs if err := addMountUnit(s, meter); err != nil { return err } if s.Type == snap.TypeKernel { if err := boot.ExtractKernelAssets(s, snapf); err != nil { return fmt.Errorf("cannot install kernel: %s", err) } } return err }
func (s *kernelOSSuite) TestExtractKernelAssetsNoUnpacksKernelForGrub(c *C) { // pretend to be a grub system mockGrub := boottest.NewMockBootloader("grub", c.MkDir()) partition.ForceBootloader(mockGrub) files := [][]string{ {"kernel.img", "I'm a kernel"}, {"initrd.img", "...and I'm an initrd"}, {"meta/kernel.yaml", "version: 4.2"}, } si := &snap.SideInfo{ RealName: "ubuntu-kernel", Revision: snap.R(42), } fn := snaptest.MakeTestSnapWithFiles(c, packageKernel, files) snapf, err := snap.Open(fn) c.Assert(err, IsNil) info, err := snap.ReadInfoFromSnapFile(snapf, si) c.Assert(err, IsNil) err = boot.ExtractKernelAssets(info, snapf) c.Assert(err, IsNil) // kernel is *not* here kernimg := filepath.Join(mockGrub.Dir(), "ubuntu-kernel_42.snap", "kernel.img") c.Assert(osutil.FileExists(kernimg), Equals, false) }
func extractKernelAssets(snapPath string, info *snap.Info) error { snapf, err := snap.Open(snapPath) if err != nil { return err } if err := boot.ExtractKernelAssets(info, snapf); err != nil { return err } return nil }
func (s *kernelOSSuite) TestExtractKernelAssetsAndRemove(c *C) { files := [][]string{ {"kernel.img", "I'm a kernel"}, {"initrd.img", "...and I'm an initrd"}, {"dtbs/foo.dtb", "g'day, I'm foo.dtb"}, {"dtbs/bar.dtb", "hello, I'm bar.dtb"}, // must be last {"meta/kernel.yaml", "version: 4.2"}, } si := &snap.SideInfo{ RealName: "ubuntu-kernel", Revision: snap.R(42), } fn := snaptest.MakeTestSnapWithFiles(c, packageKernel, files) snapf, err := snap.Open(fn) c.Assert(err, IsNil) info, err := snap.ReadInfoFromSnapFile(snapf, si) c.Assert(err, IsNil) err = boot.ExtractKernelAssets(info, snapf) c.Assert(err, IsNil) // this is where the kernel/initrd is unpacked bootdir := s.bootloader.Dir() kernelAssetsDir := filepath.Join(bootdir, "ubuntu-kernel_42.snap") for _, def := range files { if def[0] == "meta/kernel.yaml" { break } fullFn := filepath.Join(kernelAssetsDir, def[0]) content, err := ioutil.ReadFile(fullFn) c.Assert(err, IsNil) c.Assert(string(content), Equals, def[1]) } // remove err = boot.RemoveKernelAssets(info) c.Assert(err, IsNil) c.Check(osutil.FileExists(kernelAssetsDir), Equals, false) }