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