github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/presence/manifold.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package presence 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/pubsub" 9 "gopkg.in/juju/worker.v1" 10 "gopkg.in/juju/worker.v1/dependency" 11 12 coreagent "github.com/juju/juju/agent" 13 "github.com/juju/juju/core/presence" 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 IsTraceEnabled() bool 23 } 24 25 // ManifoldConfig defines the names of the manifolds on which a Manifold will 26 // depend. 27 type ManifoldConfig struct { 28 AgentName string 29 CentralHubName string 30 StateConfigWatcherName string 31 Recorder presence.Recorder 32 Logger Logger 33 34 NewWorker func(WorkerConfig) (worker.Worker, error) 35 } 36 37 // Validate ensures that the required values are set in the structure. 38 func (c *ManifoldConfig) Validate() error { 39 if c.AgentName == "" { 40 return errors.NotValidf("missing AgentName") 41 } 42 if c.CentralHubName == "" { 43 return errors.NotValidf("missing CentralHubName") 44 } 45 if c.StateConfigWatcherName == "" { 46 return errors.NotValidf("missing StateConfigWatcherName") 47 } 48 if c.Recorder == nil { 49 return errors.NotValidf("missing Recorder") 50 } 51 if c.Logger == nil { 52 return errors.NotValidf("missing Logger") 53 } 54 if c.NewWorker == nil { 55 return errors.NotValidf("missing NewWorker") 56 } 57 return nil 58 } 59 60 // Manifold returns a dependency manifold that runs a pubsub 61 // worker, using the resource names defined in the supplied config. 62 func Manifold(config ManifoldConfig) dependency.Manifold { 63 return dependency.Manifold{ 64 Inputs: []string{ 65 config.AgentName, 66 config.CentralHubName, 67 config.StateConfigWatcherName, 68 }, 69 Start: func(context dependency.Context) (worker.Worker, error) { 70 if err := config.Validate(); err != nil { 71 return nil, err 72 } 73 // Get the agent. 74 var agent coreagent.Agent 75 if err := context.Get(config.AgentName, &agent); err != nil { 76 config.Logger.Tracef("agent dependency not available") 77 return nil, err 78 } 79 origin := agent.CurrentConfig().Tag().String() 80 81 // Get the hub. 82 var hub *pubsub.StructuredHub 83 if err := context.Get(config.CentralHubName, &hub); err != nil { 84 config.Logger.Tracef("hub dependency not available") 85 return nil, err 86 } 87 // Confirm we're running in a state server by asking the 88 // stateconfigwatcher manifold. 89 var haveStateConfig bool 90 if err := context.Get(config.StateConfigWatcherName, &haveStateConfig); err != nil { 91 config.Logger.Tracef("state config watcher not available") 92 return nil, err 93 } 94 if !haveStateConfig { 95 config.Logger.Tracef("not a state server, not needed") 96 config.Recorder.Disable() 97 return nil, dependency.ErrMissing 98 } 99 config.Recorder.Enable() 100 101 cfg := WorkerConfig{ 102 Origin: origin, 103 Hub: hub, 104 Recorder: config.Recorder, 105 Logger: config.Logger, 106 } 107 return config.NewWorker(cfg) 108 }, 109 } 110 }