github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/worker/charmrevision/charmrevisionmanifold/manifold.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package charmrevisionmanifold 5 6 import ( 7 "time" 8 9 "github.com/juju/errors" 10 "github.com/juju/utils/clock" 11 12 "github.com/juju/juju/api/base" 13 "github.com/juju/juju/api/charmrevisionupdater" 14 "github.com/juju/juju/worker" 15 "github.com/juju/juju/worker/charmrevision" 16 "github.com/juju/juju/worker/dependency" 17 ) 18 19 // ManifoldConfig describes how to create a worker that checks for updates 20 // available to deployed charms in an environment. 21 type ManifoldConfig struct { 22 23 // The named dependencies will be exposed to the start func as resources. 24 APICallerName string 25 ClockName string 26 27 // The remaining dependencies will be used with the resources to configure 28 // and create the worker. The period must be greater than 0; the NewFacade 29 // and NewWorker fields must not be nil. charmrevision.NewWorker, and 30 // NewAPIFacade, are suitable implementations for most clients. 31 Period time.Duration 32 NewFacade func(base.APICaller) (Facade, error) 33 NewWorker func(charmrevision.Config) (worker.Worker, error) 34 } 35 36 // Manifold returns a dependency.Manifold that runs a charm revision worker 37 // according to the supplied configuration. 38 func Manifold(config ManifoldConfig) dependency.Manifold { 39 return dependency.Manifold{ 40 Inputs: []string{ 41 config.APICallerName, 42 config.ClockName, 43 }, 44 Start: func(context dependency.Context) (worker.Worker, error) { 45 var clock clock.Clock 46 if err := context.Get(config.ClockName, &clock); err != nil { 47 return nil, errors.Trace(err) 48 } 49 var apiCaller base.APICaller 50 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 51 return nil, errors.Trace(err) 52 } 53 facade, err := config.NewFacade(apiCaller) 54 if err != nil { 55 return nil, errors.Annotatef(err, "cannot create facade") 56 } 57 58 worker, err := config.NewWorker(charmrevision.Config{ 59 RevisionUpdater: facade, 60 Clock: clock, 61 Period: config.Period, 62 }) 63 if err != nil { 64 return nil, errors.Annotatef(err, "cannot create worker") 65 } 66 return worker, nil 67 }, 68 } 69 } 70 71 // NewAPIFacade returns a Facade backed by the supplied APICaller. 72 func NewAPIFacade(apiCaller base.APICaller) (Facade, error) { 73 return charmrevisionupdater.NewState(apiCaller), nil 74 } 75 76 // Facade has all the controller methods used by the charm revision worker. 77 type Facade interface { 78 charmrevision.RevisionUpdater 79 }