github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/agent/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 "github.com/juju/errors" 10 "github.com/juju/loggo" 11 "gopkg.in/juju/names.v2" 12 13 "github.com/juju/juju/apiserver/common" 14 "github.com/juju/juju/apiserver/common/networkingcommon" 15 "github.com/juju/juju/apiserver/facade" 16 "github.com/juju/juju/apiserver/params" 17 "github.com/juju/juju/state" 18 "github.com/juju/juju/state/multiwatcher" 19 ) 20 21 var logger = loggo.GetLogger("juju.apiserver.machine") 22 23 // MachinerAPI implements the API used by the machiner worker. 24 type MachinerAPI struct { 25 *common.LifeGetter 26 *common.StatusSetter 27 *common.DeadEnsurer 28 *common.AgentEntityWatcher 29 *common.APIAddresser 30 *networkingcommon.NetworkConfigAPI 31 32 st *state.State 33 auth facade.Authorizer 34 getCanModify common.GetAuthFunc 35 getCanRead common.GetAuthFunc 36 } 37 38 // NewMachinerAPI creates a new instance of the Machiner API. 39 func NewMachinerAPI(st *state.State, resources facade.Resources, authorizer facade.Authorizer) (*MachinerAPI, error) { 40 if !authorizer.AuthMachineAgent() { 41 return nil, common.ErrPerm 42 } 43 getCanModify := func() (common.AuthFunc, error) { 44 return authorizer.AuthOwner, nil 45 } 46 getCanRead := func() (common.AuthFunc, error) { 47 return authorizer.AuthOwner, nil 48 } 49 return &MachinerAPI{ 50 LifeGetter: common.NewLifeGetter(st, getCanRead), 51 StatusSetter: common.NewStatusSetter(st, getCanModify), 52 DeadEnsurer: common.NewDeadEnsurer(st, getCanModify), 53 AgentEntityWatcher: common.NewAgentEntityWatcher(st, resources, getCanRead), 54 APIAddresser: common.NewAPIAddresser(st, resources), 55 NetworkConfigAPI: networkingcommon.NewNetworkConfigAPI(st, state.CallContext(st), getCanModify), 56 st: st, 57 auth: authorizer, 58 getCanModify: getCanModify, 59 getCanRead: getCanRead, 60 }, nil 61 } 62 63 func (api *MachinerAPI) getMachine(tag names.Tag) (*state.Machine, error) { 64 entity, err := api.st.FindEntity(tag) 65 if err != nil { 66 return nil, err 67 } 68 return entity.(*state.Machine), nil 69 } 70 71 func (api *MachinerAPI) SetMachineAddresses(args params.SetMachinesAddresses) (params.ErrorResults, error) { 72 results := params.ErrorResults{ 73 Results: make([]params.ErrorResult, len(args.MachineAddresses)), 74 } 75 canModify, err := api.getCanModify() 76 if err != nil { 77 return results, err 78 } 79 for i, arg := range args.MachineAddresses { 80 tag, err := names.ParseMachineTag(arg.Tag) 81 if err != nil { 82 results.Results[i].Error = common.ServerError(common.ErrPerm) 83 continue 84 } 85 err = common.ErrPerm 86 if canModify(tag) { 87 var m *state.Machine 88 m, err = api.getMachine(tag) 89 if err == nil { 90 addresses := params.NetworkAddresses(arg.Addresses...) 91 err = m.SetMachineAddresses(addresses...) 92 } else if errors.IsNotFound(err) { 93 err = common.ErrPerm 94 } 95 } 96 results.Results[i].Error = common.ServerError(err) 97 } 98 return results, nil 99 } 100 101 // Jobs returns the jobs assigned to the given entities. 102 func (api *MachinerAPI) Jobs(args params.Entities) (params.JobsResults, error) { 103 result := params.JobsResults{ 104 Results: make([]params.JobsResult, len(args.Entities)), 105 } 106 107 canRead, err := api.getCanRead() 108 if err != nil { 109 return result, err 110 } 111 112 for i, agent := range args.Entities { 113 tag, err := names.ParseMachineTag(agent.Tag) 114 if err != nil { 115 result.Results[i].Error = common.ServerError(err) 116 continue 117 } 118 119 if !canRead(tag) { 120 result.Results[i].Error = common.ServerError(common.ErrPerm) 121 continue 122 } 123 124 machine, err := api.getMachine(tag) 125 if err != nil { 126 result.Results[i].Error = common.ServerError(err) 127 continue 128 } 129 machineJobs := machine.Jobs() 130 jobs := make([]multiwatcher.MachineJob, len(machineJobs)) 131 for i, job := range machineJobs { 132 jobs[i] = job.ToParams() 133 } 134 result.Results[i].Jobs = jobs 135 } 136 return result, nil 137 }