github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/pubsub/manifold.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package pubsub
     5  
     6  import (
     7  	"github.com/juju/clock"
     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  	coreagent "github.com/juju/juju/agent"
    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  }
    23  
    24  // ManifoldConfig defines the names of the manifolds on which a Manifold will
    25  // depend.
    26  type ManifoldConfig struct {
    27  	AgentName      string
    28  	CentralHubName string
    29  	Clock          clock.Clock
    30  	Reporter       Reporter
    31  	Logger         Logger
    32  
    33  	NewWorker func(WorkerConfig) (worker.Worker, error)
    34  }
    35  
    36  // Manifold returns a dependency manifold that runs a pubsub
    37  // worker, using the resource names defined in the supplied config.
    38  func Manifold(config ManifoldConfig) dependency.Manifold {
    39  	return dependency.Manifold{
    40  		Inputs: []string{
    41  			config.AgentName,
    42  			config.CentralHubName,
    43  		},
    44  		Start: func(context dependency.Context) (worker.Worker, error) {
    45  			// Get the agent.
    46  			var agent coreagent.Agent
    47  			if err := context.Get(config.AgentName, &agent); err != nil {
    48  				return nil, err
    49  			}
    50  			agentConfig := agent.CurrentConfig()
    51  
    52  			// Get the hub.
    53  			var hub *pubsub.StructuredHub
    54  			if err := context.Get(config.CentralHubName, &hub); err != nil {
    55  				return nil, err
    56  			}
    57  
    58  			apiInfo, ready := agentConfig.APIInfo()
    59  			if !ready {
    60  				return nil, dependency.ErrMissing
    61  			}
    62  
    63  			cfg := WorkerConfig{
    64  				Origin:    agentConfig.Tag().String(),
    65  				Clock:     config.Clock,
    66  				Hub:       hub,
    67  				APIInfo:   apiInfo,
    68  				NewWriter: NewMessageWriter,
    69  				NewRemote: NewRemoteServer,
    70  				Logger:    config.Logger,
    71  			}
    72  
    73  			w, err := config.NewWorker(cfg)
    74  			if err != nil {
    75  				return nil, errors.Trace(err)
    76  			}
    77  			if r, ok := config.Reporter.(*reporter); ok {
    78  				r.setWorker(w)
    79  			}
    80  			return w, nil
    81  		},
    82  	}
    83  }