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 }