github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/charmrevision/manifold.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package charmrevision 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 "github.com/juju/juju/api/controller/charmrevisionupdater" 16 ) 17 18 // ManifoldConfig describes how to create a worker that checks for updates 19 // available to deployed charms in an environment. 20 type ManifoldConfig struct { 21 22 // The named dependencies will be exposed to the start func as resources. 23 APICallerName string 24 Clock clock.Clock 25 26 // The remaining dependencies will be used with the resources to configure 27 // and create the worker. The period must be greater than 0; the NewFacade 28 // and NewWorker fields must not be nil. charmrevision.NewWorker, and 29 // NewAPIFacade, are suitable implementations for most clients. 30 Period time.Duration 31 NewFacade func(base.APICaller) (Facade, error) 32 NewWorker func(Config) (worker.Worker, error) 33 Logger Logger 34 } 35 36 // Manifold returns a dependency.Manifold that runs a charm revision worker 37 // according to the supplied configuration. 38 func Manifold(config ManifoldConfig) dependency.Manifold { 39 return dependency.Manifold{ 40 Inputs: []string{ 41 config.APICallerName, 42 }, 43 Start: func(context dependency.Context) (worker.Worker, error) { 44 if config.Clock == nil { 45 return nil, errors.NotValidf("nil Clock") 46 } 47 var apiCaller base.APICaller 48 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 49 return nil, errors.Trace(err) 50 } 51 facade, err := config.NewFacade(apiCaller) 52 if err != nil { 53 return nil, errors.Annotatef(err, "cannot create facade") 54 } 55 56 worker, err := config.NewWorker(Config{ 57 RevisionUpdater: facade, 58 Clock: config.Clock, 59 Period: config.Period, 60 Logger: config.Logger, 61 }) 62 if err != nil { 63 return nil, errors.Annotatef(err, "cannot create worker") 64 } 65 return worker, nil 66 }, 67 } 68 } 69 70 // NewAPIFacade returns a Facade backed by the supplied APICaller. 71 var NewAPIFacade = newAPIFacade 72 73 func newAPIFacade(apiCaller base.APICaller) (Facade, error) { 74 return charmrevisionupdater.NewClient(apiCaller), nil 75 } 76 77 // Facade has all the controller methods used by the charm revision worker. 78 type Facade interface { 79 RevisionUpdater 80 }