github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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/clock"
     8  	"github.com/juju/errors"
     9  	"gopkg.in/juju/names.v2"
    10  	"gopkg.in/juju/worker.v1"
    11  	"gopkg.in/juju/worker.v1/dependency"
    12  
    13  	"github.com/juju/juju/api/base"
    14  	"github.com/juju/juju/api/storageprovisioner"
    15  	"github.com/juju/juju/storage"
    16  	"github.com/juju/juju/worker/common"
    17  )
    18  
    19  // ModelManifoldConfig defines a storage provisioner's configuration and dependencies.
    20  type ModelManifoldConfig struct {
    21  	APICallerName       string
    22  	ClockName           string
    23  	StorageRegistryName string
    24  
    25  	Model                        names.ModelTag
    26  	StorageDir                   string
    27  	NewCredentialValidatorFacade func(base.APICaller) (common.CredentialAPI, error)
    28  	NewWorker                    func(config Config) (worker.Worker, error)
    29  }
    30  
    31  // ModelManifold returns a dependency.Manifold that runs a storage provisioner.
    32  func ModelManifold(config ModelManifoldConfig) dependency.Manifold {
    33  	return dependency.Manifold{
    34  		Inputs: []string{config.APICallerName, config.ClockName, config.StorageRegistryName},
    35  		Start: func(context dependency.Context) (worker.Worker, error) {
    36  
    37  			var clock clock.Clock
    38  			if err := context.Get(config.ClockName, &clock); err != nil {
    39  				return nil, errors.Trace(err)
    40  			}
    41  			var apiCaller base.APICaller
    42  			if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    43  				return nil, errors.Trace(err)
    44  			}
    45  			var registry storage.ProviderRegistry
    46  			if err := context.Get(config.StorageRegistryName, &registry); err != nil {
    47  				return nil, errors.Trace(err)
    48  			}
    49  
    50  			api, err := storageprovisioner.NewState(apiCaller)
    51  			if err != nil {
    52  				return nil, errors.Trace(err)
    53  			}
    54  
    55  			credentialAPI, err := config.NewCredentialValidatorFacade(apiCaller)
    56  			if err != nil {
    57  				return nil, errors.Trace(err)
    58  			}
    59  			w, err := config.NewWorker(Config{
    60  				Model:            config.Model,
    61  				Scope:            config.Model,
    62  				StorageDir:       config.StorageDir,
    63  				Applications:     api,
    64  				Volumes:          api,
    65  				Filesystems:      api,
    66  				Life:             api,
    67  				Registry:         registry,
    68  				Machines:         api,
    69  				Status:           api,
    70  				Clock:            clock,
    71  				CloudCallContext: common.NewCloudCallContext(credentialAPI, nil),
    72  			})
    73  			if err != nil {
    74  				return nil, errors.Trace(err)
    75  			}
    76  			return w, nil
    77  		},
    78  	}
    79  }