func (s *snapmgrTestSuite) TestUpdateConflict(c *C) { s.state.Lock() defer s.state.Unlock() snapstate.Set(s.state, "some-snap", &snapstate.SnapState{ Active: true, Sequence: []*snap.SideInfo{{OfficialName: "some-snap"}}, }) _, err := snapstate.Update(s.state, "some-snap", "some-channel", s.user.ID, 0) c.Assert(err, IsNil) _, err = snapstate.Update(s.state, "some-snap", "some-channel", s.user.ID, 0) c.Assert(err, ErrorMatches, `snap "some-snap" has changes in progress`) }
func (s *snapmgrTestSuite) TestUpdateSameRevisionIntegration(c *C) { si := snap.SideInfo{ OfficialName: "some-snap", Revision: 7, } s.state.Lock() defer s.state.Unlock() snapstate.Set(s.state, "some-snap", &snapstate.SnapState{ Active: true, Sequence: []*snap.SideInfo{&si}, }) chg := s.state.NewChange("install", "install a snap") ts, err := snapstate.Update(s.state, "some-snap", "channel-for-7", s.user.ID, snappy.DoInstallGC) c.Assert(err, IsNil) chg.AddAll(ts) s.state.Unlock() defer s.snapmgr.Stop() s.settle() s.state.Lock() expected := []fakeOp{ { op: "download", macaroon: s.user.Macaroon, name: "some-snap", channel: "channel-for-7", }, } c.Assert(chg.Status(), Equals, state.ErrorStatus) c.Check(chg.Err(), ErrorMatches, `(?s).*revision 7 of snap "some-snap" already installed.*`) // ensure all our tasks ran c.Assert(s.fakeBackend.ops, DeepEquals, expected) // verify snaps in the system state var snapst snapstate.SnapState err = snapstate.Get(s.state, "some-snap", &snapst) c.Assert(err, IsNil) c.Assert(snapst.Active, Equals, true) c.Assert(snapst.Candidate, IsNil) c.Assert(snapst.Sequence, HasLen, 1) c.Assert(snapst.Sequence[0], DeepEquals, &snap.SideInfo{ OfficialName: "some-snap", Channel: "", Revision: 7, }) }
func (s *snapmgrTestSuite) TestUpdateChannelFallback(c *C) { s.state.Lock() defer s.state.Unlock() snapstate.Set(s.state, "some-snap", &snapstate.SnapState{ Active: true, Channel: "edge", Sequence: []*snap.SideInfo{{OfficialName: "some-snap", Revision: 11}}, }) ts, err := snapstate.Update(s.state, "some-snap", "", s.user.ID, 0) c.Assert(err, IsNil) var ss snapstate.SnapSetup err = ts.Tasks()[0].Get("snap-setup", &ss) c.Assert(err, IsNil) c.Check(ss.Channel, Equals, "edge") }
func (s *snapmgrTestSuite) TestUpdateTotalUndoIntegration(c *C) { si := snap.SideInfo{ OfficialName: "some-snap", Revision: 7, } s.state.Lock() defer s.state.Unlock() snapstate.Set(s.state, "some-snap", &snapstate.SnapState{ Active: true, Sequence: []*snap.SideInfo{&si}, Channel: "stable", }) chg := s.state.NewChange("install", "install a snap") ts, err := snapstate.Update(s.state, "some-snap", "some-channel", s.user.ID, snappy.DoInstallGC) c.Assert(err, IsNil) chg.AddAll(ts) tasks := ts.Tasks() last := tasks[len(tasks)-1] terr := s.state.NewTask("error-trigger", "provoking total undo") terr.WaitFor(last) chg.AddTask(terr) s.state.Unlock() defer s.snapmgr.Stop() s.settle() s.state.Lock() expected := []fakeOp{ { op: "download", macaroon: s.user.Macaroon, name: "some-snap", channel: "some-channel", }, { op: "check-snap", name: "downloaded-snap-path", flags: int(snappy.DoInstallGC), old: "/snap/some-snap/7", }, { op: "setup-snap", name: "downloaded-snap-path", flags: int(snappy.DoInstallGC), revno: 11, }, { op: "unlink-snap", name: "/snap/some-snap/7", }, { op: "copy-data", name: "/snap/some-snap/11", flags: int(snappy.DoInstallGC), old: "/snap/some-snap/7", }, { op: "candidate", sinfo: snap.SideInfo{ OfficialName: "some-snap", SnapID: "snapIDsnapidsnapidsnapidsnapidsn", Channel: "some-channel", Revision: 11, }, }, { op: "link-snap", name: "/snap/some-snap/11", }, // undoing everything from here down... { op: "unlink-snap", name: "/snap/some-snap/11", }, { op: "undo-copy-snap-data", name: "/snap/some-snap/11", }, { op: "link-snap", name: "/snap/some-snap/7", }, { op: "undo-setup-snap", name: "/snap/some-snap/11", }, } // ensure all our tasks ran c.Assert(s.fakeBackend.ops, DeepEquals, expected) // verify snaps in the system state var snapst snapstate.SnapState err = snapstate.Get(s.state, "some-snap", &snapst) c.Assert(err, IsNil) c.Assert(snapst.Active, Equals, true) c.Assert(snapst.Channel, Equals, "stable") c.Assert(snapst.Candidate, IsNil) c.Assert(snapst.Sequence, HasLen, 1) c.Assert(snapst.Sequence[0], DeepEquals, &snap.SideInfo{ OfficialName: "some-snap", Channel: "", Revision: 7, }) }
func (s *snapmgrTestSuite) TestUpdateUndoIntegration(c *C) { si := snap.SideInfo{ OfficialName: "some-snap", Revision: 7, } s.state.Lock() defer s.state.Unlock() snapstate.Set(s.state, "some-snap", &snapstate.SnapState{ Active: true, Sequence: []*snap.SideInfo{&si}, }) chg := s.state.NewChange("install", "install a snap") ts, err := snapstate.Update(s.state, "some-snap", "some-channel", s.user.ID, snappy.DoInstallGC) c.Assert(err, IsNil) chg.AddAll(ts) s.fakeBackend.linkSnapFailTrigger = "/snap/some-snap/11" s.state.Unlock() defer s.snapmgr.Stop() s.settle() s.state.Lock() expected := []fakeOp{ { op: "download", macaroon: s.user.Macaroon, name: "some-snap", channel: "some-channel", }, { op: "check-snap", name: "downloaded-snap-path", flags: int(snappy.DoInstallGC), old: "/snap/some-snap/7", }, { op: "setup-snap", name: "downloaded-snap-path", flags: int(snappy.DoInstallGC), revno: 11, }, { op: "unlink-snap", name: "/snap/some-snap/7", }, { op: "copy-data", name: "/snap/some-snap/11", flags: int(snappy.DoInstallGC), old: "/snap/some-snap/7", }, { op: "candidate", sinfo: snap.SideInfo{ OfficialName: "some-snap", SnapID: "snapIDsnapidsnapidsnapidsnapidsn", Channel: "some-channel", Revision: 11, }, }, { op: "link-snap.failed", name: "/snap/some-snap/11", }, // no unlink-snap here is expected! { op: "undo-copy-snap-data", name: "/snap/some-snap/11", }, { op: "link-snap", name: "/snap/some-snap/7", }, { op: "undo-setup-snap", name: "/snap/some-snap/11", }, } // ensure all our tasks ran c.Assert(s.fakeBackend.ops, DeepEquals, expected) // verify snaps in the system state var snapst snapstate.SnapState err = snapstate.Get(s.state, "some-snap", &snapst) c.Assert(err, IsNil) c.Assert(snapst.Active, Equals, true) c.Assert(snapst.Candidate, IsNil) c.Assert(snapst.Sequence, HasLen, 1) c.Assert(snapst.Sequence[0], DeepEquals, &snap.SideInfo{ OfficialName: "some-snap", Channel: "", Revision: 7, }) }
func (s *snapmgrTestSuite) TestUpdateIntegration(c *C) { si := snap.SideInfo{ OfficialName: "some-snap", Revision: 7, } s.state.Lock() defer s.state.Unlock() snapstate.Set(s.state, "some-snap", &snapstate.SnapState{ Active: true, Sequence: []*snap.SideInfo{&si}, }) chg := s.state.NewChange("install", "install a snap") ts, err := snapstate.Update(s.state, "some-snap", "some-channel", s.user.ID, snappy.DoInstallGC) c.Assert(err, IsNil) chg.AddAll(ts) s.state.Unlock() defer s.snapmgr.Stop() s.settle() s.state.Lock() expected := []fakeOp{ fakeOp{ op: "download", macaroon: s.user.Macaroon, name: "some-snap", channel: "some-channel", }, fakeOp{ op: "check-snap", name: "downloaded-snap-path", flags: int(snappy.DoInstallGC), old: "/snap/some-snap/7", }, fakeOp{ op: "setup-snap", name: "downloaded-snap-path", flags: int(snappy.DoInstallGC), revno: 11, }, fakeOp{ op: "unlink-snap", name: "/snap/some-snap/7", }, fakeOp{ op: "copy-data", name: "/snap/some-snap/11", flags: int(snappy.DoInstallGC), old: "/snap/some-snap/7", }, fakeOp{ op: "candidate", sinfo: snap.SideInfo{ OfficialName: "some-snap", SnapID: "snapIDsnapidsnapidsnapidsnapidsn", Channel: "some-channel", Revision: 11, }, }, fakeOp{ op: "link-snap", name: "/snap/some-snap/11", }, } // ensure all our tasks ran c.Assert(s.fakeBackend.ops, DeepEquals, expected) // check progress task := ts.Tasks()[0] cur, total := task.Progress() c.Assert(cur, Equals, s.fakeBackend.fakeCurrentProgress) c.Assert(total, Equals, s.fakeBackend.fakeTotalProgress) // verify snapSetup info var ss snapstate.SnapSetup err = task.Get("snap-setup", &ss) c.Assert(err, IsNil) c.Assert(ss, DeepEquals, snapstate.SnapSetup{ Name: "some-snap", Channel: "some-channel", Flags: int(snappy.DoInstallGC), UserID: s.user.ID, Revision: 11, SnapPath: "downloaded-snap-path", }) // verify snaps in the system state var snapst snapstate.SnapState err = snapstate.Get(s.state, "some-snap", &snapst) c.Assert(err, IsNil) c.Assert(snapst.Active, Equals, true) c.Assert(snapst.Candidate, IsNil) c.Assert(snapst.Sequence, HasLen, 2) c.Assert(snapst.Sequence[0], DeepEquals, &snap.SideInfo{ OfficialName: "some-snap", Channel: "", Revision: 7, }) c.Assert(snapst.Sequence[1], DeepEquals, &snap.SideInfo{ OfficialName: "some-snap", Channel: "some-channel", SnapID: "snapIDsnapidsnapidsnapidsnapidsn", Revision: 11, }) }