github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/pubsub/manifold.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package pubsub 5 6 import ( 7 "github.com/juju/clock" 8 "github.com/juju/errors" 9 "github.com/juju/pubsub" 10 "gopkg.in/juju/worker.v1" 11 "gopkg.in/juju/worker.v1/dependency" 12 13 coreagent "github.com/juju/juju/agent" 14 ) 15 16 // Logger represents the logging methods called. 17 type Logger interface { 18 Errorf(message string, args ...interface{}) 19 Infof(message string, args ...interface{}) 20 Debugf(message string, args ...interface{}) 21 Tracef(message string, args ...interface{}) 22 } 23 24 // ManifoldConfig defines the names of the manifolds on which a Manifold will 25 // depend. 26 type ManifoldConfig struct { 27 AgentName string 28 CentralHubName string 29 Clock clock.Clock 30 Reporter Reporter 31 Logger Logger 32 33 NewWorker func(WorkerConfig) (worker.Worker, error) 34 } 35 36 // Manifold returns a dependency manifold that runs a pubsub 37 // worker, using the resource names defined in the supplied config. 38 func Manifold(config ManifoldConfig) dependency.Manifold { 39 return dependency.Manifold{ 40 Inputs: []string{ 41 config.AgentName, 42 config.CentralHubName, 43 }, 44 Start: func(context dependency.Context) (worker.Worker, error) { 45 // Get the agent. 46 var agent coreagent.Agent 47 if err := context.Get(config.AgentName, &agent); err != nil { 48 return nil, err 49 } 50 agentConfig := agent.CurrentConfig() 51 52 // Get the hub. 53 var hub *pubsub.StructuredHub 54 if err := context.Get(config.CentralHubName, &hub); err != nil { 55 return nil, err 56 } 57 58 apiInfo, ready := agentConfig.APIInfo() 59 if !ready { 60 return nil, dependency.ErrMissing 61 } 62 63 cfg := WorkerConfig{ 64 Origin: agentConfig.Tag().String(), 65 Clock: config.Clock, 66 Hub: hub, 67 APIInfo: apiInfo, 68 NewWriter: NewMessageWriter, 69 NewRemote: NewRemoteServer, 70 Logger: config.Logger, 71 } 72 73 w, err := config.NewWorker(cfg) 74 if err != nil { 75 return nil, errors.Trace(err) 76 } 77 if r, ok := config.Reporter.(*reporter); ok { 78 r.setWorker(w) 79 } 80 return w, nil 81 }, 82 } 83 }