github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/storageprovisioner/manifold_machine.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 "path/filepath" 8 9 "github.com/juju/clock" 10 "github.com/juju/errors" 11 "github.com/juju/names/v5" 12 "github.com/juju/worker/v3" 13 "github.com/juju/worker/v3/dependency" 14 15 "github.com/juju/juju/agent" 16 "github.com/juju/juju/api/agent/storageprovisioner" 17 "github.com/juju/juju/api/base" 18 "github.com/juju/juju/cmd/jujud/agent/engine" 19 "github.com/juju/juju/storage/provider" 20 "github.com/juju/juju/worker/common" 21 ) 22 23 // MachineManifoldConfig defines a storage provisioner's configuration and dependencies. 24 type MachineManifoldConfig struct { 25 AgentName string 26 APICallerName string 27 Clock clock.Clock 28 Logger Logger 29 NewCredentialValidatorFacade func(base.APICaller) (common.CredentialAPI, error) 30 } 31 32 func (config MachineManifoldConfig) newWorker(a agent.Agent, apiCaller base.APICaller) (worker.Worker, error) { 33 if config.Clock == nil { 34 return nil, errors.NotValidf("missing Clock") 35 } 36 if config.Logger == nil { 37 return nil, errors.NotValidf("missing Logger") 38 } 39 cfg := a.CurrentConfig() 40 api, err := storageprovisioner.NewState(apiCaller) 41 if err != nil { 42 return nil, errors.Trace(err) 43 } 44 45 tag, ok := cfg.Tag().(names.MachineTag) 46 if !ok { 47 return nil, errors.Errorf("this manifold may only be used inside a machine agent") 48 } 49 50 credentialAPI, err := config.NewCredentialValidatorFacade(apiCaller) 51 if err != nil { 52 return nil, errors.Trace(err) 53 } 54 55 storageDir := filepath.Join(cfg.DataDir(), "storage") 56 w, err := NewStorageProvisioner(Config{ 57 Scope: tag, 58 StorageDir: storageDir, 59 Volumes: api, 60 Filesystems: api, 61 Life: api, 62 Registry: provider.CommonStorageProviders(), 63 Machines: api, 64 Status: api, 65 Clock: config.Clock, 66 Logger: config.Logger, 67 CloudCallContextFunc: common.NewCloudCallContextFunc(credentialAPI), 68 }) 69 if err != nil { 70 return nil, errors.Trace(err) 71 } 72 return w, nil 73 } 74 75 // MachineManifold returns a dependency.Manifold that runs a storage provisioner. 76 func MachineManifold(config MachineManifoldConfig) dependency.Manifold { 77 typedConfig := engine.AgentAPIManifoldConfig{ 78 AgentName: config.AgentName, 79 APICallerName: config.APICallerName, 80 } 81 return engine.AgentAPIManifold(typedConfig, config.newWorker) 82 }