launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/state/apiserver/common/environmachineswatcher.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package common 5 6 import ( 7 "launchpad.net/errgo/errors" 8 "launchpad.net/juju-core/state" 9 "launchpad.net/juju-core/state/api/params" 10 "launchpad.net/juju-core/state/watcher" 11 ) 12 13 // EnvironMachinesWatcher implements a common WatchEnvironMachines 14 // method for use by various facades. 15 type EnvironMachinesWatcher struct { 16 st state.EnvironMachinesWatcher 17 resources *Resources 18 getCanWatch GetAuthFunc 19 } 20 21 // NewEnvironMachinesWatcher returns a new EnvironMachinesWatcher. The 22 // GetAuthFunc will be used on each invocation of WatchUnits to 23 // determine current permissions. 24 func NewEnvironMachinesWatcher(st state.EnvironMachinesWatcher, resources *Resources, getCanWatch GetAuthFunc) *EnvironMachinesWatcher { 25 return &EnvironMachinesWatcher{ 26 st: st, 27 resources: resources, 28 getCanWatch: getCanWatch, 29 } 30 } 31 32 // WatchEnvironMachines returns a StringsWatcher that notifies of 33 // changes to the life cycles of the top level machines in the current 34 // environment. 35 func (e *EnvironMachinesWatcher) WatchEnvironMachines() (params.StringsWatchResult, error) { 36 result := params.StringsWatchResult{} 37 canWatch, err := e.getCanWatch() 38 if err != nil { 39 return params.StringsWatchResult{}, mask(err) 40 } 41 if !canWatch("") { 42 return result, ErrPerm 43 } 44 watch := e.st.WatchEnvironMachines() 45 // Consume the initial event and forward it to the result. 46 if changes, ok := <-watch.Changes(); ok { 47 result.StringsWatcherId = e.resources.Register(watch) 48 result.Changes = changes 49 } else { 50 err := watcher.MustErr(watch) 51 return result, errors.Notef(err, "cannot obtain initial environment machines") 52 } 53 return result, nil 54 }