github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/logforwarder/manifold.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package logforwarder 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/worker/v3" 9 "github.com/juju/worker/v3/dependency" 10 11 apiagent "github.com/juju/juju/api/agent/agent" 12 "github.com/juju/juju/api/base" 13 "github.com/juju/juju/api/logstream" 14 "github.com/juju/juju/rpc/params" 15 ) 16 17 // Logger represents the methods used by the worker to log details. 18 type Logger interface { 19 Infof(string, ...interface{}) 20 Errorf(string, ...interface{}) 21 } 22 23 // ManifoldConfig defines the names of the manifolds on which a 24 // Manifold will depend. 25 type ManifoldConfig struct { 26 // These are the dependency resource names. 27 APICallerName string 28 29 // Sinks are the named functions that opens the underlying log sinks 30 // to which log records will be forwarded. 31 Sinks []LogSinkSpec 32 33 // OpenLogStream is the function that will be used to for the 34 // log stream. 35 OpenLogStream LogStreamFn 36 37 // OpenLogForwarder opens each log forwarder that will be used. 38 OpenLogForwarder func(OpenLogForwarderArgs) (*LogForwarder, error) 39 40 Logger Logger 41 } 42 43 // Manifold returns a dependency manifold that runs a log forwarding 44 // worker, using the resource names defined in the supplied config. 45 func Manifold(config ManifoldConfig) dependency.Manifold { 46 openLogStream := config.OpenLogStream 47 if openLogStream == nil { 48 openLogStream = func(caller base.APICaller, cfg params.LogStreamConfig, controllerUUID string) (LogStream, error) { 49 return logstream.Open(caller, cfg, controllerUUID) 50 } 51 } 52 53 openForwarder := config.OpenLogForwarder 54 if openForwarder == nil { 55 openForwarder = NewLogForwarder 56 } 57 58 return dependency.Manifold{ 59 Inputs: []string{ 60 config.APICallerName, 61 }, 62 Start: func(context dependency.Context) (worker.Worker, error) { 63 var apiCaller base.APICaller 64 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 65 return nil, errors.Trace(err) 66 } 67 68 agentFacade, err := apiagent.NewState(apiCaller) 69 if err != nil { 70 return nil, errors.Trace(err) 71 } 72 controllerCfg, err := agentFacade.ControllerConfig() 73 if err != nil { 74 return nil, errors.Annotate(err, "cannot read controller config") 75 } 76 77 orchestrator, err := newOrchestratorForController(OrchestratorArgs{ 78 ControllerUUID: controllerCfg.ControllerUUID(), 79 LogForwardConfig: agentFacade, 80 Caller: apiCaller, 81 Sinks: config.Sinks, 82 OpenLogStream: openLogStream, 83 OpenLogForwarder: openForwarder, 84 Logger: config.Logger, 85 }) 86 return orchestrator, errors.Annotate(err, "creating log forwarding orchestrator") 87 }, 88 } 89 }