github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/modelworkermanager/shim.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package modelworkermanager 5 6 import ( 7 "github.com/juju/errors" 8 9 "github.com/juju/juju/controller" 10 corelogger "github.com/juju/juju/core/logger" 11 "github.com/juju/juju/state" 12 ) 13 14 // StatePoolController implements Controller in terms of a *state.StatePool. 15 type StatePoolController struct { 16 *state.StatePool 17 SysLogger corelogger.Logger 18 } 19 20 // Model is part of the Controller interface. 21 func (g StatePoolController) Model(modelUUID string) (Model, func(), error) { 22 model, ph, err := g.StatePool.GetModel(modelUUID) 23 if err != nil { 24 return nil, nil, errors.Trace(err) 25 } 26 return model, func() { ph.Release() }, nil 27 } 28 29 // RecordLogger returns a database logger for the specified model. 30 func (g StatePoolController) RecordLogger(modelUUID string) (RecordLogger, error) { 31 ps, err := g.StatePool.Get(modelUUID) 32 if err != nil { 33 return nil, errors.Trace(err) 34 } 35 defer ps.Release() 36 37 model, err := ps.Model() 38 if err != nil { 39 return nil, errors.Trace(err) 40 } 41 config, err := model.Config() 42 if err != nil { 43 return nil, errors.Trace(err) 44 } 45 loggingOutputs, _ := config.LoggingOutput() 46 return g.getLoggers(loggingOutputs, ps), nil 47 } 48 49 // Config is part of the Controller interface. 50 func (g StatePoolController) Config() (controller.Config, error) { 51 sys, err := g.StatePool.SystemState() 52 if err != nil { 53 return nil, errors.Trace(err) 54 } 55 if sys == nil { 56 return nil, errors.New("state pool closed") 57 } 58 return sys.ControllerConfig() 59 } 60 61 func (g StatePoolController) getLoggers(loggingOutputs []string, st state.ModelSessioner) corelogger.LoggerCloser { 62 // If the logging output is empty, then send it to state. 63 if len(loggingOutputs) == 0 { 64 return state.NewDbLogger(st) 65 } 66 67 return corelogger.MakeLoggers(loggingOutputs, corelogger.LoggersConfig{ 68 SysLogger: func() corelogger.Logger { 69 return g.SysLogger 70 }, 71 DBLogger: func() corelogger.Logger { 72 return state.NewDbLogger(st) 73 }, 74 }) 75 }