github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/caasrbacmapper/manifold.go (about) 1 // Copyright 2020 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package caasrbacmapper 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/worker/v3" 9 "github.com/juju/worker/v3/dependency" 10 "k8s.io/client-go/informers" 11 ) 12 13 type K8sBroker interface { 14 SharedInformerFactory() informers.SharedInformerFactory 15 } 16 17 type Logger interface { 18 Errorf(string, ...interface{}) 19 } 20 21 type ManifoldConfig struct { 22 BrokerName string 23 Logger Logger 24 } 25 26 func Manifold(config ManifoldConfig) dependency.Manifold { 27 return dependency.Manifold{ 28 Inputs: []string{ 29 config.BrokerName, 30 }, 31 Output: manifoldOutput, 32 Start: config.Start, 33 } 34 } 35 36 func manifoldOutput(in worker.Worker, out interface{}) error { 37 inMapper, ok := in.(Mapper) 38 if !ok { 39 return errors.Errorf("expected Mapper, got %T", in) 40 } 41 42 switch result := out.(type) { 43 case *Mapper: 44 *result = inMapper 45 default: 46 return errors.Errorf("expected Mapper, got %T", out) 47 } 48 return nil 49 } 50 51 func (c ManifoldConfig) Start(context dependency.Context) (worker.Worker, error) { 52 if err := c.Validate(); err != nil { 53 return nil, errors.Trace(err) 54 } 55 56 var broker K8sBroker 57 if err := context.Get(c.BrokerName, &broker); err != nil { 58 return nil, errors.Trace(err) 59 } 60 61 return NewMapper(c.Logger, broker.SharedInformerFactory().Core().V1().ServiceAccounts()) 62 } 63 64 func (c ManifoldConfig) Validate() error { 65 if c.BrokerName == "" { 66 return errors.NotValidf("empty BrokerName") 67 } 68 if c.Logger == nil { 69 return errors.NotValidf("nil Logger") 70 } 71 return nil 72 }