github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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 "github.com/juju/version" 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/base" 14 "github.com/juju/juju/api/upgrader" 15 "github.com/juju/juju/upgrades" 16 "github.com/juju/juju/worker/gate" 17 ) 18 19 // ManifoldConfig defines the names of the manifolds on which a 20 // Manifold will depend. 21 type ManifoldConfig struct { 22 AgentName string 23 APICallerName string 24 UpgradeStepsGateName string 25 UpgradeCheckGateName string 26 PreviousAgentVersion version.Number 27 } 28 29 // Manifold returns a dependency manifold that runs an upgrader 30 // worker, using the resource names defined in the supplied config. 31 func Manifold(config ManifoldConfig) dependency.Manifold { 32 inputs := []string{ 33 config.AgentName, 34 config.APICallerName, 35 } 36 // The machine agent uses these but the unit agent doesn't. 37 if config.UpgradeStepsGateName != "" { 38 inputs = append(inputs, config.UpgradeStepsGateName) 39 } 40 if config.UpgradeCheckGateName != "" { 41 inputs = append(inputs, config.UpgradeCheckGateName) 42 } 43 44 return dependency.Manifold{ 45 Inputs: inputs, 46 Start: func(context dependency.Context) (worker.Worker, error) { 47 48 var agent agent.Agent 49 if err := context.Get(config.AgentName, &agent); err != nil { 50 return nil, err 51 } 52 currentConfig := agent.CurrentConfig() 53 54 var apiCaller base.APICaller 55 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 56 return nil, err 57 } 58 upgraderFacade := upgrader.NewState(apiCaller) 59 60 var upgradeStepsWaiter gate.Waiter 61 if config.UpgradeStepsGateName == "" { 62 upgradeStepsWaiter = gate.NewLock() 63 } else { 64 if config.PreviousAgentVersion == version.Zero { 65 return nil, errors.New("previous agent version not specified") 66 } 67 if err := context.Get(config.UpgradeStepsGateName, &upgradeStepsWaiter); err != nil { 68 return nil, err 69 } 70 } 71 72 var initialCheckUnlocker gate.Unlocker 73 if config.UpgradeCheckGateName == "" { 74 initialCheckUnlocker = gate.NewLock() 75 } else { 76 if err := context.Get(config.UpgradeCheckGateName, &initialCheckUnlocker); err != nil { 77 return nil, err 78 } 79 } 80 81 return NewAgentUpgrader(Config{ 82 State: upgraderFacade, 83 AgentConfig: currentConfig, 84 OrigAgentVersion: config.PreviousAgentVersion, 85 UpgradeStepsWaiter: upgradeStepsWaiter, 86 InitialUpgradeCheckComplete: initialCheckUnlocker, 87 CheckDiskSpace: upgrades.CheckFreeDiskSpace, 88 }) 89 }, 90 } 91 }