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  }