github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/pruner/manifold.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package pruner
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/clock"
    10  	"github.com/juju/errors"
    11  	"github.com/juju/worker/v3"
    12  	"github.com/juju/worker/v3/dependency"
    13  
    14  	"github.com/juju/juju/api/base"
    15  )
    16  
    17  // ManifoldConfig describes the resources and configuration on which the
    18  // statushistorypruner worker depends.
    19  type ManifoldConfig struct {
    20  	APICallerName string
    21  	Clock         clock.Clock
    22  	PruneInterval time.Duration
    23  	NewWorker     func(Config) (worker.Worker, error)
    24  	NewClient     func(base.APICaller) Facade
    25  	Logger        Logger
    26  }
    27  
    28  // Manifold returns a Manifold that encapsulates the statushistorypruner worker.
    29  func Manifold(config ManifoldConfig) dependency.Manifold {
    30  	return dependency.Manifold{
    31  		Inputs: []string{config.APICallerName},
    32  		Start:  config.start,
    33  	}
    34  }
    35  
    36  // start is a StartFunc for a Worker manifold.
    37  func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) {
    38  	if err := config.Validate(); err != nil {
    39  		return nil, errors.Trace(err)
    40  	}
    41  	var apiCaller base.APICaller
    42  	if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    43  		return nil, errors.Trace(err)
    44  	}
    45  
    46  	facade := config.NewClient(apiCaller)
    47  	prunerConfig := Config{
    48  		Facade:        facade,
    49  		PruneInterval: config.PruneInterval,
    50  		Clock:         config.Clock,
    51  		Logger:        config.Logger,
    52  	}
    53  	w, err := config.NewWorker(prunerConfig)
    54  	if err != nil {
    55  		return nil, errors.Trace(err)
    56  	}
    57  	return w, nil
    58  }
    59  
    60  // Validate is called by start to check for bad configuration.
    61  func (config ManifoldConfig) Validate() error {
    62  	if config.APICallerName == "" {
    63  		return errors.NotValidf("empty APICallerName")
    64  	}
    65  	if config.Clock == nil {
    66  		return errors.NotValidf("nil Clock")
    67  	}
    68  	if config.NewWorker == nil {
    69  		return errors.NotValidf("nil NewWorker")
    70  	}
    71  	if config.NewClient == nil {
    72  		return errors.NotValidf("nil NewClient")
    73  	}
    74  	if config.Logger == nil {
    75  		return errors.NotValidf("nil Logger")
    76  	}
    77  	return nil
    78  }