launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/state/apiserver/machine/machiner.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  // The machiner package implements the API interface
     5  // used by the machiner worker.
     6  package machine
     7  
     8  import (
     9  	errgo "launchpad.net/errgo/errors"
    10  	"launchpad.net/juju-core/errors"
    11  	"launchpad.net/juju-core/state"
    12  	"launchpad.net/juju-core/state/api/params"
    13  	"launchpad.net/juju-core/state/apiserver/common"
    14  )
    15  
    16  var mask = errgo.Mask
    17  
    18  // MachinerAPI implements the API used by the machiner worker.
    19  type MachinerAPI struct {
    20  	*common.LifeGetter
    21  	*common.StatusSetter
    22  	*common.DeadEnsurer
    23  	*common.AgentEntityWatcher
    24  
    25  	st           *state.State
    26  	auth         common.Authorizer
    27  	getCanModify common.GetAuthFunc
    28  	getCanRead   common.GetAuthFunc
    29  }
    30  
    31  // NewMachinerAPI creates a new instance of the Machiner API.
    32  func NewMachinerAPI(st *state.State, resources *common.Resources, authorizer common.Authorizer) (*MachinerAPI, error) {
    33  	if !authorizer.AuthMachineAgent() {
    34  		return nil, common.ErrPerm
    35  	}
    36  	getCanModify := func() (common.AuthFunc, error) {
    37  		return authorizer.AuthOwner, nil
    38  	}
    39  	getCanRead := func() (common.AuthFunc, error) {
    40  		return authorizer.AuthOwner, nil
    41  	}
    42  	return &MachinerAPI{
    43  		LifeGetter:         common.NewLifeGetter(st, getCanRead),
    44  		StatusSetter:       common.NewStatusSetter(st, getCanModify),
    45  		DeadEnsurer:        common.NewDeadEnsurer(st, getCanModify),
    46  		AgentEntityWatcher: common.NewAgentEntityWatcher(st, resources, getCanRead),
    47  		st:                 st,
    48  		auth:               authorizer,
    49  		getCanModify:       getCanModify,
    50  	}, nil
    51  }
    52  
    53  func (api *MachinerAPI) getMachine(tag string) (*state.Machine, error) {
    54  	entity, err := api.st.FindEntity(tag)
    55  	if err != nil {
    56  		return nil, mask(err)
    57  	}
    58  	return entity.(*state.Machine), nil
    59  }
    60  
    61  func (api *MachinerAPI) SetMachineAddresses(args params.SetMachinesAddresses) (params.ErrorResults, error) {
    62  	results := params.ErrorResults{
    63  		Results: make([]params.ErrorResult, len(args.MachineAddresses)),
    64  	}
    65  	canModify, err := api.getCanModify()
    66  	if err != nil {
    67  		return params.ErrorResults{}, mask(err)
    68  	}
    69  	for i, arg := range args.MachineAddresses {
    70  		err := common.ErrPerm
    71  		if canModify(arg.Tag) {
    72  			var m *state.Machine
    73  			m, err = api.getMachine(arg.Tag)
    74  			if err == nil {
    75  				err = m.SetMachineAddresses(arg.Addresses)
    76  			} else if errors.IsNotFoundError(err) {
    77  				err = common.ErrPerm
    78  			}
    79  		}
    80  		results.Results[i].Error = common.ServerError(err)
    81  	}
    82  	return results, nil
    83  }