github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/apiserver/diskmanager/diskmanager.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package diskmanager 5 6 import ( 7 "github.com/juju/loggo" 8 "github.com/juju/names" 9 10 "github.com/juju/juju/apiserver/common" 11 "github.com/juju/juju/apiserver/params" 12 "github.com/juju/juju/state" 13 "github.com/juju/juju/storage" 14 ) 15 16 func init() { 17 common.RegisterStandardFacade("DiskManager", 1, NewDiskManagerAPI) 18 } 19 20 var logger = loggo.GetLogger("juju.apiserver.diskmanager") 21 22 // DiskManagerAPI provides access to the DiskManager API facade. 23 type DiskManagerAPI struct { 24 st stateInterface 25 authorizer common.Authorizer 26 getAuthFunc common.GetAuthFunc 27 } 28 29 var getState = func(st *state.State) stateInterface { 30 return stateShim{st} 31 } 32 33 // NewDiskManagerAPI creates a new server-side DiskManager API facade. 34 func NewDiskManagerAPI( 35 st *state.State, 36 resources *common.Resources, 37 authorizer common.Authorizer, 38 ) (*DiskManagerAPI, error) { 39 40 if !authorizer.AuthMachineAgent() { 41 return nil, common.ErrPerm 42 } 43 44 authEntityTag := authorizer.GetAuthTag() 45 getAuthFunc := func() (common.AuthFunc, error) { 46 return func(tag names.Tag) bool { 47 // A machine agent can always access its own machine. 48 return tag == authEntityTag 49 }, nil 50 } 51 52 return &DiskManagerAPI{ 53 st: getState(st), 54 authorizer: authorizer, 55 getAuthFunc: getAuthFunc, 56 }, nil 57 } 58 59 func (d *DiskManagerAPI) SetMachineBlockDevices(args params.SetMachineBlockDevices) (params.ErrorResults, error) { 60 result := params.ErrorResults{ 61 Results: make([]params.ErrorResult, len(args.MachineBlockDevices)), 62 } 63 canAccess, err := d.getAuthFunc() 64 if err != nil { 65 return result, err 66 } 67 for i, arg := range args.MachineBlockDevices { 68 tag, err := names.ParseMachineTag(arg.Machine) 69 if err != nil { 70 result.Results[i].Error = common.ServerError(common.ErrPerm) 71 continue 72 } 73 if !canAccess(tag) { 74 err = common.ErrPerm 75 } else { 76 err = d.st.SetMachineBlockDevices(tag.Id(), stateBlockDeviceInfo(arg.BlockDevices)) 77 } 78 result.Results[i].Error = common.ServerError(err) 79 } 80 return result, nil 81 } 82 83 func stateBlockDeviceInfo(devices []storage.BlockDevice) []state.BlockDeviceInfo { 84 result := make([]state.BlockDeviceInfo, len(devices)) 85 for i, dev := range devices { 86 result[i] = state.BlockDeviceInfo{ 87 dev.DeviceName, 88 dev.Label, 89 dev.UUID, 90 dev.Serial, 91 dev.Size, 92 dev.FilesystemType, 93 dev.InUse, 94 } 95 } 96 return result 97 }