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  }