github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/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/v2" 9 "github.com/juju/worker/v3" 10 "github.com/juju/worker/v3/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 Recorder presence.Recorder 31 Logger Logger 32 33 NewWorker func(WorkerConfig) (worker.Worker, error) 34 } 35 36 // Validate ensures that the required values are set in the structure. 37 func (c *ManifoldConfig) Validate() error { 38 if c.AgentName == "" { 39 return errors.NotValidf("missing AgentName") 40 } 41 if c.CentralHubName == "" { 42 return errors.NotValidf("missing CentralHubName") 43 } 44 if c.Recorder == nil { 45 return errors.NotValidf("missing Recorder") 46 } 47 if c.Logger == nil { 48 return errors.NotValidf("missing Logger") 49 } 50 if c.NewWorker == nil { 51 return errors.NotValidf("missing NewWorker") 52 } 53 return nil 54 } 55 56 // Manifold returns a dependency manifold that runs a pubsub 57 // worker, using the resource names defined in the supplied config. 58 func Manifold(config ManifoldConfig) dependency.Manifold { 59 return dependency.Manifold{ 60 Inputs: []string{ 61 config.AgentName, 62 config.CentralHubName, 63 }, 64 Start: func(context dependency.Context) (worker.Worker, error) { 65 if err := config.Validate(); err != nil { 66 return nil, err 67 } 68 // Get the agent. 69 var agent coreagent.Agent 70 if err := context.Get(config.AgentName, &agent); err != nil { 71 config.Logger.Tracef("agent dependency not available") 72 return nil, err 73 } 74 origin := agent.CurrentConfig().Tag().String() 75 76 // Get the hub. 77 var hub *pubsub.StructuredHub 78 if err := context.Get(config.CentralHubName, &hub); err != nil { 79 config.Logger.Tracef("hub dependency not available") 80 return nil, err 81 } 82 config.Recorder.Enable() 83 84 cfg := WorkerConfig{ 85 Origin: origin, 86 Hub: hub, 87 Recorder: config.Recorder, 88 Logger: config.Logger, 89 } 90 return config.NewWorker(cfg) 91 }, 92 } 93 }