launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/state/apiserver/common/setstatus.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/juju-core/errors"
     8  	"launchpad.net/juju-core/state"
     9  	"launchpad.net/juju-core/state/api/params"
    10  )
    11  
    12  // StatusSetter implements a common SetStatus method for use by
    13  // various facades.
    14  type StatusSetter struct {
    15  	st           state.EntityFinder
    16  	getCanModify GetAuthFunc
    17  }
    18  
    19  // NewStatusSetter returns a new StatusSetter. The GetAuthFunc will be
    20  // used on each invocation of SetStatus to determine current
    21  // permissions.
    22  func NewStatusSetter(st state.EntityFinder, getCanModify GetAuthFunc) *StatusSetter {
    23  	return &StatusSetter{
    24  		st:           st,
    25  		getCanModify: getCanModify,
    26  	}
    27  }
    28  
    29  func (s *StatusSetter) setEntityStatus(tag string, status params.Status, info string, data params.StatusData) error {
    30  	entity0, err := s.st.FindEntity(tag)
    31  	if err != nil {
    32  		return mask(err, errors.IsNotFoundError)
    33  	}
    34  	entity, ok := entity0.(state.StatusSetter)
    35  	if !ok {
    36  		return NotSupportedError(tag, "setting status")
    37  	}
    38  	return entity.SetStatus(status, info, data)
    39  }
    40  
    41  // SetStatus sets the status of each given entity.
    42  func (s *StatusSetter) SetStatus(args params.SetStatus) (params.ErrorResults, error) {
    43  	result := params.ErrorResults{
    44  		Results: make([]params.ErrorResult, len(args.Entities)),
    45  	}
    46  	if len(args.Entities) == 0 {
    47  		return result, nil
    48  	}
    49  	canModify, err := s.getCanModify()
    50  	if err != nil {
    51  		return params.ErrorResults{}, mask(err)
    52  	}
    53  	for i, arg := range args.Entities {
    54  		err := ErrPerm
    55  		if canModify(arg.Tag) {
    56  			err = s.setEntityStatus(arg.Tag, arg.Status, arg.Info, arg.Data)
    57  		}
    58  		result.Results[i].Error = ServerError(err)
    59  	}
    60  	return result, nil
    61  }