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  }