// localSnapInfo returns the information about the current snap for the given name plus the SnapState with the active flag and other snap revisions. func localSnapInfo(st *state.State, name string) (info *snap.Info, active bool, err error) { st.Lock() defer st.Unlock() var snapst snapstate.SnapState err = snapstate.Get(st, name, &snapst) if err != nil && err != state.ErrNoState { return nil, false, fmt.Errorf("cannot consult state: %v", err) } cur := snapst.Current() if cur == nil { return nil, false, nil } info, err = snap.ReadInfo(name, cur) if err != nil { return nil, false, fmt.Errorf("cannot read snap details: %v", err) } return info, snapst.Active, nil }
func (s *snapmgrQuerySuite) TestAll(c *C) { st := s.st st.Lock() defer st.Unlock() snapStates, err := snapstate.All(st) c.Assert(err, IsNil) c.Check(snapStates, HasLen, 1) var snapst *snapstate.SnapState for name, sst := range snapStates { c.Assert(name, Equals, "name1") snapst = sst } c.Check(snapst.Active, Equals, true) c.Check(snapst.Current(), NotNil) info12, err := snap.ReadInfo("name1", snapst.Current()) c.Assert(err, IsNil) c.Check(info12.Name(), Equals, "name1") c.Check(info12.Revision, Equals, 12) c.Check(info12.Summary(), Equals, "s12") c.Check(info12.Version, Equals, "1.2") c.Check(info12.Description(), Equals, "Lots of text") info11, err := snap.ReadInfo("name1", snapst.Sequence[0]) c.Assert(err, IsNil) c.Check(info11.Name(), Equals, "name1") c.Check(info11.Revision, Equals, 11) c.Check(info11.Version, Equals, "1.1") }
func (s *snapmgrTestSuite) TestInstallSubequentLocalIntegration(c *C) { s.state.Lock() defer s.state.Unlock() snapstate.Set(s.state, "mock", &snapstate.SnapState{ Active: true, Sequence: []*snap.SideInfo{{Revision: 100002}}, LocalRevision: 100002, }) mockSnap := makeTestSnap(c, `name: mock version: 1.0`) chg := s.state.NewChange("install", "install a local snap") ts, err := snapstate.InstallPath(s.state, mockSnap, "", 0) c.Assert(err, IsNil) chg.AddAll(ts) s.state.Unlock() defer s.snapmgr.Stop() s.settle() s.state.Lock() // ensure only local install was run, i.e. first action is check-snap c.Assert(s.fakeBackend.ops, HasLen, 6) c.Check(s.fakeBackend.ops[0].op, Equals, "check-snap") c.Check(s.fakeBackend.ops[0].name, Matches, `.*/mock_1.0_all.snap`) c.Check(s.fakeBackend.ops[2].op, Equals, "unlink-snap") c.Check(s.fakeBackend.ops[2].name, Equals, "/snap/mock/100002") c.Check(s.fakeBackend.ops[3].op, Equals, "copy-data") c.Check(s.fakeBackend.ops[3].name, Equals, "/snap/mock/100003") c.Check(s.fakeBackend.ops[3].old, Equals, "/snap/mock/100002") c.Check(s.fakeBackend.ops[4].op, Equals, "candidate") c.Check(s.fakeBackend.ops[4].sinfo, DeepEquals, snap.SideInfo{Revision: 100003}) c.Check(s.fakeBackend.ops[5].op, Equals, "link-snap") c.Check(s.fakeBackend.ops[5].name, Equals, "/snap/mock/100003") // verify snapSetup info var ss snapstate.SnapSetup task := ts.Tasks()[0] err = task.Get("snap-setup", &ss) c.Assert(err, IsNil) c.Assert(ss, DeepEquals, snapstate.SnapSetup{ Name: "mock", Revision: 100003, SnapPath: mockSnap, }) // verify snaps in the system state var snapst snapstate.SnapState err = snapstate.Get(s.state, "mock", &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.Current(), DeepEquals, &snap.SideInfo{ OfficialName: "", Channel: "", Revision: 100003, }) c.Assert(snapst.LocalRevision, Equals, 100003) }