func (s *snapmgrTestSuite) TestAliasUpdateChangeConflict(c *C) { s.state.Lock() defer s.state.Unlock() snapstate.Set(s.state, "some-snap", &snapstate.SnapState{ Active: true, Sequence: []*snap.SideInfo{{RealName: "some-snap", SnapID: "some-snap-id", Revision: snap.R(7)}}, Current: snap.R(7), SnapType: "app", }) ts, err := snapstate.Alias(s.state, "some-snap", []string{"alias1"}) c.Assert(err, IsNil) // need a change to make the tasks visible s.state.NewChange("alias", "...").AddAll(ts) _, err = snapstate.Update(s.state, "some-snap", "some-channel", snap.R(0), s.user.ID, snapstate.Flags{}) c.Assert(err, ErrorMatches, `snap "some-snap" has changes in progress`) }
func (ms *mgrsSuite) TestHappyRemoteInstallAndUpgradeSvc(c *C) { // test install through store and update, plus some mechanics // of update // TODO: ok to split if it gets too messy to maintain ms.prereqSnapAssertions(c) snapYamlContent := `name: foo version: @VERSION@ apps: bar: command: bin/bar svc: command: svc daemon: forking ` ver := "1.0" revno := "42" snapPath, digest := ms.makeStoreTestSnap(c, strings.Replace(snapYamlContent, "@VERSION@", ver, -1), revno) ms.serveSnap(snapPath, revno) mockServer := ms.mockStore(c) defer mockServer.Close() st := ms.o.State() st.Lock() defer st.Unlock() ts, err := snapstate.Install(st, "foo", "stable", snap.R(0), 0, snapstate.Flags{}) c.Assert(err, IsNil) chg := st.NewChange("install-snap", "...") chg.AddAll(ts) st.Unlock() err = ms.o.Settle() st.Lock() c.Assert(err, IsNil) c.Assert(chg.Status(), Equals, state.DoneStatus, Commentf("install-snap change failed with: %v", chg.Err())) info, err := snapstate.CurrentInfo(st, "foo") c.Assert(err, IsNil) c.Check(info.Revision, Equals, snap.R(42)) c.Check(info.SnapID, Equals, fooSnapID) c.Check(info.DeveloperID, Equals, "devdevdev") c.Check(info.Version, Equals, "1.0") c.Check(info.Summary(), Equals, "Foo") c.Check(info.Description(), Equals, "this is a description") c.Check(info.Developer, Equals, "bar") c.Assert(osutil.FileExists(info.MountFile()), Equals, true) snapRev42, err := assertstate.DB(st).Find(asserts.SnapRevisionType, map[string]string{ "snap-sha3-384": digest, }) c.Assert(err, IsNil) c.Check(snapRev42.(*asserts.SnapRevision).SnapID(), Equals, fooSnapID) c.Check(snapRev42.(*asserts.SnapRevision).SnapRevision(), Equals, 42) // check service was setup properly svcFile := filepath.Join(dirs.SnapServicesDir, "snap.foo.svc.service") c.Assert(osutil.FileExists(svcFile), Equals, true) stat, err := os.Stat(svcFile) c.Assert(err, IsNil) // should _not_ be executable c.Assert(stat.Mode().String(), Equals, "-rw-r--r--") // Refresh ver = "2.0" revno = "50" snapPath, digest = ms.makeStoreTestSnap(c, strings.Replace(snapYamlContent, "@VERSION@", ver, -1), revno) ms.serveSnap(snapPath, revno) ts, err = snapstate.Update(st, "foo", "stable", snap.R(0), 0, snapstate.Flags{}) c.Assert(err, IsNil) chg = st.NewChange("upgrade-snap", "...") chg.AddAll(ts) st.Unlock() err = ms.o.Settle() st.Lock() c.Assert(err, IsNil) c.Assert(chg.Err(), IsNil) c.Assert(chg.Status(), Equals, state.DoneStatus, Commentf("upgrade-snap change failed with: %v", chg.Err())) info, err = snapstate.CurrentInfo(st, "foo") c.Assert(err, IsNil) c.Check(info.Revision, Equals, snap.R(50)) c.Check(info.SnapID, Equals, fooSnapID) c.Check(info.DeveloperID, Equals, "devdevdev") c.Check(info.Version, Equals, "2.0") snapRev50, err := assertstate.DB(st).Find(asserts.SnapRevisionType, map[string]string{ "snap-sha3-384": digest, }) c.Assert(err, IsNil) c.Check(snapRev50.(*asserts.SnapRevision).SnapID(), Equals, fooSnapID) c.Check(snapRev50.(*asserts.SnapRevision).SnapRevision(), Equals, 50) // check updated wrapper symlinkTarget, err := os.Readlink(info.Apps["bar"].WrapperPath()) c.Assert(err, IsNil) c.Assert(symlinkTarget, Equals, "/usr/bin/snap") // check updated service file content, err := ioutil.ReadFile(svcFile) c.Assert(err, IsNil) c.Assert(strings.Contains(string(content), "/var/snap/foo/"+revno), Equals, true) }