github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/lifeflag/manifold.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package lifeflag
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/names/v5"
     9  	"github.com/juju/worker/v3"
    10  	"github.com/juju/worker/v3/dependency"
    11  
    12  	"github.com/juju/juju/agent"
    13  	"github.com/juju/juju/api/base"
    14  	"github.com/juju/juju/cmd/jujud/agent/engine"
    15  	"github.com/juju/juju/core/life"
    16  )
    17  
    18  // logger is here to stop the desire of creating a package level logger.
    19  // Don't do this, instead pass one passed as manifold config.
    20  type logger interface{}
    21  
    22  var _ logger = struct{}{}
    23  
    24  // ManifoldConfig describes how to configure and construct a Worker,
    25  // and what registered resources it may depend upon.
    26  type ManifoldConfig struct {
    27  	APICallerName string
    28  	AgentName     string
    29  
    30  	Entity         names.Tag
    31  	Result         life.Predicate
    32  	Filter         dependency.FilterFunc
    33  	NotFoundIsDead bool
    34  
    35  	NewFacade func(base.APICaller) (Facade, error)
    36  	NewWorker func(Config) (worker.Worker, error)
    37  }
    38  
    39  func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) {
    40  	var apiCaller base.APICaller
    41  	if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    42  		return nil, errors.Trace(err)
    43  	}
    44  	facade, err := config.NewFacade(apiCaller)
    45  	if err != nil {
    46  		return nil, errors.Trace(err)
    47  	}
    48  
    49  	if config.AgentName != "" {
    50  		if config.Entity != nil {
    51  			return nil, errors.NotValidf("passing AgentName and Entity")
    52  		}
    53  		var agent agent.Agent
    54  		if err := context.Get(config.AgentName, &agent); err != nil {
    55  			return nil, err
    56  		}
    57  		config.Entity = agent.CurrentConfig().Tag()
    58  	}
    59  
    60  	worker, err := config.NewWorker(Config{
    61  		Facade:         facade,
    62  		Entity:         config.Entity,
    63  		Result:         config.Result,
    64  		NotFoundIsDead: config.NotFoundIsDead,
    65  	})
    66  	if err != nil {
    67  		return nil, errors.Trace(err)
    68  	}
    69  	return worker, nil
    70  }
    71  
    72  // Manifold returns a dependency.Manifold that will run a Worker as
    73  // configured.
    74  func Manifold(config ManifoldConfig) dependency.Manifold {
    75  	inputs := []string{config.APICallerName}
    76  	if config.AgentName != "" {
    77  		inputs = append(inputs, config.AgentName)
    78  	}
    79  	return dependency.Manifold{
    80  		Inputs: inputs,
    81  		Start:  config.start,
    82  		Output: engine.FlagOutput,
    83  		Filter: config.Filter,
    84  	}
    85  }