launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/worker/charmrevisionworker/revisionupdater.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package charmrevisionworker 5 6 import ( 7 "fmt" 8 "launchpad.net/tomb" 9 "time" 10 11 "launchpad.net/juju-core/log" 12 "launchpad.net/juju-core/state/api/charmrevisionupdater" 13 "launchpad.net/juju-core/worker" 14 ) 15 16 // interval sets how often the resuming is called. 17 var interval = 24 * time.Hour 18 19 var _ worker.Worker = (*RevisionUpdateWorker)(nil) 20 21 // RevisionUpdateWorker is responsible for a periodical retrieval of charm versions 22 // from the charm store, and recording the revision status for deployed charms. 23 type RevisionUpdateWorker struct { 24 st *charmrevisionupdater.State 25 tomb tomb.Tomb 26 } 27 28 // NewRevisionUpdateWorker periodically retrieves charm versions from the charm store. 29 func NewRevisionUpdateWorker(st *charmrevisionupdater.State) *RevisionUpdateWorker { 30 ruw := &RevisionUpdateWorker{st: st} 31 go func() { 32 defer ruw.tomb.Done() 33 ruw.tomb.Kill(ruw.loop()) 34 }() 35 return ruw 36 } 37 38 func (ruw *RevisionUpdateWorker) String() string { 39 return fmt.Sprintf("charm version lookup worker") 40 } 41 42 // Stop stops the worker. 43 func (ruw *RevisionUpdateWorker) Stop() error { 44 ruw.tomb.Kill(nil) 45 return ruw.tomb.Wait() 46 } 47 48 // Kill is defined on the worker.Worker interface. 49 func (ruw *RevisionUpdateWorker) Kill() { 50 ruw.tomb.Kill(nil) 51 } 52 53 // Wait is defined on the worker.Worker interface. 54 func (ruw *RevisionUpdateWorker) Wait() error { 55 return ruw.tomb.Wait() 56 } 57 58 func (ruw *RevisionUpdateWorker) loop() error { 59 ruw.updateVersions() 60 for { 61 select { 62 case <-ruw.tomb.Dying(): 63 return tomb.ErrDying 64 case <-time.After(interval): 65 ruw.updateVersions() 66 } 67 } 68 } 69 70 func (ruw *RevisionUpdateWorker) updateVersions() { 71 if err := ruw.st.UpdateLatestRevisions(); err != nil { 72 log.Errorf("worker/charm revision lookup: cannot process charms: %v", err) 73 } 74 }