github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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  	"gopkg.in/juju/worker.v1"
     9  	"gopkg.in/juju/worker.v1/dependency"
    10  
    11  	apiagent "github.com/juju/juju/api/agent"
    12  	"github.com/juju/juju/api/base"
    13  	"github.com/juju/juju/api/logstream"
    14  	"github.com/juju/juju/apiserver/params"
    15  )
    16  
    17  // ManifoldConfig defines the names of the manifolds on which a
    18  // Manifold will depend.
    19  type ManifoldConfig struct {
    20  	// These are the dependency resource names.
    21  	APICallerName string
    22  
    23  	// Sinks are the named functions that opens the underlying log sinks
    24  	// to which log records will be forwarded.
    25  	Sinks []LogSinkSpec
    26  
    27  	// OpenLogStream is the function that will be used to for the
    28  	// log stream.
    29  	OpenLogStream LogStreamFn
    30  
    31  	// OpenLogForwarder opens each log forwarder that will be used.
    32  	OpenLogForwarder func(OpenLogForwarderArgs) (*LogForwarder, error)
    33  }
    34  
    35  // Manifold returns a dependency manifold that runs a log forwarding
    36  // worker, using the resource names defined in the supplied config.
    37  func Manifold(config ManifoldConfig) dependency.Manifold {
    38  	openLogStream := config.OpenLogStream
    39  	if openLogStream == nil {
    40  		openLogStream = func(caller base.APICaller, cfg params.LogStreamConfig, controllerUUID string) (LogStream, error) {
    41  			return logstream.Open(caller, cfg, controllerUUID)
    42  		}
    43  	}
    44  
    45  	openForwarder := config.OpenLogForwarder
    46  	if openForwarder == nil {
    47  		openForwarder = NewLogForwarder
    48  	}
    49  
    50  	return dependency.Manifold{
    51  		Inputs: []string{
    52  			config.APICallerName,
    53  		},
    54  		Start: func(context dependency.Context) (worker.Worker, error) {
    55  			var apiCaller base.APICaller
    56  			if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    57  				return nil, errors.Trace(err)
    58  			}
    59  
    60  			agentFacade, err := apiagent.NewState(apiCaller)
    61  			if err != nil {
    62  				return nil, errors.Trace(err)
    63  			}
    64  			controllerCfg, err := agentFacade.ControllerConfig()
    65  			if err != nil {
    66  				return nil, errors.Annotate(err, "cannot read controller config")
    67  			}
    68  
    69  			orchestrator, err := newOrchestratorForController(OrchestratorArgs{
    70  				ControllerUUID:   controllerCfg.ControllerUUID(),
    71  				LogForwardConfig: agentFacade,
    72  				Caller:           apiCaller,
    73  				Sinks:            config.Sinks,
    74  				OpenLogStream:    openLogStream,
    75  				OpenLogForwarder: openForwarder,
    76  			})
    77  			return orchestrator, errors.Annotate(err, "creating log forwarding orchestrator")
    78  		},
    79  	}
    80  }