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 }