github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/worker/logforwarder/orchestrator.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 "github.com/juju/juju/api/base" 10 ) 11 12 type orchestrator struct { 13 *LogForwarder // For now its just a single forwarder. 14 } 15 16 // OrchestratorArgs holds the info needed to open a log forwarding 17 // orchestration worker. 18 type OrchestratorArgs struct { 19 // ControllerUUID is the UUID of the controller for which we will forward logs. 20 ControllerUUID string 21 22 // LogForwardConfig is the API used to access log forward config. 23 LogForwardConfig LogForwardConfig 24 25 // Caller is the API caller that will be used. 26 Caller base.APICaller 27 28 // Sinks are the named functions that open the underlying log sinks 29 // to which log records will be forwarded. 30 Sinks []LogSinkSpec 31 32 // OpenLogStream is the function that will be used to for the 33 // log stream. 34 OpenLogStream LogStreamFn 35 36 // OpenLogForwarder opens each log forwarder that will be used. 37 OpenLogForwarder func(OpenLogForwarderArgs) (*LogForwarder, error) 38 } 39 40 func newOrchestratorForController(args OrchestratorArgs) (*orchestrator, error) { 41 // For now we work with only 1 forwarder. Later we can have a proper 42 // orchestrator that spawns a sub-worker for each log sink. 43 if len(args.Sinks) == 0 { 44 return nil, nil 45 } 46 if len(args.Sinks) > 1 { 47 return nil, errors.Errorf("multiple log forwarding targets not supported (yet)") 48 } 49 lf, err := args.OpenLogForwarder(OpenLogForwarderArgs{ 50 AllModels: true, 51 ControllerUUID: args.ControllerUUID, 52 LogForwardConfig: args.LogForwardConfig, 53 Caller: args.Caller, 54 Name: args.Sinks[0].Name, 55 OpenSink: args.Sinks[0].OpenFn, 56 OpenLogStream: args.OpenLogStream, 57 }) 58 return &orchestrator{lf}, errors.Annotate(err, "opening log forwarder") 59 }