github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/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  	"github.com/juju/names/v5"
    10  	"github.com/juju/worker/v3"
    11  	"github.com/juju/worker/v3/dependency"
    12  
    13  	"github.com/juju/juju/api/agent/storageprovisioner"
    14  	"github.com/juju/juju/api/base"
    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  	StorageRegistryName string
    23  
    24  	Clock                        clock.Clock
    25  	Model                        names.ModelTag
    26  	StorageDir                   string
    27  	NewCredentialValidatorFacade func(base.APICaller) (common.CredentialAPI, error)
    28  	NewWorker                    func(config Config) (worker.Worker, error)
    29  	Logger                       Logger
    30  }
    31  
    32  // ModelManifold returns a dependency.Manifold that runs a storage provisioner.
    33  func ModelManifold(config ModelManifoldConfig) dependency.Manifold {
    34  	return dependency.Manifold{
    35  		Inputs: []string{config.APICallerName, config.StorageRegistryName},
    36  		Start: func(context dependency.Context) (worker.Worker, error) {
    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 registry storage.ProviderRegistry
    43  			if err := context.Get(config.StorageRegistryName, &registry); err != nil {
    44  				return nil, errors.Trace(err)
    45  			}
    46  
    47  			api, err := storageprovisioner.NewState(apiCaller)
    48  			if err != nil {
    49  				return nil, errors.Trace(err)
    50  			}
    51  
    52  			credentialAPI, err := config.NewCredentialValidatorFacade(apiCaller)
    53  			if err != nil {
    54  				return nil, errors.Trace(err)
    55  			}
    56  			w, err := config.NewWorker(Config{
    57  				Model:                config.Model,
    58  				Scope:                config.Model,
    59  				StorageDir:           config.StorageDir,
    60  				Applications:         api,
    61  				Volumes:              api,
    62  				Filesystems:          api,
    63  				Life:                 api,
    64  				Registry:             registry,
    65  				Machines:             api,
    66  				Status:               api,
    67  				Clock:                config.Clock,
    68  				Logger:               config.Logger,
    69  				CloudCallContextFunc: common.NewCloudCallContextFunc(credentialAPI),
    70  			})
    71  			if err != nil {
    72  				return nil, errors.Trace(err)
    73  			}
    74  			return w, nil
    75  		},
    76  	}
    77  }