github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/worker/addresser/worker.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package addresser 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/loggo" 9 10 apiaddresser "github.com/juju/juju/api/addresser" 11 "github.com/juju/juju/api/watcher" 12 "github.com/juju/juju/apiserver/params" 13 "github.com/juju/juju/worker" 14 ) 15 16 var logger = loggo.GetLogger("juju.worker.addresser") 17 18 type addresserHandler struct { 19 api *apiaddresser.API 20 } 21 22 // NewWorker returns a worker that keeps track of IP address 23 // lifecycles, releaseing and removing dead addresses. 24 func NewWorker(api *apiaddresser.API) (worker.Worker, error) { 25 ok, err := api.CanDeallocateAddresses() 26 if err != nil { 27 return nil, errors.Annotate(err, "checking address deallocation") 28 } 29 if !ok { 30 // Environment does not support IP address 31 // deallocation. 32 logger.Debugf("address deallocation not supported; not starting worker") 33 return worker.FinishedWorker{}, nil 34 } 35 ah := &addresserHandler{ 36 api: api, 37 } 38 aw := worker.NewStringsWorker(ah) 39 return aw, nil 40 } 41 42 // SetUp is part of the StringsWorker interface. 43 func (a *addresserHandler) SetUp() (watcher.StringsWatcher, error) { 44 // WatchIPAddresses returns an EntityWatcher which is a StringsWatcher. 45 return a.api.WatchIPAddresses() 46 } 47 48 // TearDown is part of the StringsWorker interface. 49 func (a *addresserHandler) TearDown() error { 50 return nil 51 } 52 53 // Handle is part of the Worker interface. 54 func (a *addresserHandler) Handle(watcherTags []string) error { 55 // Changed IP address lifes are reported, clean them up. 56 err := a.api.CleanupIPAddresses() 57 if err != nil { 58 // TryAgainError are already logged on server-side. 59 // TODO(mue) Add a time based trigger for the cleanup 60 // so that those to try again will be cleaned up even 61 // without lifecycle changes of IP addresses. 62 if !params.IsCodeTryAgain(err) { 63 return errors.Annotate(err, "cannot cleanup IP addresses") 64 } 65 } else { 66 logger.Tracef("released and removed dead IP addresses") 67 } 68 return nil 69 }