github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/worker/instancepoller/worker.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package instancepoller 5 6 import ( 7 "github.com/juju/names" 8 "launchpad.net/tomb" 9 10 apiinstancepoller "github.com/juju/juju/api/instancepoller" 11 apiwatcher "github.com/juju/juju/api/watcher" 12 "github.com/juju/juju/worker" 13 ) 14 15 type updaterWorker struct { 16 st *apiinstancepoller.API 17 tomb tomb.Tomb 18 *aggregator 19 20 observer *worker.EnvironObserver 21 } 22 23 // NewWorker returns a worker that keeps track of 24 // the machines in the state and polls their instance 25 // addresses and status periodically to keep them up to date. 26 func NewWorker(st *apiinstancepoller.API) worker.Worker { 27 u := &updaterWorker{ 28 st: st, 29 } 30 // wait for environment 31 go func() { 32 defer u.tomb.Done() 33 u.tomb.Kill(u.loop()) 34 }() 35 return u 36 } 37 38 func (u *updaterWorker) Kill() { 39 u.tomb.Kill(nil) 40 } 41 42 func (u *updaterWorker) Wait() error { 43 return u.tomb.Wait() 44 } 45 46 func (u *updaterWorker) loop() (err error) { 47 u.observer, err = worker.NewEnvironObserver(u.st) 48 if err != nil { 49 return err 50 } 51 u.aggregator = newAggregator(u.observer.Environ()) 52 logger.Infof("instance poller received inital environment configuration") 53 defer func() { 54 obsErr := worker.Stop(u.observer) 55 if err == nil { 56 err = obsErr 57 } 58 }() 59 var w apiwatcher.StringsWatcher 60 w, err = u.st.WatchEnvironMachines() 61 if err != nil { 62 return err 63 } 64 return watchMachinesLoop(u, w) 65 } 66 67 func (u *updaterWorker) newMachineContext() machineContext { 68 return u 69 } 70 71 func (u *updaterWorker) getMachine(tag names.MachineTag) (machine, error) { 72 return u.st.Machine(tag) 73 } 74 75 func (u *updaterWorker) dying() <-chan struct{} { 76 return u.tomb.Dying() 77 } 78 79 func (u *updaterWorker) killAll(err error) { 80 u.tomb.Kill(err) 81 }