github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/lifeflag/manifold.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package lifeflag 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/base" 14 "github.com/juju/juju/cmd/jujud/agent/engine" 15 "github.com/juju/juju/core/life" 16 ) 17 18 // logger is here to stop the desire of creating a package level logger. 19 // Don't do this, instead pass one passed as manifold config. 20 type logger interface{} 21 22 var _ logger = struct{}{} 23 24 // ManifoldConfig describes how to configure and construct a Worker, 25 // and what registered resources it may depend upon. 26 type ManifoldConfig struct { 27 APICallerName string 28 AgentName string 29 30 Entity names.Tag 31 Result life.Predicate 32 Filter dependency.FilterFunc 33 NotFoundIsDead bool 34 35 NewFacade func(base.APICaller) (Facade, error) 36 NewWorker func(Config) (worker.Worker, error) 37 } 38 39 func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) { 40 var apiCaller base.APICaller 41 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 42 return nil, errors.Trace(err) 43 } 44 facade, err := config.NewFacade(apiCaller) 45 if err != nil { 46 return nil, errors.Trace(err) 47 } 48 49 if config.AgentName != "" { 50 if config.Entity != nil { 51 return nil, errors.NotValidf("passing AgentName and Entity") 52 } 53 var agent agent.Agent 54 if err := context.Get(config.AgentName, &agent); err != nil { 55 return nil, err 56 } 57 config.Entity = agent.CurrentConfig().Tag() 58 } 59 60 worker, err := config.NewWorker(Config{ 61 Facade: facade, 62 Entity: config.Entity, 63 Result: config.Result, 64 NotFoundIsDead: config.NotFoundIsDead, 65 }) 66 if err != nil { 67 return nil, errors.Trace(err) 68 } 69 return worker, nil 70 } 71 72 // Manifold returns a dependency.Manifold that will run a Worker as 73 // configured. 74 func Manifold(config ManifoldConfig) dependency.Manifold { 75 inputs := []string{config.APICallerName} 76 if config.AgentName != "" { 77 inputs = append(inputs, config.AgentName) 78 } 79 return dependency.Manifold{ 80 Inputs: inputs, 81 Start: config.start, 82 Output: engine.FlagOutput, 83 Filter: config.Filter, 84 } 85 }