github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/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 "github.com/juju/names/v5" 8 9 "github.com/juju/juju/apiserver/common/credentialcommon" 10 "github.com/juju/juju/cloud" 11 "github.com/juju/juju/controller" 12 "github.com/juju/juju/core/permission" 13 "github.com/juju/juju/environs/config" 14 "github.com/juju/juju/environs/context" 15 "github.com/juju/juju/state" 16 ) 17 18 type Backend interface { 19 state.CloudAccessor 20 21 ControllerTag() names.ControllerTag 22 Model() (Model, error) 23 ModelConfig() (*config.Config, error) 24 User(tag names.UserTag) (User, error) 25 26 CloudCredentials(user names.UserTag, cloudName string) (map[string]state.Credential, error) 27 UpdateCloudCredential(names.CloudCredentialTag, cloud.Credential) error 28 RemoveCloudCredential(names.CloudCredentialTag) error 29 AddCloud(cloud.Cloud, string) error 30 UpdateCloud(cloud.Cloud) error 31 RemoveCloud(string) error 32 AllCloudCredentials(user names.UserTag) ([]state.Credential, error) 33 CredentialModelsAndOwnerAccess(tag names.CloudCredentialTag) ([]state.CredentialOwnerModelAccess, error) 34 CredentialModels(tag names.CloudCredentialTag) (map[string]string, error) 35 RemoveModelsCredential(tag names.CloudCredentialTag) error 36 37 ControllerConfig() (controller.Config, error) 38 ControllerInfo() (*state.ControllerInfo, error) 39 GetCloudAccess(cloud string, user names.UserTag) (permission.Access, error) 40 GetCloudUsers(cloud string) (map[string]permission.Access, error) 41 CreateCloudAccess(cloud string, user names.UserTag, access permission.Access) error 42 UpdateCloudAccess(cloud string, user names.UserTag, access permission.Access) error 43 RemoveCloudAccess(cloud string, user names.UserTag) error 44 CloudsForUser(user names.UserTag, isSuperuser bool) ([]state.CloudInfo, error) 45 } 46 47 type stateShim struct { 48 *state.State 49 } 50 51 func NewStateBackend(st *state.State) Backend { 52 return stateShim{st} 53 } 54 55 func (s stateShim) ModelConfig() (*config.Config, error) { 56 model, err := s.State.Model() 57 if err != nil { 58 return nil, err 59 } 60 61 cfg, err := model.ModelConfig() 62 if err != nil { 63 return nil, err 64 } 65 66 return cfg, nil 67 } 68 69 func (s stateShim) Model() (Model, error) { 70 m, err := s.State.Model() 71 if err != nil { 72 return nil, err 73 } 74 return m, nil 75 } 76 77 type Model interface { 78 UUID() string 79 CloudName() string 80 Cloud() (cloud.Cloud, error) 81 CloudCredential() (state.Credential, bool, error) 82 CloudRegion() string 83 } 84 85 // ModelPoolBackend defines a pool of models. 86 type ModelPoolBackend interface { 87 // GetModelCallContext gets everything that is needed to make cloud calls on behalf of the given model. 88 GetModelCallContext(modelUUID string) (credentialcommon.PersistentBackend, context.ProviderCallContext, error) 89 90 // SystemState allows access to an underlying controller state. 91 SystemState() (*state.State, error) 92 } 93 94 type statePoolShim struct { 95 *state.StatePool 96 } 97 98 // NewModelPoolBackend creates a model pool backend based on state.StatePool. 99 func NewModelPoolBackend(st *state.StatePool) ModelPoolBackend { 100 return statePoolShim{st} 101 } 102 103 // GetModelCallContext implements ModelPoolBackend.GetModelCallContext. 104 func (s statePoolShim) GetModelCallContext(modelUUID string) (credentialcommon.PersistentBackend, context.ProviderCallContext, error) { 105 modelState, err := s.StatePool.Get(modelUUID) 106 if err != nil { 107 return nil, nil, err 108 } 109 defer modelState.Release() 110 return credentialcommon.NewPersistentBackend(modelState.State), context.CallContext(modelState.State), err 111 } 112 113 type User interface { 114 DisplayName() string 115 } 116 117 func (s stateShim) User(tag names.UserTag) (User, error) { 118 return s.State.User(tag) 119 }