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