github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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 "gopkg.in/juju/worker.v1" 9 "gopkg.in/juju/worker.v1/dependency" 10 11 "github.com/juju/juju/agent" 12 "github.com/juju/juju/api/base" 13 apiprovisioner "github.com/juju/juju/api/provisioner" 14 "github.com/juju/juju/environs" 15 "github.com/juju/juju/worker/common" 16 ) 17 18 // ManifoldConfig defines an environment provisioner's dependencies. It's not 19 // currently clear whether it'll be easier to extend this type to include all 20 // provisioners, or to create separate (Environ|Container)Manifold[Config]s; 21 // for now we dodge the question because we don't need container provisioners 22 // in dependency engines. Yet. 23 type ManifoldConfig struct { 24 AgentName string 25 APICallerName string 26 EnvironName string 27 28 NewProvisionerFunc func(*apiprovisioner.State, agent.Config, environs.Environ, common.CredentialAPI) (Provisioner, error) 29 NewCredentialValidatorFacade func(base.APICaller) (common.CredentialAPI, error) 30 } 31 32 // Manifold creates a manifold that runs an environment provisioner. See the 33 // ManifoldConfig type for discussion about how this can/should evolve. 34 func Manifold(config ManifoldConfig) dependency.Manifold { 35 return dependency.Manifold{ 36 Inputs: []string{ 37 config.AgentName, 38 config.APICallerName, 39 config.EnvironName, 40 }, 41 Start: func(context dependency.Context) (worker.Worker, error) { 42 var agent agent.Agent 43 if err := context.Get(config.AgentName, &agent); err != nil { 44 return nil, errors.Trace(err) 45 } 46 47 var apiCaller base.APICaller 48 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 49 return nil, errors.Trace(err) 50 } 51 52 var environ environs.Environ 53 if err := context.Get(config.EnvironName, &environ); err != nil { 54 return nil, errors.Trace(err) 55 } 56 57 api := apiprovisioner.NewState(apiCaller) 58 agentConfig := agent.CurrentConfig() 59 60 credentialAPI, err := config.NewCredentialValidatorFacade(apiCaller) 61 if err != nil { 62 return nil, errors.Trace(err) 63 } 64 65 w, err := config.NewProvisionerFunc(api, agentConfig, environ, credentialAPI) 66 if err != nil { 67 return nil, errors.Trace(err) 68 } 69 return w, nil 70 }, 71 } 72 }