github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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 "gopkg.in/juju/names.v2" 9 "gopkg.in/juju/worker.v1" 10 "gopkg.in/juju/worker.v1/dependency" 11 12 "github.com/juju/juju/api/base" 13 "github.com/juju/juju/cmd/jujud/agent/engine" 14 "github.com/juju/juju/core/life" 15 ) 16 17 // ManifoldConfig describes how to configure and construct a Worker, 18 // and what registered resources it may depend upon. 19 type ManifoldConfig struct { 20 APICallerName string 21 Entity names.Tag 22 Result life.Predicate 23 Filter dependency.FilterFunc 24 25 NewFacade func(base.APICaller) (Facade, error) 26 NewWorker func(Config) (worker.Worker, error) 27 } 28 29 func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) { 30 31 var apiCaller base.APICaller 32 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 33 return nil, errors.Trace(err) 34 } 35 facade, err := config.NewFacade(apiCaller) 36 if err != nil { 37 return nil, errors.Trace(err) 38 } 39 40 worker, err := config.NewWorker(Config{ 41 Facade: facade, 42 Entity: config.Entity, 43 Result: config.Result, 44 }) 45 if err != nil { 46 return nil, errors.Trace(err) 47 } 48 return worker, nil 49 } 50 51 // Manifold returns a dependency.Manifold that will run a Worker as 52 // configured. 53 func Manifold(config ManifoldConfig) dependency.Manifold { 54 return dependency.Manifold{ 55 Inputs: []string{config.APICallerName}, 56 Start: config.start, 57 Output: engine.FlagOutput, 58 Filter: config.Filter, 59 } 60 }