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  }