github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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  	"gopkg.in/juju/names.v2"
    10  
    11  	"github.com/juju/juju/apiserver/metricsender"
    12  	"github.com/juju/juju/controller"
    13  	"github.com/juju/juju/core/description"
    14  	"github.com/juju/juju/environs"
    15  	"github.com/juju/juju/environs/config"
    16  	"github.com/juju/juju/permission"
    17  	"github.com/juju/juju/state"
    18  	"github.com/juju/juju/status"
    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  	APIHostPortsGetter
    27  	ToolsStorageGetter
    28  	BlockGetter
    29  	metricsender.MetricsSenderBackend
    30  	state.CloudAccessor
    31  
    32  	ModelUUID() string
    33  	ModelsForUser(names.UserTag) ([]*state.UserModel, error)
    34  	IsControllerAdmin(user names.UserTag) (bool, error)
    35  	NewModel(state.ModelArgs) (Model, ModelManagerBackend, error)
    36  
    37  	ComposeNewModelConfig(modelAttr map[string]interface{}, regionSpec *environs.RegionSpec) (map[string]interface{}, error)
    38  	ControllerModel() (Model, error)
    39  	ControllerConfig() (controller.Config, error)
    40  	ForModel(tag names.ModelTag) (ModelManagerBackend, error)
    41  	GetModel(names.ModelTag) (Model, error)
    42  	Model() (Model, error)
    43  	ModelConfigDefaultValues() (config.ModelDefaultAttributes, error)
    44  	UpdateModelConfigDefaultValues(update map[string]interface{}, remove []string, regionSpec *environs.RegionSpec) error
    45  	Unit(name string) (*state.Unit, error)
    46  	ModelTag() names.ModelTag
    47  	ModelConfig() (*config.Config, error)
    48  	AllModels() ([]Model, error)
    49  	AddModelUser(string, state.UserAccessSpec) (permission.UserAccess, error)
    50  	AddControllerUser(state.UserAccessSpec) (permission.UserAccess, error)
    51  	RemoveUserAccess(names.UserTag, names.Tag) error
    52  	UserAccess(names.UserTag, names.Tag) (permission.UserAccess, error)
    53  	AllMachines() (machines []Machine, err error)
    54  	ControllerUUID() string
    55  	ControllerTag() names.ControllerTag
    56  	Export() (description.Model, error)
    57  	SetUserAccess(subject names.UserTag, target names.Tag, access permission.Access) (permission.UserAccess, error)
    58  	LastModelConnection(user names.UserTag) (time.Time, error)
    59  	DumpAll() (map[string]interface{}, error)
    60  	Close() error
    61  }
    62  
    63  // Model defines methods provided by a state.Model instance.
    64  // All the interface methods are defined directly on state.Model
    65  // and are reproduced here for use in tests.
    66  type Model interface {
    67  	Config() (*config.Config, error)
    68  	Life() state.Life
    69  	ModelTag() names.ModelTag
    70  	Owner() names.UserTag
    71  	Status() (status.StatusInfo, error)
    72  	Cloud() string
    73  	CloudCredential() (names.CloudCredentialTag, bool)
    74  	CloudRegion() string
    75  	Users() ([]permission.UserAccess, error)
    76  	Destroy() error
    77  	DestroyIncludingHosted() error
    78  }
    79  
    80  var _ ModelManagerBackend = (*modelManagerStateShim)(nil)
    81  
    82  type modelManagerStateShim struct {
    83  	*state.State
    84  }
    85  
    86  // NewModelManagerBackend returns a modelManagerStateShim wrapping the passed
    87  // state, which implements ModelManagerBackend.
    88  func NewModelManagerBackend(st *state.State) ModelManagerBackend {
    89  	return modelManagerStateShim{st}
    90  }
    91  
    92  // ControllerModel implements ModelManagerBackend.
    93  func (st modelManagerStateShim) ControllerModel() (Model, error) {
    94  	m, err := st.State.ControllerModel()
    95  	if err != nil {
    96  		return nil, err
    97  	}
    98  	return modelShim{m}, nil
    99  }
   100  
   101  // NewModel implements ModelManagerBackend.
   102  func (st modelManagerStateShim) NewModel(args state.ModelArgs) (Model, ModelManagerBackend, error) {
   103  	m, otherState, err := st.State.NewModel(args)
   104  	if err != nil {
   105  		return nil, nil, err
   106  	}
   107  	return modelShim{m}, modelManagerStateShim{otherState}, nil
   108  }
   109  
   110  // ForModel implements ModelManagerBackend.
   111  func (st modelManagerStateShim) ForModel(tag names.ModelTag) (ModelManagerBackend, error) {
   112  	otherState, err := st.State.ForModel(tag)
   113  	if err != nil {
   114  		return nil, err
   115  	}
   116  	return modelManagerStateShim{otherState}, nil
   117  }
   118  
   119  // GetModel implements ModelManagerBackend.
   120  func (st modelManagerStateShim) GetModel(tag names.ModelTag) (Model, error) {
   121  	m, err := st.State.GetModel(tag)
   122  	if err != nil {
   123  		return nil, err
   124  	}
   125  	return modelShim{m}, nil
   126  }
   127  
   128  // Model implements ModelManagerBackend.
   129  func (st modelManagerStateShim) Model() (Model, error) {
   130  	m, err := st.State.Model()
   131  	if err != nil {
   132  		return nil, err
   133  	}
   134  	return modelShim{m}, nil
   135  }
   136  
   137  // AllModels implements ModelManagerBackend.
   138  func (st modelManagerStateShim) AllModels() ([]Model, error) {
   139  	allStateModels, err := st.State.AllModels()
   140  	if err != nil {
   141  		return nil, err
   142  	}
   143  	all := make([]Model, len(allStateModels))
   144  	for i, m := range allStateModels {
   145  		all[i] = modelShim{m}
   146  	}
   147  	return all, nil
   148  }
   149  
   150  type modelShim struct {
   151  	*state.Model
   152  }
   153  
   154  // Users implements ModelManagerBackend.
   155  func (m modelShim) Users() ([]permission.UserAccess, error) {
   156  	stateUsers, err := m.Model.Users()
   157  	if err != nil {
   158  		return nil, err
   159  	}
   160  	users := make([]permission.UserAccess, len(stateUsers))
   161  	for i, user := range stateUsers {
   162  		users[i] = user
   163  	}
   164  	return users, nil
   165  }
   166  
   167  type machineShim struct {
   168  	*state.Machine
   169  }
   170  
   171  func (st modelManagerStateShim) AllMachines() ([]Machine, error) {
   172  	allStateMachines, err := st.State.AllMachines()
   173  	if err != nil {
   174  		return nil, err
   175  	}
   176  	all := make([]Machine, len(allStateMachines))
   177  	for i, m := range allStateMachines {
   178  		all[i] = machineShim{m}
   179  	}
   180  	return all, nil
   181  }