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

     1  // Copyright 2018 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package presence
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/pubsub"
     9  	"gopkg.in/juju/worker.v1"
    10  	"gopkg.in/juju/worker.v1/dependency"
    11  
    12  	coreagent "github.com/juju/juju/agent"
    13  	"github.com/juju/juju/core/presence"
    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  	IsTraceEnabled() bool
    23  }
    24  
    25  // ManifoldConfig defines the names of the manifolds on which a Manifold will
    26  // depend.
    27  type ManifoldConfig struct {
    28  	AgentName              string
    29  	CentralHubName         string
    30  	StateConfigWatcherName string
    31  	Recorder               presence.Recorder
    32  	Logger                 Logger
    33  
    34  	NewWorker func(WorkerConfig) (worker.Worker, error)
    35  }
    36  
    37  // Validate ensures that the required values are set in the structure.
    38  func (c *ManifoldConfig) Validate() error {
    39  	if c.AgentName == "" {
    40  		return errors.NotValidf("missing AgentName")
    41  	}
    42  	if c.CentralHubName == "" {
    43  		return errors.NotValidf("missing CentralHubName")
    44  	}
    45  	if c.StateConfigWatcherName == "" {
    46  		return errors.NotValidf("missing StateConfigWatcherName")
    47  	}
    48  	if c.Recorder == nil {
    49  		return errors.NotValidf("missing Recorder")
    50  	}
    51  	if c.Logger == nil {
    52  		return errors.NotValidf("missing Logger")
    53  	}
    54  	if c.NewWorker == nil {
    55  		return errors.NotValidf("missing NewWorker")
    56  	}
    57  	return nil
    58  }
    59  
    60  // Manifold returns a dependency manifold that runs a pubsub
    61  // worker, using the resource names defined in the supplied config.
    62  func Manifold(config ManifoldConfig) dependency.Manifold {
    63  	return dependency.Manifold{
    64  		Inputs: []string{
    65  			config.AgentName,
    66  			config.CentralHubName,
    67  			config.StateConfigWatcherName,
    68  		},
    69  		Start: func(context dependency.Context) (worker.Worker, error) {
    70  			if err := config.Validate(); err != nil {
    71  				return nil, err
    72  			}
    73  			// Get the agent.
    74  			var agent coreagent.Agent
    75  			if err := context.Get(config.AgentName, &agent); err != nil {
    76  				config.Logger.Tracef("agent dependency not available")
    77  				return nil, err
    78  			}
    79  			origin := agent.CurrentConfig().Tag().String()
    80  
    81  			// Get the hub.
    82  			var hub *pubsub.StructuredHub
    83  			if err := context.Get(config.CentralHubName, &hub); err != nil {
    84  				config.Logger.Tracef("hub dependency not available")
    85  				return nil, err
    86  			}
    87  			// Confirm we're running in a state server by asking the
    88  			// stateconfigwatcher manifold.
    89  			var haveStateConfig bool
    90  			if err := context.Get(config.StateConfigWatcherName, &haveStateConfig); err != nil {
    91  				config.Logger.Tracef("state config watcher not available")
    92  				return nil, err
    93  			}
    94  			if !haveStateConfig {
    95  				config.Logger.Tracef("not a state server, not needed")
    96  				config.Recorder.Disable()
    97  				return nil, dependency.ErrMissing
    98  			}
    99  			config.Recorder.Enable()
   100  
   101  			cfg := WorkerConfig{
   102  				Origin:   origin,
   103  				Hub:      hub,
   104  				Recorder: config.Recorder,
   105  				Logger:   config.Logger,
   106  			}
   107  			return config.NewWorker(cfg)
   108  		},
   109  	}
   110  }