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  }