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