github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/worker/upgrader/manifold.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package upgrader 5 6 import ( 7 "github.com/juju/errors" 8 9 "github.com/juju/juju/agent" 10 "github.com/juju/juju/api/base" 11 "github.com/juju/juju/api/upgrader" 12 "github.com/juju/juju/worker" 13 "github.com/juju/juju/worker/dependency" 14 "github.com/juju/juju/worker/gate" 15 "github.com/juju/version" 16 ) 17 18 // ManifoldConfig defines the names of the manifolds on which a 19 // Manifold will depend. 20 type ManifoldConfig struct { 21 AgentName string 22 APICallerName string 23 UpgradeStepsGateName string 24 UpgradeCheckGateName string 25 PreviousAgentVersion version.Number 26 } 27 28 // Manifold returns a dependency manifold that runs an upgrader 29 // worker, using the resource names defined in the supplied config. 30 func Manifold(config ManifoldConfig) dependency.Manifold { 31 inputs := []string{ 32 config.AgentName, 33 config.APICallerName, 34 } 35 // The machine agent uses these but the unit agent doesn't. 36 if config.UpgradeStepsGateName != "" { 37 inputs = append(inputs, config.UpgradeStepsGateName) 38 } 39 if config.UpgradeCheckGateName != "" { 40 inputs = append(inputs, config.UpgradeCheckGateName) 41 } 42 43 return dependency.Manifold{ 44 Inputs: inputs, 45 Start: func(context dependency.Context) (worker.Worker, error) { 46 47 var agent agent.Agent 48 if err := context.Get(config.AgentName, &agent); err != nil { 49 return nil, err 50 } 51 currentConfig := agent.CurrentConfig() 52 53 var apiCaller base.APICaller 54 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 55 return nil, err 56 } 57 upgraderFacade := upgrader.NewState(apiCaller) 58 59 var upgradeStepsWaiter gate.Waiter 60 if config.UpgradeStepsGateName == "" { 61 upgradeStepsWaiter = gate.NewLock() 62 } else { 63 if config.PreviousAgentVersion == version.Zero { 64 return nil, errors.New("previous agent version not specified") 65 } 66 if err := context.Get(config.UpgradeStepsGateName, &upgradeStepsWaiter); err != nil { 67 return nil, err 68 } 69 } 70 71 var initialCheckUnlocker gate.Unlocker 72 if config.UpgradeCheckGateName == "" { 73 initialCheckUnlocker = gate.NewLock() 74 } else { 75 if err := context.Get(config.UpgradeCheckGateName, &initialCheckUnlocker); err != nil { 76 return nil, err 77 } 78 } 79 80 return NewAgentUpgrader( 81 upgraderFacade, 82 currentConfig, 83 config.PreviousAgentVersion, 84 upgradeStepsWaiter, 85 initialCheckUnlocker, 86 ) 87 }, 88 } 89 }