github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/provisioner/manifold.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package provisioner
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/worker/v3"
     9  	"github.com/juju/worker/v3/dependency"
    10  
    11  	"github.com/juju/juju/agent"
    12  	apiprovisioner "github.com/juju/juju/api/agent/provisioner"
    13  	"github.com/juju/juju/api/base"
    14  	"github.com/juju/juju/environs"
    15  	"github.com/juju/juju/worker/common"
    16  )
    17  
    18  // Logger defines the logging methods that the worker uses.
    19  type Logger interface {
    20  	Tracef(string, ...interface{})
    21  	Debugf(string, ...interface{})
    22  	Infof(string, ...interface{})
    23  	Warningf(string, ...interface{})
    24  	Errorf(string, ...interface{})
    25  }
    26  
    27  // ManifoldConfig defines an environment provisioner's dependencies. It's not
    28  // currently clear whether it'll be easier to extend this type to include all
    29  // provisioners, or to create separate (Environ|Container)Manifold[Config]s;
    30  // for now we dodge the question because we don't need container provisioners
    31  // in dependency engines. Yet.
    32  type ManifoldConfig struct {
    33  	AgentName     string
    34  	APICallerName string
    35  	EnvironName   string
    36  	Logger        Logger
    37  
    38  	NewProvisionerFunc           func(*apiprovisioner.State, agent.Config, Logger, environs.Environ, common.CredentialAPI) (Provisioner, error)
    39  	NewCredentialValidatorFacade func(base.APICaller) (common.CredentialAPI, error)
    40  }
    41  
    42  // Manifold creates a manifold that runs an environment provisioner. See the
    43  // ManifoldConfig type for discussion about how this can/should evolve.
    44  func Manifold(config ManifoldConfig) dependency.Manifold {
    45  	return dependency.Manifold{
    46  		Inputs: []string{
    47  			config.AgentName,
    48  			config.APICallerName,
    49  			config.EnvironName,
    50  		},
    51  		Start: func(context dependency.Context) (worker.Worker, error) {
    52  			var agent agent.Agent
    53  			if err := context.Get(config.AgentName, &agent); err != nil {
    54  				return nil, errors.Trace(err)
    55  			}
    56  
    57  			var apiCaller base.APICaller
    58  			if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    59  				return nil, errors.Trace(err)
    60  			}
    61  
    62  			var environ environs.Environ
    63  			if err := context.Get(config.EnvironName, &environ); err != nil {
    64  				return nil, errors.Trace(err)
    65  			}
    66  
    67  			api := apiprovisioner.NewState(apiCaller)
    68  			agentConfig := agent.CurrentConfig()
    69  
    70  			credentialAPI, err := config.NewCredentialValidatorFacade(apiCaller)
    71  			if err != nil {
    72  				return nil, errors.Trace(err)
    73  			}
    74  
    75  			w, err := config.NewProvisionerFunc(api, agentConfig, config.Logger, environ, credentialAPI)
    76  			if err != nil {
    77  				return nil, errors.Trace(err)
    78  			}
    79  			return w, nil
    80  		},
    81  	}
    82  }