// allLocalSnapInfos returns the information about the all current snaps and their SnapStates. func allLocalSnapInfos(st *state.State) ([]aboutSnap, error) { st.Lock() defer st.Unlock() snapStates, err := snapstate.All(st) if err != nil { return nil, err } about := make([]aboutSnap, 0, len(snapStates)) var firstErr error for name, snapState := range snapStates { info, err := snap.ReadInfo(name, snapState.Current()) if err != nil { // XXX: aggregate instead? if firstErr == nil { firstErr = err } continue } about = append(about, aboutSnap{info, snapState}) } return about, firstErr }
func newRunnerManager(s *state.State) *runnerManager { rm := &runnerManager{ runner: state.NewTaskRunner(s), } rm.runner.AddHandler("runMgr1", func(t *state.Task, _ *tomb.Tomb) error { s := t.State() s.Lock() defer s.Unlock() s.Set("runMgr1Mark", 1) return nil }, nil) rm.runner.AddHandler("runMgr2", func(t *state.Task, _ *tomb.Tomb) error { s := t.State() s.Lock() defer s.Unlock() s.Set("runMgr2Mark", 1) return nil }, nil) rm.runner.AddHandler("runMgrEnsureBefore", func(t *state.Task, _ *tomb.Tomb) error { s := t.State() s.Lock() defer s.Unlock() s.EnsureBefore(20 * time.Millisecond) return nil }, nil) return rm }
// 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 }