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  }