github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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 }