github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/undertaker/manifold.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package undertaker 5 6 import ( 7 "context" 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/environs" 16 "github.com/juju/juju/worker/common" 17 ) 18 19 // ManifoldConfig holds the names of the resources used by, and the 20 // additional dependencies of, an undertaker worker. 21 type ManifoldConfig struct { 22 APICallerName string 23 24 Logger Logger 25 Clock clock.Clock 26 NewFacade func(base.APICaller) (Facade, error) 27 NewWorker func(Config) (worker.Worker, error) 28 NewCredentialValidatorFacade func(base.APICaller) (common.CredentialAPI, error) 29 NewCloudDestroyerFunc func(context.Context, environs.OpenParams) (environs.CloudDestroyer, error) 30 } 31 32 func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) { 33 34 var apiCaller base.APICaller 35 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 36 return nil, errors.Trace(err) 37 } 38 39 facade, err := config.NewFacade(apiCaller) 40 if err != nil { 41 return nil, errors.Trace(err) 42 } 43 44 credentialAPI, err := config.NewCredentialValidatorFacade(apiCaller) 45 if err != nil { 46 return nil, errors.Trace(err) 47 } 48 49 worker, err := config.NewWorker(Config{ 50 Facade: facade, 51 CredentialAPI: credentialAPI, 52 Logger: config.Logger, 53 Clock: config.Clock, 54 NewCloudDestroyerFunc: config.NewCloudDestroyerFunc, 55 }) 56 if err != nil { 57 return nil, errors.Trace(err) 58 } 59 return worker, nil 60 } 61 62 // Manifold returns a dependency.Manifold that runs a worker responsible 63 // for shepherding a Dying model into Dead and ultimate removal. 64 func Manifold(config ManifoldConfig) dependency.Manifold { 65 return dependency.Manifold{ 66 Inputs: []string{ 67 config.APICallerName, 68 }, 69 Start: config.start, 70 } 71 }