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  }