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  }