// Manifold returns a dependency manifold that runs an upgrader // worker, using the resource names defined in the supplied config. func Manifold(config ManifoldConfig) dependency.Manifold { inputs := []string{ config.AgentName, config.APICallerName, } // The machine agent uses these but the unit agent doesn't. if config.UpgradeStepsGateName != "" { inputs = append(inputs, config.UpgradeStepsGateName) } if config.UpgradeCheckGateName != "" { inputs = append(inputs, config.UpgradeCheckGateName) } return dependency.Manifold{ Inputs: inputs, Start: func(context dependency.Context) (worker.Worker, error) { var agent agent.Agent if err := context.Get(config.AgentName, &agent); err != nil { return nil, err } currentConfig := agent.CurrentConfig() var apiCaller base.APICaller if err := context.Get(config.APICallerName, &apiCaller); err != nil { return nil, err } upgraderFacade := upgrader.NewState(apiCaller) var upgradeStepsWaiter gate.Waiter if config.UpgradeStepsGateName == "" { upgradeStepsWaiter = gate.NewLock() } else { if config.PreviousAgentVersion == version.Zero { return nil, errors.New("previous agent version not specified") } if err := context.Get(config.UpgradeStepsGateName, &upgradeStepsWaiter); err != nil { return nil, err } } var initialCheckUnlocker gate.Unlocker if config.UpgradeCheckGateName == "" { initialCheckUnlocker = gate.NewLock() } else { if err := context.Get(config.UpgradeCheckGateName, &initialCheckUnlocker); err != nil { return nil, err } } return NewAgentUpgrader( upgraderFacade, currentConfig, config.PreviousAgentVersion, upgradeStepsWaiter, initialCheckUnlocker, ) }, } }
// Upgrader returns access to the Upgrader API func (st *State) Upgrader() *upgrader.State { return upgrader.NewState(st) }
// Note: This is really meant as a unit-test, this isn't a test that should // need all of the setup we have for this test suite func (s *machineUpgraderSuite) TestNew(c *gc.C) { upgrader := upgrader.NewState(s.stateAPI) c.Assert(upgrader, gc.NotNil) }
"github.com/juju/juju/worker/util" ) // ManifoldConfig defines the names of the manifolds on which a // Manifold will depend. type ManifoldConfig util.AgentApiManifoldConfig // Manifold returns a dependency manifold that runs an upgrader // worker, using the resource names defined in the supplied config. func Manifold(config ManifoldConfig) dependency.Manifold { return util.AgentApiManifold(util.AgentApiManifoldConfig(config), newWorker) } // newWorker wraps NewUpgrader for the convenience of AgentApiManifold. It should // eventually replace NewUpgrader. var newWorker = func(agent agent.Agent, apiCaller base.APICaller) (worker.Worker, error) { currentConfig := agent.CurrentConfig() upgraderFacade := upgrader.NewState(apiCaller) return NewAgentUpgrader( upgraderFacade, currentConfig, // TODO(fwereade): surely we shouldn't need both currentConfig // *and* currentConfig.UpgradedToVersion? currentConfig.UpgradedToVersion(), // TODO(fwereade): these are unit-agent-specific, and very much // unsuitable for use in a machine agent. func() bool { return false }, make(chan struct{}), ), nil }