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 }