launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/worker/minunitsworker/minunitsworker.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package minunitsworker
     5  
     6  import (
     7  	"github.com/loggo/loggo"
     8  
     9  	"launchpad.net/errgo/errors"
    10  	"launchpad.net/juju-core/state"
    11  	"launchpad.net/juju-core/state/api/watcher"
    12  	"launchpad.net/juju-core/worker"
    13  )
    14  
    15  var logger = loggo.GetLogger("juju.worker.minunitsworker")
    16  
    17  var mask = errors.Mask
    18  
    19  // MinUnitsWorker ensures the minimum number of units for services is respected.
    20  type MinUnitsWorker struct {
    21  	st *state.State
    22  }
    23  
    24  // NewMinUnitsWorker returns a Worker that runs service.EnsureMinUnits()
    25  // if the number of alive units belonging to a service decreases, or if the
    26  // minimum required number of units for a service is increased.
    27  func NewMinUnitsWorker(st *state.State) worker.Worker {
    28  	mu := &MinUnitsWorker{st: st}
    29  	return worker.NewStringsWorker(mu)
    30  }
    31  
    32  func (mu *MinUnitsWorker) SetUp() (watcher.StringsWatcher, error) {
    33  	return mu.st.WatchMinUnits(), nil
    34  }
    35  
    36  func (mu *MinUnitsWorker) handleOneService(serviceName string) error {
    37  	service, err := mu.st.Service(serviceName)
    38  	if err != nil {
    39  		return mask(err)
    40  	}
    41  	return service.EnsureMinUnits()
    42  }
    43  
    44  func (mu *MinUnitsWorker) Handle(serviceNames []string) error {
    45  	for _, name := range serviceNames {
    46  		logger.Infof("processing service %q", name)
    47  		if err := mu.handleOneService(name); err != nil {
    48  			logger.Errorf("failed to process service %q: %v", name, err)
    49  			return err
    50  		}
    51  	}
    52  	return nil
    53  }
    54  
    55  func (mu *MinUnitsWorker) TearDown() error {
    56  	// Nothing to do here.
    57  	return nil
    58  }