func (s *setupSuite) TestSetupUndoIdempotent(c *C) { // make sure that a retry wouldn't stumble on partial work // use a kernel because that does and need to do strictly more // this cannot check systemd own behavior though around mounts! bootloader := boottest.NewMockBootloader("mock", c.MkDir()) partition.ForceBootloader(bootloader) // we don't get real mounting os.Setenv("SNAPPY_SQUASHFS_UNPACK_FOR_TESTS", "1") defer os.Unsetenv("SNAPPY_SQUASHFS_UNPACK_FOR_TESTS") testFiles := [][]string{ {"kernel.img", "kernel"}, {"initrd.img", "initrd"}, {"modules/4.4.0-14-generic/foo.ko", "a module"}, {"firmware/bar.bin", "some firmware"}, {"meta/kernel.yaml", "version: 4.2"}, } snapPath := snaptest.MakeTestSnapWithFiles(c, `name: kernel version: 1.0 type: kernel `, testFiles) si := snap.SideInfo{ RealName: "kernel", Revision: snap.R(140), } err := s.be.SetupSnap(snapPath, &si, &s.nullProgress) c.Assert(err, IsNil) minInfo := snap.MinimalPlaceInfo("kernel", snap.R(140)) err = s.be.UndoSetupSnap(minInfo, "kernel", &s.nullProgress) c.Assert(err, IsNil) // retry run err = s.be.UndoSetupSnap(minInfo, "kernel", &s.nullProgress) c.Assert(err, IsNil) // sanity checks l, _ := filepath.Glob(filepath.Join(dirs.SnapServicesDir, "*.mount")) c.Assert(l, HasLen, 0) c.Assert(osutil.FileExists(minInfo.MountDir()), Equals, false) c.Assert(osutil.FileExists(minInfo.MountFile()), Equals, false) l, _ = filepath.Glob(filepath.Join(bootloader.Dir(), "*")) c.Assert(l, HasLen, 0) }
func (s *setupSuite) TestSetupDoUndoKernelUboot(c *C) { bootloader := boottest.NewMockBootloader("mock", c.MkDir()) partition.ForceBootloader(bootloader) // we don't get real mounting os.Setenv("SNAPPY_SQUASHFS_UNPACK_FOR_TESTS", "1") defer os.Unsetenv("SNAPPY_SQUASHFS_UNPACK_FOR_TESTS") testFiles := [][]string{ {"kernel.img", "kernel"}, {"initrd.img", "initrd"}, {"modules/4.4.0-14-generic/foo.ko", "a module"}, {"firmware/bar.bin", "some firmware"}, {"meta/kernel.yaml", "version: 4.2"}, } snapPath := snaptest.MakeTestSnapWithFiles(c, `name: kernel version: 1.0 type: kernel `, testFiles) si := snap.SideInfo{ RealName: "kernel", Revision: snap.R(140), } err := s.be.SetupSnap(snapPath, &si, &s.nullProgress) c.Assert(err, IsNil) l, _ := filepath.Glob(filepath.Join(bootloader.Dir(), "*")) c.Assert(l, HasLen, 1) minInfo := snap.MinimalPlaceInfo("kernel", snap.R(140)) // undo deletes the kernel assets again err = s.be.UndoSetupSnap(minInfo, "kernel", &s.nullProgress) c.Assert(err, IsNil) l, _ = filepath.Glob(filepath.Join(bootloader.Dir(), "*")) c.Assert(l, HasLen, 0) }
func copySnap(snapName, targetDir string) (*info, error) { baseDir := filepath.Join(dirs.SnapMountDir, snapName) if _, err := os.Stat(baseDir); err != nil { return nil, err } sourceDir := filepath.Join(baseDir, "current") files, err := filepath.Glob(filepath.Join(sourceDir, "*")) if err != nil { return nil, err } revnoDir, err := filepath.EvalSymlinks(sourceDir) if err != nil { return nil, err } origRevision := filepath.Base(revnoDir) for _, m := range files { if err = exec.Command("sudo", "cp", "-a", m, targetDir).Run(); err != nil { return nil, err } } rev, err := snap.ParseRevision(origRevision) if err != nil { return nil, err } place := snap.MinimalPlaceInfo(snapName, rev) origDigest, origSize, err := asserts.SnapFileSHA3_384(place.MountFile()) if err != nil { return nil, err } return &info{revision: origRevision, size: origSize, digest: origDigest}, nil }
func (s *setupSuite) TestSetupDoUndoSimple(c *C) { snapPath := makeTestSnap(c, helloYaml1) si := snap.SideInfo{ RealName: "hello", Revision: snap.R(14), } err := s.be.SetupSnap(snapPath, &si, &s.nullProgress) c.Assert(err, IsNil) // after setup the snap file is in the right dir c.Assert(osutil.FileExists(filepath.Join(dirs.SnapBlobDir, "hello_14.snap")), Equals, true) // ensure the right unit is created mup := systemd.MountUnitPath("/snap/hello/14", "mount") content, err := ioutil.ReadFile(mup) c.Assert(err, IsNil) c.Assert(string(content), Matches, "(?ms).*^Where=/snap/hello/14") c.Assert(string(content), Matches, "(?ms).*^What=/var/lib/snapd/snaps/hello_14.snap") minInfo := snap.MinimalPlaceInfo("hello", snap.R(14)) // mount dir was created c.Assert(osutil.FileExists(minInfo.MountDir()), Equals, true) // undo undoes the mount unit and the instdir creation err = s.be.UndoSetupSnap(minInfo, "app", &s.nullProgress) c.Assert(err, IsNil) l, _ := filepath.Glob(filepath.Join(dirs.SnapServicesDir, "*.mount")) c.Assert(l, HasLen, 0) c.Assert(osutil.FileExists(minInfo.MountDir()), Equals, false) c.Assert(osutil.FileExists(minInfo.MountFile()), Equals, false) }
func (ss *SnapSetup) placeInfo() snap.PlaceInfo { return snap.MinimalPlaceInfo(ss.Name(), ss.Revision()) }
func (snapsup *SnapSetup) placeInfo() snap.PlaceInfo { return snap.MinimalPlaceInfo(snapsup.Name(), snapsup.Revision()) }