github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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/apiserver/params" 12 "github.com/juju/juju/watcher" 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 handler := &addresserHandler{api: api} 36 aw, err := watcher.NewStringsWorker(watcher.StringsConfig{ 37 Handler: handler, 38 }) 39 if err != nil { 40 return nil, errors.Trace(err) 41 } 42 return aw, nil 43 } 44 45 // SetUp is part of the StringsWorker interface. 46 func (a *addresserHandler) SetUp() (watcher.StringsWatcher, error) { 47 return a.api.WatchIPAddresses() 48 } 49 50 // TearDown is part of the StringsWorker interface. 51 func (a *addresserHandler) TearDown() error { 52 return nil 53 } 54 55 // Handle is part of the StringsWorker interface. 56 func (a *addresserHandler) Handle(_ <-chan struct{}, watcherTags []string) error { 57 // Changed IP address lifes are reported, clean them up. 58 err := a.api.CleanupIPAddresses() 59 if err != nil { 60 // TryAgainError are already logged on server-side. 61 // TODO(mue) Add a time based trigger for the cleanup 62 // so that those to try again will be cleaned up even 63 // without lifecycle changes of IP addresses. 64 if !params.IsCodeTryAgain(err) { 65 return errors.Annotate(err, "cannot cleanup IP addresses") 66 } 67 } else { 68 logger.Tracef("released and removed dead IP addresses") 69 } 70 return nil 71 }