github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/common/modelmanagerinterface.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package common
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/description"
    10  	"github.com/juju/errors"
    11  	"gopkg.in/juju/names.v2"
    12  
    13  	"github.com/juju/juju/controller"
    14  	"github.com/juju/juju/core/status"
    15  	"github.com/juju/juju/environs"
    16  	"github.com/juju/juju/environs/config"
    17  	"github.com/juju/juju/permission"
    18  	"github.com/juju/juju/state"
    19  )
    20  
    21  // ModelManagerBackend defines methods provided by a state
    22  // instance used by the model manager apiserver implementation.
    23  // All the interface methods are defined directly on state.State
    24  // and are reproduced here for use in tests.
    25  type ModelManagerBackend interface {
    26  	APIHostPortsForAgentsGetter
    27  	ToolsStorageGetter
    28  	BlockGetter
    29  	state.CloudAccessor
    30  
    31  	ModelUUID() string
    32  	ModelUUIDsForUser(names.UserTag) ([]string, error)
    33  	ModelBasicInfoForUser(user names.UserTag) ([]state.ModelAccessInfo, error)
    34  	ModelSummariesForUser(user names.UserTag, all bool) ([]state.ModelSummary, error)
    35  	IsControllerAdmin(user names.UserTag) (bool, error)
    36  	NewModel(state.ModelArgs) (Model, ModelManagerBackend, error)
    37  	Model() (Model, error)
    38  	AllModelUUIDs() ([]string, error)
    39  	GetModel(string) (Model, func() bool, error)
    40  	GetBackend(string) (ModelManagerBackend, func() bool, error)
    41  
    42  	ComposeNewModelConfig(modelAttr map[string]interface{}, regionSpec *environs.RegionSpec) (map[string]interface{}, error)
    43  	ControllerModelUUID() string
    44  	ControllerModelTag() names.ModelTag
    45  	IsController() bool
    46  	ControllerConfig() (controller.Config, error)
    47  	ModelConfigDefaultValues() (config.ModelDefaultAttributes, error)
    48  	UpdateModelConfigDefaultValues(update map[string]interface{}, remove []string, regionSpec *environs.RegionSpec) error
    49  	Unit(name string) (*state.Unit, error)
    50  	Name() string
    51  	ModelTag() names.ModelTag
    52  	ModelConfig() (*config.Config, error)
    53  	AddControllerUser(state.UserAccessSpec) (permission.UserAccess, error)
    54  	RemoveUserAccess(names.UserTag, names.Tag) error
    55  	UserAccess(names.UserTag, names.Tag) (permission.UserAccess, error)
    56  	GetCloudAccess(cloud string, user names.UserTag) (permission.Access, error)
    57  	AllMachines() (machines []Machine, err error)
    58  	AllApplications() (applications []Application, err error)
    59  	AllFilesystems() ([]state.Filesystem, error)
    60  	AllVolumes() ([]state.Volume, error)
    61  	ControllerUUID() string
    62  	ControllerTag() names.ControllerTag
    63  	Export() (description.Model, error)
    64  	ExportPartial(state.ExportConfig) (description.Model, error)
    65  	SetUserAccess(subject names.UserTag, target names.Tag, access permission.Access) (permission.UserAccess, error)
    66  	SetModelMeterStatus(string, string) error
    67  	ReloadSpaces(environ environs.Environ) error
    68  	LatestMigration() (state.ModelMigration, error)
    69  	DumpAll() (map[string]interface{}, error)
    70  	Close() error
    71  
    72  	// Methods required by the metricsender package.
    73  	MetricsManager() (*state.MetricsManager, error)
    74  	MetricsToSend(batchSize int) ([]*state.MetricBatch, error)
    75  	SetMetricBatchesSent(batchUUIDs []string) error
    76  	CountOfUnsentMetrics() (int, error)
    77  	CountOfSentMetrics() (int, error)
    78  	CleanupOldMetrics() error
    79  }
    80  
    81  // Model defines methods provided by a state.Model instance.
    82  // All the interface methods are defined directly on state.Model
    83  // and are reproduced here for use in tests.
    84  type Model interface {
    85  	Type() state.ModelType
    86  	Config() (*config.Config, error)
    87  	Life() state.Life
    88  	ModelTag() names.ModelTag
    89  	Owner() names.UserTag
    90  	Status() (status.StatusInfo, error)
    91  	Cloud() string
    92  	CloudCredential() (names.CloudCredentialTag, bool)
    93  	CloudRegion() string
    94  	Users() ([]permission.UserAccess, error)
    95  	Destroy(state.DestroyModelParams) error
    96  	SLALevel() string
    97  	SLAOwner() string
    98  	MigrationMode() state.MigrationMode
    99  	Name() string
   100  	UUID() string
   101  	ControllerUUID() string
   102  	LastModelConnection(user names.UserTag) (time.Time, error)
   103  	AddUser(state.UserAccessSpec) (permission.UserAccess, error)
   104  	AutoConfigureContainerNetworking(environ environs.Environ) error
   105  	ModelConfigDefaultValues() (config.ModelDefaultAttributes, error)
   106  	SetCloudCredential(tag names.CloudCredentialTag) (bool, error)
   107  }
   108  
   109  var _ ModelManagerBackend = (*modelManagerStateShim)(nil)
   110  
   111  type modelManagerStateShim struct {
   112  	*state.State
   113  	model *state.Model
   114  	pool  *state.StatePool
   115  }
   116  
   117  // NewModelManagerBackend returns a modelManagerStateShim wrapping the passed
   118  // state, which implements ModelManagerBackend.
   119  func NewModelManagerBackend(m *state.Model, pool *state.StatePool) ModelManagerBackend {
   120  	return modelManagerStateShim{m.State(), m, pool}
   121  }
   122  
   123  // NewModel implements ModelManagerBackend.
   124  func (st modelManagerStateShim) NewModel(args state.ModelArgs) (Model, ModelManagerBackend, error) {
   125  	controller := state.NewController(st.pool)
   126  	otherModel, otherState, err := controller.NewModel(args)
   127  	if err != nil {
   128  		return nil, nil, err
   129  	}
   130  	return modelShim{otherModel}, modelManagerStateShim{otherState, otherModel, st.pool}, nil
   131  }
   132  
   133  func (st modelManagerStateShim) ModelConfigDefaultValues() (config.ModelDefaultAttributes, error) {
   134  	return st.model.ModelConfigDefaultValues()
   135  }
   136  
   137  // UpdateModelConfigDefaultValues implements the ModelManagerBackend method.
   138  func (st modelManagerStateShim) UpdateModelConfigDefaultValues(update map[string]interface{}, remove []string, regionSpec *environs.RegionSpec) error {
   139  	return st.model.UpdateModelConfigDefaultValues(update, remove, regionSpec)
   140  }
   141  
   142  // ControllerTag exposes Model ControllerTag for ModelManagerBackend inteface
   143  func (st modelManagerStateShim) ControllerTag() names.ControllerTag {
   144  	return st.model.ControllerTag()
   145  }
   146  
   147  // GetBackend implements ModelManagerBackend.
   148  func (st modelManagerStateShim) GetBackend(modelUUID string) (ModelManagerBackend, func() bool, error) {
   149  	otherState, err := st.pool.Get(modelUUID)
   150  	if err != nil {
   151  		return nil, nil, errors.Trace(err)
   152  	}
   153  	otherModel, err := otherState.Model()
   154  	if err != nil {
   155  		otherState.Release()
   156  		return nil, nil, err
   157  	}
   158  	return modelManagerStateShim{otherState.State, otherModel, st.pool}, otherState.Release, nil
   159  }
   160  
   161  // GetModel implements ModelManagerBackend.
   162  func (st modelManagerStateShim) GetModel(modelUUID string) (Model, func() bool, error) {
   163  	model, hp, err := st.pool.GetModel(modelUUID)
   164  	if err != nil {
   165  		return nil, nil, errors.Trace(err)
   166  	}
   167  	return modelShim{model}, hp.Release, nil
   168  }
   169  
   170  // Model implements ModelManagerBackend.
   171  func (st modelManagerStateShim) Model() (Model, error) {
   172  	return modelShim{st.model}, nil
   173  }
   174  
   175  // Name implements ModelManagerBackend.
   176  func (st modelManagerStateShim) Name() string {
   177  	return st.model.Name()
   178  }
   179  
   180  func (st modelManagerStateShim) IsController() bool {
   181  	return st.State.IsController()
   182  }
   183  
   184  var _ Model = (*modelShim)(nil)
   185  
   186  type modelShim struct {
   187  	*state.Model
   188  }
   189  
   190  // Users implements ModelManagerBackend.
   191  func (m modelShim) Users() ([]permission.UserAccess, error) {
   192  	stateUsers, err := m.Model.Users()
   193  	if err != nil {
   194  		return nil, err
   195  	}
   196  	users := make([]permission.UserAccess, len(stateUsers))
   197  	for i, user := range stateUsers {
   198  		users[i] = user
   199  	}
   200  	return users, nil
   201  }
   202  
   203  type machineShim struct {
   204  	*state.Machine
   205  }
   206  
   207  func (st modelManagerStateShim) AllMachines() ([]Machine, error) {
   208  	allStateMachines, err := st.State.AllMachines()
   209  	if err != nil {
   210  		return nil, err
   211  	}
   212  	all := make([]Machine, len(allStateMachines))
   213  	for i, m := range allStateMachines {
   214  		all[i] = machineShim{m}
   215  	}
   216  	return all, nil
   217  }
   218  
   219  // Application defines methods provided by a state.Application instance.
   220  type Application interface{}
   221  
   222  type applicationShim struct {
   223  	*state.Application
   224  }
   225  
   226  func (st modelManagerStateShim) AllApplications() ([]Application, error) {
   227  	allStateApplications, err := st.State.AllApplications()
   228  	if err != nil {
   229  		return nil, err
   230  	}
   231  	all := make([]Application, len(allStateApplications))
   232  	for i, a := range allStateApplications {
   233  		all[i] = applicationShim{a}
   234  	}
   235  	return all, nil
   236  }
   237  
   238  func (st modelManagerStateShim) AllFilesystems() ([]state.Filesystem, error) {
   239  	sb, err := state.NewStorageBackend(st.State)
   240  	if err != nil {
   241  		return nil, err
   242  	}
   243  	return sb.AllFilesystems()
   244  }
   245  
   246  func (st modelManagerStateShim) AllVolumes() ([]state.Volume, error) {
   247  	sb, err := state.NewStorageBackend(st.State)
   248  	if err != nil {
   249  		return nil, err
   250  	}
   251  	return sb.AllVolumes()
   252  }
   253  
   254  // ModelConfig returns the underlying model's config. Exposed here to satisfy the
   255  // ModelBackend interface.
   256  func (st modelManagerStateShim) ModelConfig() (*config.Config, error) {
   257  	model, err := st.State.Model()
   258  	if err != nil {
   259  		return nil, errors.Trace(err)
   260  	}
   261  	return model.ModelConfig()
   262  }
   263  
   264  // [TODO: Eric Claude Jones] This method ignores an error for the purpose of
   265  // expediting refactoring for CAAS features (we are avoiding changing method
   266  // signatures so that refactoring doesn't spiral out of control). This method
   267  // should be deleted immediately upon the removal of the ModelTag method from
   268  // state.State.
   269  func (st modelManagerStateShim) ModelTag() names.ModelTag {
   270  	return names.NewModelTag(st.ModelUUID())
   271  }