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 }