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  }