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

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package environ
     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/agent/agent"
    12  	"github.com/juju/juju/api/base"
    13  	"github.com/juju/juju/environs"
    14  	"github.com/juju/juju/storage"
    15  )
    16  
    17  // Logger defines the methods used by the pruner worker for logging.
    18  type Logger interface {
    19  	Debugf(string, ...interface{})
    20  	Warningf(string, ...interface{})
    21  }
    22  
    23  // ManifoldConfig describes the resources used by a Tracker.
    24  type ManifoldConfig struct {
    25  	APICallerName  string
    26  	NewEnvironFunc environs.NewEnvironFunc
    27  	Logger         Logger
    28  }
    29  
    30  // Manifold returns a Manifold that encapsulates a *Tracker and exposes it as
    31  // an environs.Environ resource.
    32  func Manifold(config ManifoldConfig) dependency.Manifold {
    33  	manifold := dependency.Manifold{
    34  		Inputs: []string{
    35  			config.APICallerName,
    36  		},
    37  		Output: manifoldOutput,
    38  		Start: func(context dependency.Context) (worker.Worker, error) {
    39  			var apiCaller base.APICaller
    40  			if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    41  				return nil, errors.Trace(err)
    42  			}
    43  			apiSt, err := agent.NewState(apiCaller)
    44  			if err != nil {
    45  				return nil, errors.Trace(err)
    46  			}
    47  			w, err := NewTracker(Config{
    48  				Observer:       apiSt,
    49  				NewEnvironFunc: config.NewEnvironFunc,
    50  				Logger:         config.Logger,
    51  			})
    52  			if err != nil {
    53  				return nil, errors.Trace(err)
    54  			}
    55  			return w, nil
    56  		},
    57  	}
    58  	return manifold
    59  }
    60  
    61  // manifoldOutput extracts an environs.Environ resource from a *Tracker.
    62  func manifoldOutput(in worker.Worker, out interface{}) error {
    63  	inTracker, ok := in.(*Tracker)
    64  	if !ok {
    65  		return errors.Errorf("expected *environ.Tracker, got %T", in)
    66  	}
    67  	switch result := out.(type) {
    68  	case *environs.Environ:
    69  		*result = inTracker.Environ()
    70  	case *environs.CloudDestroyer:
    71  		*result = inTracker.Environ()
    72  	case *storage.ProviderRegistry:
    73  		*result = inTracker.Environ()
    74  	default:
    75  		return errors.Errorf("expected *environs.Environ, *storage.ProviderRegistry, or *environs.CloudDestroyer, got %T", out)
    76  	}
    77  	return nil
    78  }