github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/caasupgrader/manifold.go (about) 1 // Copyright 2019 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package caasupgrader 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/version/v2" 9 "github.com/juju/worker/v3" 10 "github.com/juju/worker/v3/dependency" 11 12 "github.com/juju/juju/agent" 13 "github.com/juju/juju/api/agent/upgrader" 14 "github.com/juju/juju/api/base" 15 "github.com/juju/juju/api/controller/caasoperatorupgrader" 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 37 // The machine agent uses these but the application agent doesn't. 38 if config.UpgradeStepsGateName != "" { 39 inputs = append(inputs, config.UpgradeStepsGateName) 40 } 41 if config.UpgradeCheckGateName != "" { 42 inputs = append(inputs, config.UpgradeCheckGateName) 43 } 44 45 return dependency.Manifold{ 46 Inputs: inputs, 47 Start: func(context dependency.Context) (worker.Worker, error) { 48 if config.PreviousAgentVersion == version.Zero { 49 return nil, errors.New("previous agent version not specified") 50 } 51 52 var agent agent.Agent 53 if err := context.Get(config.AgentName, &agent); err != nil { 54 return nil, err 55 } 56 currentConfig := agent.CurrentConfig() 57 58 var apiCaller base.APICaller 59 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 60 return nil, err 61 } 62 63 upgraderFacade := upgrader.NewState(apiCaller) 64 operatorUpgraderFacade := caasoperatorupgrader.NewClient(apiCaller) 65 66 var upgradeStepsWaiter gate.Waiter 67 if config.UpgradeStepsGateName == "" { 68 upgradeStepsWaiter = gate.NewLock() 69 } else { 70 if config.PreviousAgentVersion == version.Zero { 71 return nil, errors.New("previous agent version not specified") 72 } 73 if err := context.Get(config.UpgradeStepsGateName, &upgradeStepsWaiter); err != nil { 74 return nil, err 75 } 76 } 77 78 var initialCheckUnlocker gate.Unlocker 79 if config.UpgradeCheckGateName == "" { 80 initialCheckUnlocker = gate.NewLock() 81 } else { 82 if err := context.Get(config.UpgradeCheckGateName, &initialCheckUnlocker); err != nil { 83 return nil, err 84 } 85 } 86 87 return NewUpgrader(Config{ 88 UpgraderClient: upgraderFacade, 89 CAASOperatorUpgrader: operatorUpgraderFacade, 90 AgentTag: currentConfig.Tag(), 91 OrigAgentVersion: config.PreviousAgentVersion, 92 UpgradeStepsWaiter: upgradeStepsWaiter, 93 InitialUpgradeCheckComplete: initialCheckUnlocker, 94 }) 95 }, 96 } 97 }