github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/reboot/manifold.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package reboot 5 6 import ( 7 "github.com/juju/clock" 8 "github.com/juju/errors" 9 "gopkg.in/juju/worker.v1" 10 "gopkg.in/juju/worker.v1/dependency" 11 12 "github.com/juju/juju/agent" 13 "github.com/juju/juju/api" 14 "github.com/juju/juju/api/base" 15 "github.com/juju/juju/core/machinelock" 16 ) 17 18 // ManifoldConfig defines the names of the manifolds on which a Manifold will depend. 19 type ManifoldConfig struct { 20 AgentName string 21 APICallerName string 22 MachineLock machinelock.Lock 23 Clock clock.Clock 24 } 25 26 // Manifold returns a dependency manifold that runs a reboot worker, 27 // using the resource names defined in the supplied config. 28 func Manifold(config ManifoldConfig) dependency.Manifold { 29 return dependency.Manifold{ 30 Inputs: []string{ 31 config.AgentName, 32 config.APICallerName, 33 }, 34 Start: func(context dependency.Context) (worker.Worker, error) { 35 var agent agent.Agent 36 if err := context.Get(config.AgentName, &agent); err != nil { 37 return nil, err 38 } 39 var apiCaller base.APICaller 40 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 41 return nil, err 42 } 43 if config.Clock == nil { 44 return nil, errors.NotValidf("missing Clock") 45 } 46 if config.MachineLock == nil { 47 return nil, errors.NotValidf("missing MachineLock") 48 } 49 return newWorker(agent, apiCaller, config.MachineLock, config.Clock) 50 }, 51 } 52 } 53 54 // newWorker starts a new reboot worker. 55 // 56 // TODO(mjs) - It's not tested at the moment, because the scaffolding 57 // necessary is too unwieldy/distracting to introduce at this point. 58 func newWorker(a agent.Agent, apiCaller base.APICaller, machineLock machinelock.Lock, clock clock.Clock) (worker.Worker, error) { 59 apiConn, ok := apiCaller.(api.Connection) 60 if !ok { 61 return nil, errors.New("unable to obtain api.Connection") 62 } 63 rebootState, err := apiConn.Reboot() 64 if err != nil { 65 return nil, errors.Trace(err) 66 } 67 w, err := NewReboot(rebootState, a.CurrentConfig(), machineLock, clock) 68 if err != nil { 69 return nil, errors.Annotate(err, "cannot start reboot worker") 70 } 71 return w, nil 72 }