github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/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 "time" 9 10 "github.com/juju/loggo" 11 "launchpad.net/tomb" 12 13 "github.com/juju/juju/state/api/charmrevisionupdater" 14 "github.com/juju/juju/worker" 15 ) 16 17 var logger = loggo.GetLogger("juju.worker.charmrevisionworker") 18 19 // interval sets how often the resuming is called. 20 var interval = 24 * time.Hour 21 22 var _ worker.Worker = (*RevisionUpdateWorker)(nil) 23 24 // RevisionUpdateWorker is responsible for a periodical retrieval of charm versions 25 // from the charm store, and recording the revision status for deployed charms. 26 type RevisionUpdateWorker struct { 27 st *charmrevisionupdater.State 28 tomb tomb.Tomb 29 } 30 31 // NewRevisionUpdateWorker periodically retrieves charm versions from the charm store. 32 func NewRevisionUpdateWorker(st *charmrevisionupdater.State) *RevisionUpdateWorker { 33 ruw := &RevisionUpdateWorker{st: st} 34 go func() { 35 defer ruw.tomb.Done() 36 ruw.tomb.Kill(ruw.loop()) 37 }() 38 return ruw 39 } 40 41 func (ruw *RevisionUpdateWorker) String() string { 42 return fmt.Sprintf("charm version lookup worker") 43 } 44 45 // Stop stops the worker. 46 func (ruw *RevisionUpdateWorker) Stop() error { 47 ruw.tomb.Kill(nil) 48 return ruw.tomb.Wait() 49 } 50 51 // Kill is defined on the worker.Worker interface. 52 func (ruw *RevisionUpdateWorker) Kill() { 53 ruw.tomb.Kill(nil) 54 } 55 56 // Wait is defined on the worker.Worker interface. 57 func (ruw *RevisionUpdateWorker) Wait() error { 58 return ruw.tomb.Wait() 59 } 60 61 func (ruw *RevisionUpdateWorker) loop() error { 62 ruw.updateVersions() 63 for { 64 select { 65 case <-ruw.tomb.Dying(): 66 return tomb.ErrDying 67 case <-time.After(interval): 68 ruw.updateVersions() 69 } 70 } 71 } 72 73 func (ruw *RevisionUpdateWorker) updateVersions() { 74 if err := ruw.st.UpdateLatestRevisions(); err != nil { 75 logger.Errorf("cannot process charms: %v", err) 76 } 77 }