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 }