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

     1  // Copyright 2022 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package leaseexpiry
     5  
     6  import (
     7  	"github.com/juju/clock"
     8  	"github.com/juju/errors"
     9  	"github.com/juju/worker/v3"
    10  	"github.com/juju/worker/v3/dependency"
    11  
    12  	coredatabase "github.com/juju/juju/core/database"
    13  )
    14  
    15  // Logger represents the methods used by the worker to log details.
    16  type Logger interface {
    17  	Infof(string, ...interface{})
    18  	Debugf(string, ...interface{})
    19  }
    20  
    21  // ManifoldConfig holds the resources required
    22  // to start the lease expiry worker.
    23  type ManifoldConfig struct {
    24  	ClockName      string
    25  	DBAccessorName string
    26  
    27  	Logger Logger
    28  
    29  	NewWorker func(Config) (worker.Worker, error)
    30  }
    31  
    32  // Validate checks that the config has all the required values.
    33  func (c ManifoldConfig) Validate() error {
    34  	if c.ClockName == "" {
    35  		return errors.NotValidf("empty ClockName")
    36  	}
    37  	if c.DBAccessorName == "" {
    38  		return errors.NotValidf("empty DBAccessorName")
    39  	}
    40  	if c.Logger == nil {
    41  		return errors.NotValidf("nil Logger")
    42  	}
    43  	if c.NewWorker == nil {
    44  		return errors.NotValidf("nil NewWorker")
    45  	}
    46  
    47  	return nil
    48  }
    49  
    50  func (c ManifoldConfig) start(ctx dependency.Context) (worker.Worker, error) {
    51  	if err := c.Validate(); err != nil {
    52  		return nil, errors.Trace(err)
    53  	}
    54  
    55  	var clk clock.Clock
    56  	if err := ctx.Get(c.ClockName, &clk); err != nil {
    57  		return nil, errors.Trace(err)
    58  	}
    59  
    60  	var dbGetter coredatabase.DBGetter
    61  	if err := ctx.Get(c.DBAccessorName, &dbGetter); err != nil {
    62  		return nil, errors.Trace(err)
    63  	}
    64  
    65  	trackedDB, err := dbGetter.GetDB(coredatabase.ControllerNS)
    66  	if err != nil {
    67  		return nil, errors.Trace(err)
    68  	}
    69  
    70  	w, err := NewWorker(Config{
    71  		Clock:     clk,
    72  		Logger:    c.Logger,
    73  		TrackedDB: trackedDB,
    74  	})
    75  	if err != nil {
    76  		return nil, errors.Trace(err)
    77  	}
    78  	return w, nil
    79  }
    80  
    81  // Manifold returns a dependency.Manifold that will
    82  // run the lease expiry worker.
    83  func Manifold(cfg ManifoldConfig) dependency.Manifold {
    84  	return dependency.Manifold{
    85  		Inputs: []string{
    86  			cfg.ClockName,
    87  			cfg.DBAccessorName,
    88  		},
    89  		Start: cfg.start,
    90  	}
    91  }