launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/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 "launchpad.net/tomb" 8 9 "launchpad.net/juju-core/instance" 10 "launchpad.net/juju-core/state" 11 "launchpad.net/juju-core/worker" 12 ) 13 14 type updaterWorker struct { 15 st *state.State 16 tomb tomb.Tomb 17 18 observer *environObserver 19 } 20 21 // NewWorker returns a worker that keeps track of 22 // the machines in the state and polls their instance 23 // addresses and status periodically to keep them up to date. 24 func NewWorker(st *state.State) worker.Worker { 25 u := &updaterWorker{ 26 st: st, 27 } 28 // wait for environment 29 go func() { 30 defer u.tomb.Done() 31 u.tomb.Kill(u.loop()) 32 }() 33 return u 34 } 35 36 func (u *updaterWorker) Kill() { 37 u.tomb.Kill(nil) 38 } 39 40 func (u *updaterWorker) Wait() error { 41 return u.tomb.Wait() 42 } 43 44 func (u *updaterWorker) loop() (err error) { 45 u.observer, err = newEnvironObserver(u.st, u.tomb.Dying()) 46 if err != nil { 47 return mask(err) 48 } 49 logger.Infof("instance poller received inital environment configuration") 50 defer func() { 51 obsErr := worker.Stop(u.observer) 52 if err == nil { 53 err = obsErr 54 } 55 }() 56 return watchMachinesLoop(u, u.st.WatchEnvironMachines()) 57 } 58 59 func (u *updaterWorker) newMachineContext() machineContext { 60 return u 61 } 62 63 func (u *updaterWorker) getMachine(id string) (machine, error) { 64 return u.st.Machine(id) 65 } 66 67 func (u *updaterWorker) dying() <-chan struct{} { 68 return u.tomb.Dying() 69 } 70 71 func (u *updaterWorker) killAll(err error) { 72 u.tomb.Kill(err) 73 } 74 75 func (u *updaterWorker) instanceInfo(id instance.Id) (instanceInfo, error) { 76 env := u.observer.Environ() 77 insts, err := env.Instances([]instance.Id{id}) 78 if err != nil { 79 return instanceInfo{}, mask(err) 80 } 81 addr, err := insts[0].Addresses() 82 if err != nil { 83 return instanceInfo{}, mask(err) 84 } 85 return instanceInfo{ 86 addr, 87 insts[0].Status(), 88 }, nil 89 }