github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/machineundertaker/manifold.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package machineundertaker
     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/api/base"
    12  	"github.com/juju/juju/api/controller/machineundertaker"
    13  	"github.com/juju/juju/api/watcher"
    14  	"github.com/juju/juju/environs"
    15  	"github.com/juju/juju/worker/common"
    16  )
    17  
    18  // Logger represents the methods used by the worker to log details.
    19  type Logger interface {
    20  	Tracef(string, ...interface{})
    21  	Debugf(string, ...interface{})
    22  	Infof(string, ...interface{})
    23  	Errorf(string, ...interface{})
    24  }
    25  
    26  // ManifoldConfig defines the machine undertaker's configuration and
    27  // dependencies.
    28  type ManifoldConfig struct {
    29  	APICallerName string
    30  	EnvironName   string
    31  	Logger        Logger
    32  
    33  	NewWorker                    func(Facade, environs.Environ, common.CredentialAPI, Logger) (worker.Worker, error)
    34  	NewCredentialValidatorFacade func(base.APICaller) (common.CredentialAPI, error)
    35  }
    36  
    37  // Manifold returns a dependency.Manifold that runs a machine
    38  // undertaker.
    39  func Manifold(config ManifoldConfig) dependency.Manifold {
    40  	return dependency.Manifold{
    41  		Inputs: []string{config.APICallerName, config.EnvironName},
    42  		Start: func(context dependency.Context) (worker.Worker, error) {
    43  			var apiCaller base.APICaller
    44  			if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    45  				return nil, errors.Trace(err)
    46  			}
    47  			var environ environs.Environ
    48  			if err := context.Get(config.EnvironName, &environ); err != nil {
    49  				return nil, errors.Trace(err)
    50  			}
    51  			api, err := machineundertaker.NewAPI(apiCaller, watcher.NewNotifyWatcher)
    52  			if err != nil {
    53  				return nil, errors.Trace(err)
    54  			}
    55  
    56  			credentialAPI, err := config.NewCredentialValidatorFacade(apiCaller)
    57  			if err != nil {
    58  				return nil, errors.Trace(err)
    59  			}
    60  
    61  			w, err := config.NewWorker(api, environ, credentialAPI, config.Logger)
    62  			if err != nil {
    63  				return nil, errors.Trace(err)
    64  			}
    65  			return w, nil
    66  		},
    67  	}
    68  }