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