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