github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/apiaddressupdater/manifold.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package apiaddressupdater 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/names/v5" 9 "github.com/juju/worker/v3" 10 "github.com/juju/worker/v3/dependency" 11 12 "github.com/juju/juju/agent" 13 "github.com/juju/juju/api/agent/caasoperator" 14 "github.com/juju/juju/api/agent/machiner" 15 "github.com/juju/juju/api/agent/uniter" 16 "github.com/juju/juju/api/base" 17 "github.com/juju/juju/cmd/jujud/agent/engine" 18 ) 19 20 // Logger represents the methods used for logging messages. 21 type Logger interface { 22 Errorf(string, ...interface{}) 23 Infof(string, ...interface{}) 24 Debugf(string, ...interface{}) 25 Warningf(string, ...interface{}) 26 } 27 28 // ManifoldConfig defines the names of the manifolds on which a Manifold will depend. 29 type ManifoldConfig struct { 30 AgentName string 31 APICallerName string 32 Logger Logger 33 } 34 35 // Manifold returns a dependency manifold that runs an API address updater worker, 36 // using the resource names defined in the supplied config. 37 func Manifold(config ManifoldConfig) dependency.Manifold { 38 typedConfig := engine.AgentAPIManifoldConfig{ 39 AgentName: config.AgentName, 40 APICallerName: config.APICallerName, 41 } 42 return engine.AgentAPIManifold(typedConfig, config.newWorker) 43 } 44 45 // newWorker trivially wraps NewAPIAddressUpdater for use in a engine.AgentAPIManifold. 46 // It's not tested at the moment, because the scaffolding necessary is too 47 // unwieldy/distracting to introduce at this point. 48 func (config ManifoldConfig) newWorker(a agent.Agent, apiCaller base.APICaller) (worker.Worker, error) { 49 tag := a.CurrentConfig().Tag() 50 51 // TODO(fwereade): use appropriate facade! 52 var facade APIAddresser 53 switch apiTag := tag.(type) { 54 case names.UnitTag: 55 facade = uniter.NewState(apiCaller, apiTag) 56 case names.ApplicationTag: 57 facade = caasoperator.NewClient(apiCaller) 58 case names.MachineTag: 59 facade = machiner.NewState(apiCaller) 60 default: 61 return nil, errors.Errorf("expected a unit or machine tag; got %q", tag) 62 } 63 64 setter := agent.APIHostPortsSetter{Agent: a} 65 w, err := NewAPIAddressUpdater(Config{ 66 Addresser: facade, 67 Setter: setter, 68 Logger: config.Logger, 69 }) 70 if err != nil { 71 return nil, errors.Trace(err) 72 } 73 return w, nil 74 }