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 }