// NewLock creates a gate.Lock to be used to synchronise workers which // need to start after upgrades have completed. If no upgrade steps // are required the Lock is unlocked and the version in agent's // configuration is updated to the currently running version. // // The returned Lock should be passed to NewWorker. func NewLock(a agent.Agent) (gate.Lock, error) { lock := gate.NewLock() if wrench.IsActive("machine-agent", "always-try-upgrade") { // Always enter upgrade mode. This allows test of upgrades // even when there's actually no upgrade steps to run. return lock, nil } err := a.ChangeConfig(func(agentConfig agent.ConfigSetter) error { if !upgrades.AreUpgradesDefined(agentConfig.UpgradedToVersion()) { logger.Infof("no upgrade steps required or upgrade steps for %v "+ "have already been run.", jujuversion.Current) lock.Unlock() // Even if no upgrade is required the version number in // the agent's config still needs to be bumped. agentConfig.SetUpgradedToVersion(jujuversion.Current) } return nil }) if err != nil { return nil, err } return lock, nil }
// InitialiseUsingAgent sets up a upgradeWorkerContext from a machine agent instance. // It may update the agent's configuration. func (c *upgradeWorkerContext) InitializeUsingAgent(a upgradingMachineAgent) error { return a.ChangeConfig(func(agentConfig agent.ConfigSetter) error { if !upgrades.AreUpgradesDefined(agentConfig.UpgradedToVersion()) { logger.Infof("no upgrade steps required or upgrade steps for %v "+ "have already been run.", version.Current.Number) close(c.UpgradeComplete) // Even if no upgrade is required the version number in // the agent's config still needs to be bumped. agentConfig.SetUpgradedToVersion(version.Current.Number) } return nil }) }
func (s *upgradeSuite) TestAreUpgradesDefined(c *gc.C) { s.PatchValue(upgrades.StateUpgradeOperations, stateUpgradeOperations) s.PatchValue(upgrades.UpgradeOperations, upgradeOperations) for i, test := range areUpgradesDefinedTests { c.Logf("%d: %s", i, test.about) fromVersion := version.Zero if test.fromVersion != "" { fromVersion = version.MustParse(test.fromVersion) } toVersion := version.MustParse("1.18.0") if test.toVersion != "" { toVersion = version.MustParse(test.toVersion) } s.PatchValue(&jujuversion.Current, toVersion) result := upgrades.AreUpgradesDefined(fromVersion) c.Check(result, gc.Equals, test.expected) } }
// InitialiseUsingAgent sets up a upgradeWorkerContext from a machine agent instance. // It may update the agent's configuration. func (c *upgradeWorkerContext) InitializeUsingAgent(a upgradingMachineAgent) error { if wrench.IsActive("machine-agent", "always-try-upgrade") { // Always enter upgrade mode. This allows test of upgrades // even when there's actually no upgrade steps to run. return nil } return a.ChangeConfig(func(agentConfig agent.ConfigSetter) error { if !upgrades.AreUpgradesDefined(agentConfig.UpgradedToVersion()) { logger.Infof("no upgrade steps required or upgrade steps for %v "+ "have already been run.", version.Current.Number) close(c.UpgradeComplete) // Even if no upgrade is required the version number in // the agent's config still needs to be bumped. agentConfig.SetUpgradedToVersion(version.Current.Number) } return nil }) }