github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/storageprovisioner/manifold_machine.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  	"path/filepath"
     8  
     9  	"github.com/juju/clock"
    10  	"github.com/juju/errors"
    11  	"github.com/juju/names/v5"
    12  	"github.com/juju/worker/v3"
    13  	"github.com/juju/worker/v3/dependency"
    14  
    15  	"github.com/juju/juju/agent"
    16  	"github.com/juju/juju/api/agent/storageprovisioner"
    17  	"github.com/juju/juju/api/base"
    18  	"github.com/juju/juju/cmd/jujud/agent/engine"
    19  	"github.com/juju/juju/storage/provider"
    20  	"github.com/juju/juju/worker/common"
    21  )
    22  
    23  // MachineManifoldConfig defines a storage provisioner's configuration and dependencies.
    24  type MachineManifoldConfig struct {
    25  	AgentName                    string
    26  	APICallerName                string
    27  	Clock                        clock.Clock
    28  	Logger                       Logger
    29  	NewCredentialValidatorFacade func(base.APICaller) (common.CredentialAPI, error)
    30  }
    31  
    32  func (config MachineManifoldConfig) newWorker(a agent.Agent, apiCaller base.APICaller) (worker.Worker, error) {
    33  	if config.Clock == nil {
    34  		return nil, errors.NotValidf("missing Clock")
    35  	}
    36  	if config.Logger == nil {
    37  		return nil, errors.NotValidf("missing Logger")
    38  	}
    39  	cfg := a.CurrentConfig()
    40  	api, err := storageprovisioner.NewState(apiCaller)
    41  	if err != nil {
    42  		return nil, errors.Trace(err)
    43  	}
    44  
    45  	tag, ok := cfg.Tag().(names.MachineTag)
    46  	if !ok {
    47  		return nil, errors.Errorf("this manifold may only be used inside a machine agent")
    48  	}
    49  
    50  	credentialAPI, err := config.NewCredentialValidatorFacade(apiCaller)
    51  	if err != nil {
    52  		return nil, errors.Trace(err)
    53  	}
    54  
    55  	storageDir := filepath.Join(cfg.DataDir(), "storage")
    56  	w, err := NewStorageProvisioner(Config{
    57  		Scope:                tag,
    58  		StorageDir:           storageDir,
    59  		Volumes:              api,
    60  		Filesystems:          api,
    61  		Life:                 api,
    62  		Registry:             provider.CommonStorageProviders(),
    63  		Machines:             api,
    64  		Status:               api,
    65  		Clock:                config.Clock,
    66  		Logger:               config.Logger,
    67  		CloudCallContextFunc: common.NewCloudCallContextFunc(credentialAPI),
    68  	})
    69  	if err != nil {
    70  		return nil, errors.Trace(err)
    71  	}
    72  	return w, nil
    73  }
    74  
    75  // MachineManifold returns a dependency.Manifold that runs a storage provisioner.
    76  func MachineManifold(config MachineManifoldConfig) dependency.Manifold {
    77  	typedConfig := engine.AgentAPIManifoldConfig{
    78  		AgentName:     config.AgentName,
    79  		APICallerName: config.APICallerName,
    80  	}
    81  	return engine.AgentAPIManifold(typedConfig, config.newWorker)
    82  }