github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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  	"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/api/caasagent"
    13  	"github.com/juju/juju/caas"
    14  	"github.com/juju/juju/environs"
    15  	"github.com/juju/juju/storage"
    16  )
    17  
    18  // ManifoldConfig describes the resources used by a Tracker.
    19  type ManifoldConfig struct {
    20  	APICallerName          string
    21  	NewContainerBrokerFunc caas.NewContainerBrokerFunc
    22  }
    23  
    24  // Manifold returns a Manifold that encapsulates a *Tracker and exposes it as
    25  // an caas,Broker resource.
    26  func Manifold(config ManifoldConfig) dependency.Manifold {
    27  	manifold := dependency.Manifold{
    28  		Inputs: []string{
    29  			config.APICallerName,
    30  		},
    31  		Output: manifoldOutput,
    32  		Start: func(context dependency.Context) (worker.Worker, error) {
    33  			var apiCaller base.APICaller
    34  			if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    35  				return nil, errors.Trace(err)
    36  			}
    37  			api, err := caasagent.NewClient(apiCaller)
    38  			if err != nil {
    39  				return nil, errors.Trace(err)
    40  			}
    41  			w, err := NewTracker(Config{
    42  				ConfigAPI:              api,
    43  				NewContainerBrokerFunc: config.NewContainerBrokerFunc,
    44  			})
    45  			if err != nil {
    46  				return nil, errors.Trace(err)
    47  			}
    48  			return w, nil
    49  		},
    50  	}
    51  	return manifold
    52  }
    53  
    54  // manifoldOutput extracts an caas.Broker resource from a *Tracker.
    55  func manifoldOutput(in worker.Worker, out interface{}) error {
    56  	inTracker, ok := in.(*Tracker)
    57  	if !ok {
    58  		return errors.Errorf("expected *broker.Tracker, got %T", in)
    59  	}
    60  	switch result := out.(type) {
    61  	case *caas.Broker:
    62  		*result = inTracker.Broker()
    63  	case *environs.CloudDestroyer:
    64  		*result = inTracker.Broker()
    65  	case *storage.ProviderRegistry:
    66  		*result = inTracker.Broker()
    67  	default:
    68  		return errors.Errorf("expected *caas.Broker, *storage.ProviderRegistry or *environs.CloudDestroyer, got %T", out)
    69  	}
    70  	return nil
    71  }