github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/provisioner/manifold.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package provisioner 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/worker/v3" 9 "github.com/juju/worker/v3/dependency" 10 11 "github.com/juju/juju/agent" 12 apiprovisioner "github.com/juju/juju/api/agent/provisioner" 13 "github.com/juju/juju/api/base" 14 "github.com/juju/juju/environs" 15 "github.com/juju/juju/worker/common" 16 ) 17 18 // Logger defines the logging methods that the worker uses. 19 type Logger interface { 20 Tracef(string, ...interface{}) 21 Debugf(string, ...interface{}) 22 Infof(string, ...interface{}) 23 Warningf(string, ...interface{}) 24 Errorf(string, ...interface{}) 25 } 26 27 // ManifoldConfig defines an environment provisioner's dependencies. It's not 28 // currently clear whether it'll be easier to extend this type to include all 29 // provisioners, or to create separate (Environ|Container)Manifold[Config]s; 30 // for now we dodge the question because we don't need container provisioners 31 // in dependency engines. Yet. 32 type ManifoldConfig struct { 33 AgentName string 34 APICallerName string 35 EnvironName string 36 Logger Logger 37 38 NewProvisionerFunc func(*apiprovisioner.State, agent.Config, Logger, environs.Environ, common.CredentialAPI) (Provisioner, error) 39 NewCredentialValidatorFacade func(base.APICaller) (common.CredentialAPI, error) 40 } 41 42 // Manifold creates a manifold that runs an environment provisioner. See the 43 // ManifoldConfig type for discussion about how this can/should evolve. 44 func Manifold(config ManifoldConfig) dependency.Manifold { 45 return dependency.Manifold{ 46 Inputs: []string{ 47 config.AgentName, 48 config.APICallerName, 49 config.EnvironName, 50 }, 51 Start: func(context dependency.Context) (worker.Worker, error) { 52 var agent agent.Agent 53 if err := context.Get(config.AgentName, &agent); err != nil { 54 return nil, errors.Trace(err) 55 } 56 57 var apiCaller base.APICaller 58 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 59 return nil, errors.Trace(err) 60 } 61 62 var environ environs.Environ 63 if err := context.Get(config.EnvironName, &environ); err != nil { 64 return nil, errors.Trace(err) 65 } 66 67 api := apiprovisioner.NewState(apiCaller) 68 agentConfig := agent.CurrentConfig() 69 70 credentialAPI, err := config.NewCredentialValidatorFacade(apiCaller) 71 if err != nil { 72 return nil, errors.Trace(err) 73 } 74 75 w, err := config.NewProvisionerFunc(api, agentConfig, config.Logger, environ, credentialAPI) 76 if err != nil { 77 return nil, errors.Trace(err) 78 } 79 return w, nil 80 }, 81 } 82 }