github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/raft/raftbackstop/manifold.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package raftbackstop 5 6 import ( 7 "github.com/hashicorp/raft" 8 "github.com/juju/errors" 9 "github.com/juju/loggo" 10 "github.com/juju/pubsub" 11 "gopkg.in/juju/worker.v1" 12 "gopkg.in/juju/worker.v1/dependency" 13 14 "github.com/juju/juju/agent" 15 ) 16 17 // ManifoldConfig holds the information necessary to run a worker for 18 // maintaining the raft backstop configuration in a dependency.Engine. 19 type ManifoldConfig struct { 20 RaftName string 21 CentralHubName string 22 AgentName string 23 24 Logger loggo.Logger 25 NewWorker func(Config) (worker.Worker, error) 26 } 27 28 func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) { 29 var r *raft.Raft 30 if err := context.Get(config.RaftName, &r); err != nil { 31 return nil, errors.Trace(err) 32 } 33 34 var logStore raft.LogStore 35 if err := context.Get(config.RaftName, &logStore); err != nil { 36 return nil, errors.Trace(err) 37 } 38 var hub *pubsub.StructuredHub 39 if err := context.Get(config.CentralHubName, &hub); err != nil { 40 return nil, errors.Trace(err) 41 } 42 43 var agent agent.Agent 44 if err := context.Get(config.AgentName, &agent); err != nil { 45 return nil, errors.Trace(err) 46 } 47 48 return config.NewWorker(Config{ 49 Raft: r, 50 LogStore: logStore, 51 Hub: hub, 52 Logger: config.Logger, 53 LocalID: raft.ServerID(agent.CurrentConfig().Tag().Id()), 54 }) 55 } 56 57 // Manifold returns a dependency.Manifold for running a raftbackstop 58 // worker. 59 func Manifold(config ManifoldConfig) dependency.Manifold { 60 return dependency.Manifold{ 61 Inputs: []string{ 62 config.RaftName, 63 config.CentralHubName, 64 config.AgentName, 65 }, 66 Start: config.start, 67 } 68 }