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 }