github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/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/v2"
     9  	"github.com/juju/worker/v3"
    10  	"github.com/juju/worker/v3/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  	Recorder       presence.Recorder
    31  	Logger         Logger
    32  
    33  	NewWorker func(WorkerConfig) (worker.Worker, error)
    34  }
    35  
    36  // Validate ensures that the required values are set in the structure.
    37  func (c *ManifoldConfig) Validate() error {
    38  	if c.AgentName == "" {
    39  		return errors.NotValidf("missing AgentName")
    40  	}
    41  	if c.CentralHubName == "" {
    42  		return errors.NotValidf("missing CentralHubName")
    43  	}
    44  	if c.Recorder == nil {
    45  		return errors.NotValidf("missing Recorder")
    46  	}
    47  	if c.Logger == nil {
    48  		return errors.NotValidf("missing Logger")
    49  	}
    50  	if c.NewWorker == nil {
    51  		return errors.NotValidf("missing NewWorker")
    52  	}
    53  	return nil
    54  }
    55  
    56  // Manifold returns a dependency manifold that runs a pubsub
    57  // worker, using the resource names defined in the supplied config.
    58  func Manifold(config ManifoldConfig) dependency.Manifold {
    59  	return dependency.Manifold{
    60  		Inputs: []string{
    61  			config.AgentName,
    62  			config.CentralHubName,
    63  		},
    64  		Start: func(context dependency.Context) (worker.Worker, error) {
    65  			if err := config.Validate(); err != nil {
    66  				return nil, err
    67  			}
    68  			// Get the agent.
    69  			var agent coreagent.Agent
    70  			if err := context.Get(config.AgentName, &agent); err != nil {
    71  				config.Logger.Tracef("agent dependency not available")
    72  				return nil, err
    73  			}
    74  			origin := agent.CurrentConfig().Tag().String()
    75  
    76  			// Get the hub.
    77  			var hub *pubsub.StructuredHub
    78  			if err := context.Get(config.CentralHubName, &hub); err != nil {
    79  				config.Logger.Tracef("hub dependency not available")
    80  				return nil, err
    81  			}
    82  			config.Recorder.Enable()
    83  
    84  			cfg := WorkerConfig{
    85  				Origin:   origin,
    86  				Hub:      hub,
    87  				Recorder: config.Recorder,
    88  				Logger:   config.Logger,
    89  			}
    90  			return config.NewWorker(cfg)
    91  		},
    92  	}
    93  }