github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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 "gopkg.in/juju/names.v2" 10 "gopkg.in/juju/worker.v1" 11 "gopkg.in/juju/worker.v1/dependency" 12 13 "github.com/juju/juju/api/base" 14 "github.com/juju/juju/api/storageprovisioner" 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 ClockName string 23 StorageRegistryName string 24 25 Model names.ModelTag 26 StorageDir string 27 NewCredentialValidatorFacade func(base.APICaller) (common.CredentialAPI, error) 28 NewWorker func(config Config) (worker.Worker, error) 29 } 30 31 // ModelManifold returns a dependency.Manifold that runs a storage provisioner. 32 func ModelManifold(config ModelManifoldConfig) dependency.Manifold { 33 return dependency.Manifold{ 34 Inputs: []string{config.APICallerName, config.ClockName, config.StorageRegistryName}, 35 Start: func(context dependency.Context) (worker.Worker, error) { 36 37 var clock clock.Clock 38 if err := context.Get(config.ClockName, &clock); err != nil { 39 return nil, errors.Trace(err) 40 } 41 var apiCaller base.APICaller 42 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 43 return nil, errors.Trace(err) 44 } 45 var registry storage.ProviderRegistry 46 if err := context.Get(config.StorageRegistryName, ®istry); err != nil { 47 return nil, errors.Trace(err) 48 } 49 50 api, err := storageprovisioner.NewState(apiCaller) 51 if err != nil { 52 return nil, errors.Trace(err) 53 } 54 55 credentialAPI, err := config.NewCredentialValidatorFacade(apiCaller) 56 if err != nil { 57 return nil, errors.Trace(err) 58 } 59 w, err := config.NewWorker(Config{ 60 Model: config.Model, 61 Scope: config.Model, 62 StorageDir: config.StorageDir, 63 Applications: api, 64 Volumes: api, 65 Filesystems: api, 66 Life: api, 67 Registry: registry, 68 Machines: api, 69 Status: api, 70 Clock: clock, 71 CloudCallContext: common.NewCloudCallContext(credentialAPI, nil), 72 }) 73 if err != nil { 74 return nil, errors.Trace(err) 75 } 76 return w, nil 77 }, 78 } 79 }