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 }