github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/logforwarder/orchestrator.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 9 "github.com/juju/juju/api/base" 10 ) 11 12 type orchestrator struct { 13 *LogForwarder // For now its just a single forwarder. 14 } 15 16 // OrchestratorArgs holds the info needed to open a log forwarding 17 // orchestration worker. 18 type OrchestratorArgs struct { 19 // ControllerUUID is the UUID of the controller for which we will forward logs. 20 ControllerUUID string 21 22 // LogForwardConfig is the API used to access log forward config. 23 LogForwardConfig LogForwardConfig 24 25 // Caller is the API caller that will be used. 26 Caller base.APICaller 27 28 // Sinks are the named functions that open the underlying log sinks 29 // to which log records will be forwarded. 30 Sinks []LogSinkSpec 31 32 // OpenLogStream is the function that will be used to for the 33 // log stream. 34 OpenLogStream LogStreamFn 35 36 // OpenLogForwarder opens each log forwarder that will be used. 37 OpenLogForwarder func(OpenLogForwarderArgs) (*LogForwarder, error) 38 39 Logger Logger 40 } 41 42 func newOrchestratorForController(args OrchestratorArgs) (*orchestrator, error) { 43 // For now we work with only 1 forwarder. Later we can have a proper 44 // orchestrator that spawns a sub-worker for each log sink. 45 if len(args.Sinks) == 0 { 46 return nil, nil 47 } 48 if len(args.Sinks) > 1 { 49 return nil, errors.Errorf("multiple log forwarding targets not supported (yet)") 50 } 51 lf, err := args.OpenLogForwarder(OpenLogForwarderArgs{ 52 ControllerUUID: args.ControllerUUID, 53 LogForwardConfig: args.LogForwardConfig, 54 Caller: args.Caller, 55 Name: args.Sinks[0].Name, 56 OpenSink: args.Sinks[0].OpenFn, 57 OpenLogStream: args.OpenLogStream, 58 Logger: args.Logger, 59 }) 60 return &orchestrator{lf}, errors.Annotate(err, "opening log forwarder") 61 }