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

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package undertaker
     5  
     6  import (
     7  	"context"
     8  
     9  	"github.com/juju/clock"
    10  	"github.com/juju/errors"
    11  	"github.com/juju/worker/v3"
    12  	"github.com/juju/worker/v3/dependency"
    13  
    14  	"github.com/juju/juju/api/base"
    15  	"github.com/juju/juju/environs"
    16  	"github.com/juju/juju/worker/common"
    17  )
    18  
    19  // ManifoldConfig holds the names of the resources used by, and the
    20  // additional dependencies of, an undertaker worker.
    21  type ManifoldConfig struct {
    22  	APICallerName string
    23  
    24  	Logger                       Logger
    25  	Clock                        clock.Clock
    26  	NewFacade                    func(base.APICaller) (Facade, error)
    27  	NewWorker                    func(Config) (worker.Worker, error)
    28  	NewCredentialValidatorFacade func(base.APICaller) (common.CredentialAPI, error)
    29  	NewCloudDestroyerFunc        func(context.Context, environs.OpenParams) (environs.CloudDestroyer, error)
    30  }
    31  
    32  func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) {
    33  
    34  	var apiCaller base.APICaller
    35  	if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    36  		return nil, errors.Trace(err)
    37  	}
    38  
    39  	facade, err := config.NewFacade(apiCaller)
    40  	if err != nil {
    41  		return nil, errors.Trace(err)
    42  	}
    43  
    44  	credentialAPI, err := config.NewCredentialValidatorFacade(apiCaller)
    45  	if err != nil {
    46  		return nil, errors.Trace(err)
    47  	}
    48  
    49  	worker, err := config.NewWorker(Config{
    50  		Facade:                facade,
    51  		CredentialAPI:         credentialAPI,
    52  		Logger:                config.Logger,
    53  		Clock:                 config.Clock,
    54  		NewCloudDestroyerFunc: config.NewCloudDestroyerFunc,
    55  	})
    56  	if err != nil {
    57  		return nil, errors.Trace(err)
    58  	}
    59  	return worker, nil
    60  }
    61  
    62  // Manifold returns a dependency.Manifold that runs a worker responsible
    63  // for shepherding a Dying model into Dead and ultimate removal.
    64  func Manifold(config ManifoldConfig) dependency.Manifold {
    65  	return dependency.Manifold{
    66  		Inputs: []string{
    67  			config.APICallerName,
    68  		},
    69  		Start: config.start,
    70  	}
    71  }