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 }