github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/client/cloud/backend.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package cloud
     5  
     6  import (
     7  	"gopkg.in/juju/names.v2"
     8  
     9  	"github.com/juju/juju/apiserver/common/credentialcommon"
    10  	"github.com/juju/juju/cloud"
    11  	"github.com/juju/juju/environs/config"
    12  	"github.com/juju/juju/permission"
    13  	"github.com/juju/juju/state"
    14  )
    15  
    16  type Backend interface {
    17  	state.CloudAccessor
    18  
    19  	ControllerTag() names.ControllerTag
    20  	Model() (Model, error)
    21  	ModelConfig() (*config.Config, error)
    22  	User(tag names.UserTag) (User, error)
    23  
    24  	CloudCredentials(user names.UserTag, cloudName string) (map[string]state.Credential, error)
    25  	UpdateCloudCredential(names.CloudCredentialTag, cloud.Credential) error
    26  	RemoveCloudCredential(names.CloudCredentialTag) error
    27  	AddCloud(cloud.Cloud, string) error
    28  	RemoveCloud(string) error
    29  	AllCloudCredentials(user names.UserTag) ([]state.Credential, error)
    30  	CredentialModelsAndOwnerAccess(tag names.CloudCredentialTag) ([]state.CredentialOwnerModelAccess, error)
    31  	CredentialModels(tag names.CloudCredentialTag) (map[string]string, error)
    32  
    33  	ControllerInfo() (*state.ControllerInfo, error)
    34  	GetCloudAccess(cloud string, user names.UserTag) (permission.Access, error)
    35  	GetCloudUsers(cloud string) (map[string]permission.Access, error)
    36  	CreateCloudAccess(cloud string, user names.UserTag, access permission.Access) error
    37  	UpdateCloudAccess(cloud string, user names.UserTag, access permission.Access) error
    38  	RemoveCloudAccess(cloud string, user names.UserTag) error
    39  	CloudsForUser(user names.UserTag, all bool) ([]state.CloudInfo, error)
    40  }
    41  
    42  type stateShim struct {
    43  	*state.State
    44  }
    45  
    46  func NewStateBackend(st *state.State) Backend {
    47  	return stateShim{st}
    48  }
    49  
    50  func (s stateShim) ModelConfig() (*config.Config, error) {
    51  	model, err := s.State.Model()
    52  	if err != nil {
    53  		return nil, err
    54  	}
    55  
    56  	cfg, err := model.ModelConfig()
    57  	if err != nil {
    58  		return nil, err
    59  	}
    60  
    61  	return cfg, nil
    62  }
    63  
    64  func (s stateShim) Model() (Model, error) {
    65  	m, err := s.State.Model()
    66  	if err != nil {
    67  		return nil, err
    68  	}
    69  	return m, nil
    70  }
    71  
    72  type Model interface {
    73  	Cloud() string
    74  	CloudCredential() (names.CloudCredentialTag, bool)
    75  	CloudRegion() string
    76  }
    77  
    78  // ModelPoolBackend defines a pool of models.
    79  type ModelPoolBackend interface {
    80  	// Get allows to retrieve a particular mode given a model UUID.
    81  	Get(modelUUID string) (PooledModelBackend, error)
    82  
    83  	// SystemState allows access to an underlying controller state.
    84  	SystemState() *state.State
    85  }
    86  
    87  type statePoolShim struct {
    88  	*state.StatePool
    89  }
    90  
    91  // NewModelPoolBackend creates a model pool backend based on state.StatePool.
    92  func NewModelPoolBackend(st *state.StatePool) ModelPoolBackend {
    93  	return statePoolShim{st}
    94  }
    95  
    96  // Get implements ModelPoolBackend.Get.
    97  func (s statePoolShim) Get(modelUUID string) (PooledModelBackend, error) {
    98  	m, err := s.StatePool.Get(modelUUID)
    99  	return NewPooledModelBackend(m), err
   100  }
   101  
   102  // PooledModelBackend defines a model retrieved from the model pool.
   103  type PooledModelBackend interface {
   104  	// Model represents the model itself.
   105  	Model() credentialcommon.PersistentBackend
   106  	// Release returns a connection to the model back to the pool.
   107  	Release() bool
   108  }
   109  
   110  type modelShim struct {
   111  	*state.PooledState
   112  }
   113  
   114  // NewPooledModelBackend creates a pooled model backend based on state.PooledState.
   115  func NewPooledModelBackend(st *state.PooledState) PooledModelBackend {
   116  	return modelShim{st}
   117  }
   118  
   119  // Model implements PooledModelBackend.Model.
   120  func (s modelShim) Model() credentialcommon.PersistentBackend {
   121  	return credentialcommon.NewPersistentBackend(s.PooledState.State)
   122  }
   123  
   124  type User interface {
   125  	DisplayName() string
   126  }
   127  
   128  func (s stateShim) User(tag names.UserTag) (User, error) {
   129  	return s.State.User(tag)
   130  }