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  }