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  }