github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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  	"github.com/juju/errors"
     8  	"gopkg.in/juju/worker.v1"
     9  	"gopkg.in/juju/worker.v1/dependency"
    10  
    11  	"github.com/juju/juju/api/base"
    12  	"github.com/juju/juju/environs"
    13  	"github.com/juju/juju/worker/common"
    14  )
    15  
    16  // ManifoldConfig holds the names of the resources used by, and the
    17  // additional dependencies of, an undertaker worker.
    18  type ManifoldConfig struct {
    19  	APICallerName      string
    20  	CloudDestroyerName string
    21  
    22  	NewFacade                    func(base.APICaller) (Facade, error)
    23  	NewWorker                    func(Config) (worker.Worker, error)
    24  	NewCredentialValidatorFacade func(base.APICaller) (common.CredentialAPI, error)
    25  }
    26  
    27  func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) {
    28  
    29  	var apiCaller base.APICaller
    30  	if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    31  		return nil, errors.Trace(err)
    32  	}
    33  	var destroyer environs.CloudDestroyer
    34  	if err := context.Get(config.CloudDestroyerName, &destroyer); err != nil {
    35  		return nil, errors.Trace(err)
    36  	}
    37  
    38  	facade, err := config.NewFacade(apiCaller)
    39  	if err != nil {
    40  		return nil, errors.Trace(err)
    41  	}
    42  
    43  	credentialAPI, err := config.NewCredentialValidatorFacade(apiCaller)
    44  	if err != nil {
    45  		return nil, errors.Trace(err)
    46  	}
    47  
    48  	worker, err := config.NewWorker(Config{
    49  		Facade:        facade,
    50  		Destroyer:     destroyer,
    51  		CredentialAPI: credentialAPI,
    52  	})
    53  	if err != nil {
    54  		return nil, errors.Trace(err)
    55  	}
    56  	return worker, nil
    57  }
    58  
    59  // Manifold returns a dependency.Manifold that runs a worker responsible
    60  // for shepherding a Dying model into Dead and ultimate removal.
    61  func Manifold(config ManifoldConfig) dependency.Manifold {
    62  	return dependency.Manifold{
    63  		Inputs: []string{
    64  			config.APICallerName,
    65  			config.CloudDestroyerName,
    66  		},
    67  		Start: config.start,
    68  	}
    69  }