github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/agent/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/facade" 11 "github.com/juju/juju/caas" 12 "github.com/juju/juju/controller" 13 "github.com/juju/juju/core/instance" 14 "github.com/juju/juju/environs" 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 // NewFacadeV3 provides the signature required for facade registration. 26 func NewFacadeV3(st *state.State, resources facade.Resources, authorizer facade.Authorizer) (*StorageProvisionerAPIv3, error) { 27 model, err := st.Model() 28 if err != nil { 29 return nil, errors.Trace(err) 30 } 31 registry, err := stateenvirons.NewStorageProviderRegistryForModel( 32 model, 33 stateenvirons.GetNewEnvironFunc(environs.New), 34 stateenvirons.GetNewCAASBrokerFunc(caas.New)) 35 pm := poolmanager.New(state.NewStateSettings(st), registry) 36 37 backend, storageBackend, err := NewStateBackends(st) 38 if err != nil { 39 return nil, errors.Annotate(err, "getting backend") 40 } 41 return NewStorageProvisionerAPIv3(backend, storageBackend, resources, authorizer, registry, pm) 42 } 43 44 // NewFacadeV4 provides the signature required for facade registration. 45 func NewFacadeV4(st *state.State, resources facade.Resources, authorizer facade.Authorizer) (*StorageProvisionerAPIv4, error) { 46 v3, err := NewFacadeV3(st, resources, authorizer) 47 if err != nil { 48 return nil, errors.Trace(err) 49 } 50 return NewStorageProvisionerAPIv4(v3), nil 51 } 52 53 type Backend interface { 54 state.EntityFinder 55 state.ModelAccessor 56 57 ControllerConfig() (controller.Config, error) 58 MachineInstanceId(names.MachineTag) (instance.Id, error) 59 ModelTag() names.ModelTag 60 WatchMachine(names.MachineTag) (state.NotifyWatcher, error) 61 WatchApplications() state.StringsWatcher 62 } 63 64 type StorageBackend interface { 65 BlockDevices(names.MachineTag) ([]state.BlockDeviceInfo, error) 66 67 WatchBlockDevices(names.MachineTag) state.NotifyWatcher 68 WatchModelFilesystems() state.StringsWatcher 69 WatchModelFilesystemAttachments() state.StringsWatcher 70 WatchMachineFilesystems(names.MachineTag) state.StringsWatcher 71 WatchUnitFilesystems(tag names.ApplicationTag) state.StringsWatcher 72 WatchMachineFilesystemAttachments(names.MachineTag) state.StringsWatcher 73 WatchUnitFilesystemAttachments(tag names.ApplicationTag) state.StringsWatcher 74 WatchModelVolumes() state.StringsWatcher 75 WatchModelVolumeAttachments() state.StringsWatcher 76 WatchMachineVolumes(names.MachineTag) state.StringsWatcher 77 WatchMachineVolumeAttachments(names.MachineTag) state.StringsWatcher 78 WatchUnitVolumeAttachments(tag names.ApplicationTag) state.StringsWatcher 79 WatchVolumeAttachment(names.Tag, names.VolumeTag) state.NotifyWatcher 80 WatchMachineAttachmentsPlans(names.MachineTag) state.StringsWatcher 81 82 StorageInstance(names.StorageTag) (state.StorageInstance, error) 83 AllStorageInstances() ([]state.StorageInstance, error) 84 StorageInstanceVolume(names.StorageTag) (state.Volume, error) 85 StorageInstanceFilesystem(names.StorageTag) (state.Filesystem, error) 86 ReleaseStorageInstance(names.StorageTag, bool) error 87 DetachStorage(names.StorageTag, names.UnitTag) error 88 89 Filesystem(names.FilesystemTag) (state.Filesystem, error) 90 FilesystemAttachment(names.Tag, names.FilesystemTag) (state.FilesystemAttachment, error) 91 92 Volume(names.VolumeTag) (state.Volume, error) 93 VolumeAttachment(names.Tag, names.VolumeTag) (state.VolumeAttachment, error) 94 VolumeAttachments(names.VolumeTag) ([]state.VolumeAttachment, error) 95 VolumeAttachmentPlan(names.Tag, names.VolumeTag) (state.VolumeAttachmentPlan, error) 96 VolumeAttachmentPlans(volume names.VolumeTag) ([]state.VolumeAttachmentPlan, error) 97 98 RemoveFilesystem(names.FilesystemTag) error 99 RemoveFilesystemAttachment(names.Tag, names.FilesystemTag) error 100 RemoveVolume(names.VolumeTag) error 101 RemoveVolumeAttachment(names.Tag, names.VolumeTag) error 102 DetachFilesystem(names.Tag, names.FilesystemTag) error 103 DestroyFilesystem(names.FilesystemTag) error 104 DetachVolume(names.Tag, names.VolumeTag) error 105 DestroyVolume(names.VolumeTag) error 106 107 SetFilesystemInfo(names.FilesystemTag, state.FilesystemInfo) error 108 SetFilesystemAttachmentInfo(names.Tag, names.FilesystemTag, state.FilesystemAttachmentInfo) error 109 SetVolumeInfo(names.VolumeTag, state.VolumeInfo) error 110 SetVolumeAttachmentInfo(names.Tag, names.VolumeTag, state.VolumeAttachmentInfo) error 111 112 CreateVolumeAttachmentPlan(names.Tag, names.VolumeTag, state.VolumeAttachmentPlanInfo) error 113 RemoveVolumeAttachmentPlan(names.Tag, names.VolumeTag) error 114 SetVolumeAttachmentPlanBlockInfo(machineTag names.Tag, volumeTag names.VolumeTag, info state.BlockDeviceInfo) error 115 } 116 117 // TODO - CAAS(ericclaudejones): This should contain state alone, model will be 118 // removed once all relevant methods are moved from state to model. 119 type stateShim struct { 120 *state.State 121 *state.Model 122 } 123 124 // NewStateBackends creates a Backend from the given *state.State. 125 func NewStateBackends(st *state.State) (Backend, StorageBackend, error) { 126 m, err := st.Model() 127 if err != nil { 128 return nil, nil, err 129 } 130 sb, err := state.NewStorageBackend(st) 131 if err != nil { 132 return nil, nil, err 133 } 134 return stateShim{State: st, Model: m}, sb, nil 135 } 136 137 func (s stateShim) MachineInstanceId(tag names.MachineTag) (instance.Id, error) { 138 m, err := s.Machine(tag.Id()) 139 if err != nil { 140 return "", errors.Trace(err) 141 } 142 return m.InstanceId() 143 } 144 145 func (s stateShim) WatchMachine(tag names.MachineTag) (state.NotifyWatcher, error) { 146 m, err := s.Machine(tag.Id()) 147 if err != nil { 148 return nil, errors.Trace(err) 149 } 150 return m.Watch(), nil 151 }