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

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