github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/storageprovisioner/manifold_model.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package storageprovisioner 5 6 import ( 7 "github.com/juju/clock" 8 "github.com/juju/errors" 9 "github.com/juju/names/v5" 10 "github.com/juju/worker/v3" 11 "github.com/juju/worker/v3/dependency" 12 13 "github.com/juju/juju/api/agent/storageprovisioner" 14 "github.com/juju/juju/api/base" 15 "github.com/juju/juju/storage" 16 "github.com/juju/juju/worker/common" 17 ) 18 19 // ModelManifoldConfig defines a storage provisioner's configuration and dependencies. 20 type ModelManifoldConfig struct { 21 APICallerName string 22 StorageRegistryName string 23 24 Clock clock.Clock 25 Model names.ModelTag 26 StorageDir string 27 NewCredentialValidatorFacade func(base.APICaller) (common.CredentialAPI, error) 28 NewWorker func(config Config) (worker.Worker, error) 29 Logger Logger 30 } 31 32 // ModelManifold returns a dependency.Manifold that runs a storage provisioner. 33 func ModelManifold(config ModelManifoldConfig) dependency.Manifold { 34 return dependency.Manifold{ 35 Inputs: []string{config.APICallerName, config.StorageRegistryName}, 36 Start: func(context dependency.Context) (worker.Worker, error) { 37 38 var apiCaller base.APICaller 39 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 40 return nil, errors.Trace(err) 41 } 42 var registry storage.ProviderRegistry 43 if err := context.Get(config.StorageRegistryName, ®istry); err != nil { 44 return nil, errors.Trace(err) 45 } 46 47 api, err := storageprovisioner.NewState(apiCaller) 48 if err != nil { 49 return nil, errors.Trace(err) 50 } 51 52 credentialAPI, err := config.NewCredentialValidatorFacade(apiCaller) 53 if err != nil { 54 return nil, errors.Trace(err) 55 } 56 w, err := config.NewWorker(Config{ 57 Model: config.Model, 58 Scope: config.Model, 59 StorageDir: config.StorageDir, 60 Applications: api, 61 Volumes: api, 62 Filesystems: api, 63 Life: api, 64 Registry: registry, 65 Machines: api, 66 Status: api, 67 Clock: config.Clock, 68 Logger: config.Logger, 69 CloudCallContextFunc: common.NewCloudCallContextFunc(credentialAPI), 70 }) 71 if err != nil { 72 return nil, errors.Trace(err) 73 } 74 return w, nil 75 }, 76 } 77 }