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