github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/apiserver/storageprovisioner/shim.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package storageprovisioner 5 6 import ( 7 "github.com/juju/errors" 8 "gopkg.in/juju/names.v2" 9 10 "github.com/juju/juju/apiserver/common" 11 "github.com/juju/juju/apiserver/facade" 12 "github.com/juju/juju/controller" 13 "github.com/juju/juju/environs" 14 "github.com/juju/juju/instance" 15 "github.com/juju/juju/state" 16 "github.com/juju/juju/state/stateenvirons" 17 "github.com/juju/juju/storage/poolmanager" 18 ) 19 20 // This file contains untested shims to let us wrap state in a sensible 21 // interface and avoid writing tests that depend on mongodb. If you were 22 // to change any part of it so that it were no longer *obviously* and 23 // *trivially* correct, you would be Doing It Wrong. 24 25 func init() { 26 common.RegisterStandardFacade("StorageProvisioner", 3, newStorageProvisionerAPI) 27 } 28 29 func newStorageProvisionerAPI(st *state.State, resources facade.Resources, authorizer facade.Authorizer) (*StorageProvisionerAPI, error) { 30 env, err := stateenvirons.GetNewEnvironFunc(environs.New)(st) 31 if err != nil { 32 return nil, errors.Annotate(err, "getting environ") 33 } 34 registry := stateenvirons.NewStorageProviderRegistry(env) 35 pm := poolmanager.New(state.NewStateSettings(st), registry) 36 return NewStorageProvisionerAPI(stateShim{st}, resources, authorizer, registry, pm) 37 } 38 39 type Backend interface { 40 state.EntityFinder 41 state.ModelAccessor 42 43 ControllerConfig() (controller.Config, error) 44 MachineInstanceId(names.MachineTag) (instance.Id, error) 45 ModelTag() names.ModelTag 46 BlockDevices(names.MachineTag) ([]state.BlockDeviceInfo, error) 47 48 WatchBlockDevices(names.MachineTag) state.NotifyWatcher 49 WatchMachine(names.MachineTag) (state.NotifyWatcher, error) 50 WatchModelFilesystems() state.StringsWatcher 51 WatchEnvironFilesystemAttachments() state.StringsWatcher 52 WatchMachineFilesystems(names.MachineTag) state.StringsWatcher 53 WatchMachineFilesystemAttachments(names.MachineTag) state.StringsWatcher 54 WatchModelVolumes() state.StringsWatcher 55 WatchEnvironVolumeAttachments() state.StringsWatcher 56 WatchMachineVolumes(names.MachineTag) state.StringsWatcher 57 WatchMachineVolumeAttachments(names.MachineTag) state.StringsWatcher 58 WatchVolumeAttachment(names.MachineTag, names.VolumeTag) state.NotifyWatcher 59 60 StorageInstance(names.StorageTag) (state.StorageInstance, error) 61 62 Filesystem(names.FilesystemTag) (state.Filesystem, error) 63 FilesystemAttachment(names.MachineTag, names.FilesystemTag) (state.FilesystemAttachment, error) 64 65 Volume(names.VolumeTag) (state.Volume, error) 66 VolumeAttachment(names.MachineTag, names.VolumeTag) (state.VolumeAttachment, error) 67 VolumeAttachments(names.VolumeTag) ([]state.VolumeAttachment, error) 68 69 RemoveFilesystem(names.FilesystemTag) error 70 RemoveFilesystemAttachment(names.MachineTag, names.FilesystemTag) error 71 RemoveVolume(names.VolumeTag) error 72 RemoveVolumeAttachment(names.MachineTag, names.VolumeTag) error 73 74 SetFilesystemInfo(names.FilesystemTag, state.FilesystemInfo) error 75 SetFilesystemAttachmentInfo(names.MachineTag, names.FilesystemTag, state.FilesystemAttachmentInfo) error 76 SetVolumeInfo(names.VolumeTag, state.VolumeInfo) error 77 SetVolumeAttachmentInfo(names.MachineTag, names.VolumeTag, state.VolumeAttachmentInfo) error 78 } 79 80 type stateShim struct { 81 *state.State 82 } 83 84 // NewStateBackend creates a Backend from the given *state.State. 85 func NewStateBackend(st *state.State) Backend { 86 return stateShim{st} 87 } 88 89 func (s stateShim) MachineInstanceId(tag names.MachineTag) (instance.Id, error) { 90 m, err := s.Machine(tag.Id()) 91 if err != nil { 92 return "", errors.Trace(err) 93 } 94 return m.InstanceId() 95 } 96 97 func (s stateShim) WatchMachine(tag names.MachineTag) (state.NotifyWatcher, error) { 98 m, err := s.Machine(tag.Id()) 99 if err != nil { 100 return nil, errors.Trace(err) 101 } 102 return m.Watch(), nil 103 }