github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/worker/storageprovisioner/manifold_model.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  	"github.com/juju/errors"
     8  	"github.com/juju/utils/clock"
     9  	"gopkg.in/juju/names.v2"
    10  
    11  	"github.com/juju/juju/api/base"
    12  	"github.com/juju/juju/api/storageprovisioner"
    13  	"github.com/juju/juju/environs"
    14  	"github.com/juju/juju/worker"
    15  	"github.com/juju/juju/worker/dependency"
    16  )
    17  
    18  // ModelManifoldConfig defines a storage provisioner's configuration and dependencies.
    19  type ModelManifoldConfig struct {
    20  	APICallerName string
    21  	ClockName     string
    22  	EnvironName   string
    23  
    24  	Scope      names.Tag
    25  	StorageDir string
    26  }
    27  
    28  // ModelManifold returns a dependency.Manifold that runs a storage provisioner.
    29  func ModelManifold(config ModelManifoldConfig) dependency.Manifold {
    30  	return dependency.Manifold{
    31  		Inputs: []string{config.APICallerName, config.ClockName, config.EnvironName},
    32  		Start: func(context dependency.Context) (worker.Worker, error) {
    33  
    34  			var clock clock.Clock
    35  			if err := context.Get(config.ClockName, &clock); err != nil {
    36  				return nil, errors.Trace(err)
    37  			}
    38  			var apiCaller base.APICaller
    39  			if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    40  				return nil, errors.Trace(err)
    41  			}
    42  			var environ environs.Environ
    43  			if err := context.Get(config.EnvironName, &environ); err != nil {
    44  				return nil, errors.Trace(err)
    45  			}
    46  
    47  			api, err := storageprovisioner.NewState(apiCaller, config.Scope)
    48  			if err != nil {
    49  				return nil, errors.Trace(err)
    50  			}
    51  			w, err := NewStorageProvisioner(Config{
    52  				Scope:       config.Scope,
    53  				StorageDir:  config.StorageDir,
    54  				Volumes:     api,
    55  				Filesystems: api,
    56  				Life:        api,
    57  				Registry:    environ,
    58  				Machines:    api,
    59  				Status:      api,
    60  				Clock:       clock,
    61  			})
    62  			if err != nil {
    63  				return nil, errors.Trace(err)
    64  			}
    65  			return w, nil
    66  		},
    67  	}
    68  }