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  }