snapstate: add support for refresh.schedule=managed #4161

Merged
merged 36 commits into from Nov 29, 2017
Commits
Jump to file or symbol
Failed to load files and symbols.
+77 −21
Split
Viewing a subset of changes. View all

snapstate: move refresh hints handling into its own struct

  • Loading branch information...
commit 36b10fc142a9558a1e0db8b543d7d591e6c9feb4 @mvo5 mvo5 committed Nov 21, 2017
@@ -0,0 +1,70 @@
+// -*- Mode: Go; indent-tabs-mode: t -*-
+
+/*
+ * Copyright (C) 2017 Canonical Ltd
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package snapstate
+
+import (
+ "time"
+
+ "github.com/snapcore/snapd/overlord/state"
+ "github.com/snapcore/snapd/store"
+)
+
+var refreshHintsDelay = time.Duration(24 * time.Hour)
+
+type refreshHints struct {
+ state *state.State
+}
+
+func newRefreshHints(st *state.State) *refreshHints {
+ return &refreshHints{state: st}
+}
+
+func (r *refreshHints) lastRefresh() (time.Time, error) {
+ var lastRefresh time.Time
+ if err := r.state.Get("last-refresh-hints", &lastRefresh); err != nil && err != state.ErrNoState {
+ return time.Time{}, err
+ }
+ return lastRefresh, nil
+}
+
+func (r *refreshHints) needsUpdate() (bool, error) {
+ t, err := r.lastRefresh()
+ if err != nil {
+ return false, err
+ }
+ return t.Before(time.Now().Add(-refreshHintsDelay)), nil
+}
+
+func (r *refreshHints) refresh() error {
+ _, _, _, err := refreshCandidates(r.state, nil, nil, &store.RefreshOptions{RefreshManaged: true})
+ r.state.Set("last-refresh-hints", time.Now())
+ return err
+}
+
+func (r *refreshHints) Ensure() error {
+ needsUpdate, err := r.needsUpdate()
+ if err != nil {
+ return err
+ }
+ if !needsUpdate {
+ return nil
+ }
+ return r.refresh()
+}
@@ -79,6 +79,8 @@ type SnapManager struct {
nextRefresh time.Time
lastRefreshAttempt time.Time
+ refreshHints *refreshHints
+
nextCatalogRefresh time.Time
lastUbuntuCoreTransitionAttempt time.Time
@@ -300,9 +302,10 @@ func Manager(st *state.State) (*SnapManager, error) {
runner := state.NewTaskRunner(st)
m := &SnapManager{
- state: st,
- backend: backend.Backend{},
- runner: runner,
+ state: st,
+ backend: backend.Backend{},
+ runner: runner,
+ refreshHints: newRefreshHints(st),
}
if err := os.MkdirAll(dirs.SnapCookieDir, 0700); err != nil {
@@ -516,23 +519,6 @@ func (m *SnapManager) NextCatalogRefresh() time.Time {
return m.nextCatalogRefresh
}
-// checkRefreshHints will check for refrehes every 24h regardless of the
-// refresh schedule to be able to provide hints about outdated packages
-// to the user once we have the warning system in place.
-func (m *SnapManager) checkRefreshHints() error {
- var lastRefreshHints time.Time
- if err := m.state.Get("last-refresh-hints", &lastRefreshHints); err != nil && err != state.ErrNoState {
- return err
- }
- if lastRefreshHints.Before(time.Now().Add(-time.Duration(24 * time.Hour))) {
- if _, _, _, err := refreshCandidates(m.state, nil, nil, &store.RefreshOptions{RefreshManaged: true}); err != nil {
- return err
- }
- m.state.Set("last-refresh-hints", time.Now())
- }
- return nil
-}
-
// ensureRefreshes ensures that we refresh all installed snaps periodically
func (m *SnapManager) ensureRefreshes() error {
m.state.Lock()
@@ -547,7 +533,7 @@ func (m *SnapManager) ensureRefreshes() error {
}
// always check refresh hints
- m.checkRefreshHints()
+ m.refreshHints.Ensure()
// get lastRefresh and schedule
lastRefresh, err := m.LastRefresh()