github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/raft/raftclusterer/manifold.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package raftclusterer 5 6 import ( 7 "github.com/hashicorp/raft" 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 14 // ManifoldConfig holds the information necessary to run a worker for 15 // maintaining the raft cluster configuration in a dependency.Engine. 16 type ManifoldConfig struct { 17 RaftName string 18 CentralHubName string 19 20 NewWorker func(Config) (worker.Worker, error) 21 } 22 23 func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) { 24 var r *raft.Raft 25 if err := context.Get(config.RaftName, &r); err != nil { 26 return nil, errors.Trace(err) 27 } 28 29 var hub *pubsub.StructuredHub 30 if err := context.Get(config.CentralHubName, &hub); err != nil { 31 return nil, errors.Trace(err) 32 } 33 34 return config.NewWorker(Config{ 35 Raft: r, 36 Hub: hub, 37 }) 38 } 39 40 func Manifold(config ManifoldConfig) dependency.Manifold { 41 return dependency.Manifold{ 42 Inputs: []string{ 43 config.RaftName, 44 config.CentralHubName, 45 }, 46 Start: config.start, 47 } 48 }