github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/apiserver/uniter/storage.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package uniter 5 6 import ( 7 "github.com/juju/names" 8 9 "github.com/juju/juju/apiserver/common" 10 "github.com/juju/juju/apiserver/params" 11 "github.com/juju/juju/state" 12 "github.com/juju/juju/storage" 13 ) 14 15 // StorageAPI provides access to the Storage API facade. 16 type StorageAPI struct { 17 st storageStateInterface 18 resources *common.Resources 19 accessUnit common.GetAuthFunc 20 } 21 22 // NewStorageAPI creates a new server-side Storage API facade. 23 func NewStorageAPI( 24 st *state.State, 25 resources *common.Resources, 26 accessUnit common.GetAuthFunc, 27 ) (*StorageAPI, error) { 28 29 return &StorageAPI{ 30 st: getStorageState(st), 31 resources: resources, 32 accessUnit: accessUnit, 33 }, nil 34 } 35 36 // UnitStorageInstances returns the storage instances for a collection of units. 37 func (s *StorageAPI) UnitStorageInstances(args params.Entities) (params.UnitStorageInstancesResults, error) { 38 canAccess, err := s.accessUnit() 39 if err != nil { 40 return params.UnitStorageInstancesResults{}, err 41 } 42 result := params.UnitStorageInstancesResults{ 43 UnitsStorageInstances: make([]params.UnitStorageInstances, len(args.Entities)), 44 } 45 for i, entity := range args.Entities { 46 result.UnitsStorageInstances[i] = s.getOneUnitStorageInstances(canAccess, entity.Tag) 47 } 48 return result, nil 49 } 50 51 func (s *StorageAPI) getOneUnitStorageInstances(canAccess common.AuthFunc, unitTag string) params.UnitStorageInstances { 52 tag, err := names.ParseUnitTag(unitTag) 53 if err != nil { 54 return params.UnitStorageInstances{Error: common.ServerError(common.ErrPerm)} 55 } 56 if !canAccess(tag) { 57 return params.UnitStorageInstances{Error: common.ServerError(common.ErrPerm)} 58 } 59 unit, err := s.st.Unit(tag.Id()) 60 if err != nil { 61 return params.UnitStorageInstances{Error: common.ServerError(common.ErrPerm)} 62 } 63 var result params.UnitStorageInstances 64 for _, storageId := range unit.StorageInstanceIds() { 65 stateStorageInstance, err := s.st.StorageInstance(storageId) 66 if err != nil { 67 result.Error = common.ServerError(err) 68 result.Instances = nil 69 break 70 } 71 storageInstance := storage.StorageInstance{ 72 stateStorageInstance.Id(), 73 storage.StorageKind(stateStorageInstance.Kind()), 74 "", //TODO - add Location 75 } 76 result.Instances = append(result.Instances, storageInstance) 77 } 78 return result 79 }