func (a *UnitAgent) APIWorkers() (worker.Worker, error) { agentConfig := a.CurrentConfig() dataDir := agentConfig.DataDir() hookLock, err := hookExecutionLock(dataDir) if err != nil { return nil, err } st, entity, err := openAPIState(agentConfig, a) if err != nil { return nil, err } runner := worker.NewRunner(connectionIsFatal(st), moreImportant) runner.StartWorker("upgrader", func() (worker.Worker, error) { return upgrader.NewUpgrader(st.Upgrader(), agentConfig), nil }) runner.StartWorker("logger", func() (worker.Worker, error) { return workerlogger.NewLogger(st.Logger(), agentConfig), nil }) runner.StartWorker("uniter", func() (worker.Worker, error) { return uniter.NewUniter(st.Uniter(), entity.Tag(), dataDir, hookLock), nil }) runner.StartWorker("apiaddressupdater", func() (worker.Worker, error) { return apiaddressupdater.NewAPIAddressUpdater(st.Uniter(), a), nil }) runner.StartWorker("rsyslog", func() (worker.Worker, error) { return newRsyslogConfigWorker(st.Rsyslog(), agentConfig, rsyslog.RsyslogModeForwarding) }) return newCloseWorker(runner, st), nil }
func (s startUniter) step(c *gc.C, ctx *context) { if s.unitTag == "" { s.unitTag = "unit-u-0" } if ctx.uniter != nil { panic("don't start two uniters!") } if ctx.api == nil { panic("API connection not established") } tag, err := names.ParseUnitTag(s.unitTag) if err != nil { panic(err.Error()) } locksDir := filepath.Join(ctx.dataDir, "locks") lock, err := fslock.NewLock(locksDir, "uniter-hook-execution") c.Assert(err, jc.ErrorIsNil) operationExecutor := operation.NewExecutor if s.newExecutorFunc != nil { operationExecutor = s.newExecutorFunc } uniterParams := uniter.UniterParams{ UniterFacade: ctx.api, UnitTag: tag, LeadershipTracker: ctx.leaderTracker, CharmDirLocker: ctx.charmDirLocker, DataDir: ctx.dataDir, MachineLock: lock, UpdateStatusSignal: ctx.updateStatusHookTicker.ReturnTimer, NewOperationExecutor: operationExecutor, Observer: ctx, } ctx.uniter = uniter.NewUniter(&uniterParams) }
func (s startUniter) step(c *gc.C, ctx *context) { if s.unitTag == "" { s.unitTag = "unit-u-0" } if ctx.uniter != nil { panic("don't start two uniters!") } if ctx.api == nil { panic("API connection not established") } tag, err := names.ParseUnitTag(s.unitTag) if err != nil { panic(err.Error()) } locksDir := filepath.Join(ctx.dataDir, "locks") lock, err := fslock.NewLock(locksDir, "uniter-hook-execution") c.Assert(err, jc.ErrorIsNil) uniterParams := uniter.UniterParams{ St: ctx.api, UnitTag: tag, LeadershipManager: ctx.leader, DataDir: ctx.dataDir, HookLock: lock, MetricsTimerChooser: uniter.NewTestingMetricsTimerChooser( ctx.collectMetricsTicker.ReturnTimer, ctx.sendMetricsTicker.ReturnTimer, ), UpdateStatusSignal: ctx.updateStatusHookTicker.ReturnTimer, NewOperationExecutor: s.newExecutorFunc, } ctx.uniter = uniter.NewUniter(&uniterParams) uniter.SetUniterObserver(ctx.uniter, ctx) }
func (s startUniter) step(c *gc.C, ctx *context) { if s.unitTag == "" { s.unitTag = "unit-u-0" } if ctx.uniter != nil { panic("don't start two uniters!") } if ctx.api == nil { panic("API connection not established") } tag, err := names.ParseUnitTag(s.unitTag) if err != nil { panic(err.Error()) } locksDir := filepath.Join(ctx.dataDir, "locks") lock, err := fslock.NewLock(locksDir, "uniter-hook-execution") c.Assert(err, jc.ErrorIsNil) uniterParams := uniter.UniterParams{ ctx.api, tag, ctx.leader, ctx.dataDir, lock, uniter.NewTestingMetricsTimerChooser(ctx.metricsTicker.ReturnTimer), ctx.updateStatusHookTicker.ReturnTimer, } ctx.uniter = uniter.NewUniter(&uniterParams) uniter.SetUniterObserver(ctx.uniter, ctx) }
func (a *UnitAgent) APIWorkers() (worker.Worker, error) { agentConfig := a.CurrentConfig() dataDir := agentConfig.DataDir() hookLock, err := hookExecutionLock(dataDir) if err != nil { return nil, err } st, entity, err := openAPIState(agentConfig, a) if err != nil { return nil, err } // Before starting any workers, ensure we record the Juju version this unit // agent is running. currentTools := &tools.Tools{Version: version.Current} if err := st.Upgrader().SetVersion(agentConfig.Tag().String(), currentTools.Version); err != nil { return nil, errors.Annotate(err, "cannot set unit agent version") } runner := worker.NewRunner(connectionIsFatal(st), moreImportant) runner.StartWorker("upgrader", func() (worker.Worker, error) { return upgrader.NewUpgrader( st.Upgrader(), agentConfig, agentConfig.UpgradedToVersion(), func() bool { return false }, ), nil }) runner.StartWorker("logger", func() (worker.Worker, error) { return workerlogger.NewLogger(st.Logger(), agentConfig), nil }) runner.StartWorker("uniter", func() (worker.Worker, error) { return uniter.NewUniter(st.Uniter(), entity.Tag(), dataDir, hookLock), nil }) runner.StartWorker("apiaddressupdater", func() (worker.Worker, error) { return apiaddressupdater.NewAPIAddressUpdater(st.Uniter(), a), nil }) runner.StartWorker("rsyslog", func() (worker.Worker, error) { return newRsyslogConfigWorker(st.Rsyslog(), agentConfig, rsyslog.RsyslogModeForwarding) }) return newCloseWorker(runner, st), nil }
func (s startUniter) step(c *gc.C, ctx *context) { if s.unitTag == "" { s.unitTag = "unit-u-0" } if ctx.uniter != nil { panic("don't start two uniters!") } if ctx.api == nil { panic("API connection not established") } tag, err := names.ParseUnitTag(s.unitTag) if err != nil { panic(err.Error()) } downloader := api.NewCharmDownloader(ctx.apiConn.Client()) locksDir := filepath.Join(ctx.dataDir, "locks") lock, err := fslock.NewLock(locksDir, "uniter-hook-execution", fslock.Defaults()) c.Assert(err, jc.ErrorIsNil) operationExecutor := operation.NewExecutor if s.newExecutorFunc != nil { operationExecutor = s.newExecutorFunc } uniterParams := uniter.UniterParams{ UniterFacade: ctx.api, UnitTag: tag, LeadershipTracker: ctx.leaderTracker, CharmDirGuard: ctx.charmDirGuard, DataDir: ctx.dataDir, Downloader: downloader, MachineLock: lock, UpdateStatusSignal: ctx.updateStatusHookTicker.ReturnTimer, NewOperationExecutor: operationExecutor, Observer: ctx, // TODO(axw) 2015-11-02 #1512191 // update tests that rely on timing to advance clock // appropriately. Clock: clock.WallClock, } ctx.uniter, err = uniter.NewUniter(&uniterParams) c.Assert(err, jc.ErrorIsNil) }
func (a *UnitAgent) APIWorkers() (_ worker.Worker, err error) { agentConfig := a.CurrentConfig() dataDir := agentConfig.DataDir() hookLock, err := cmdutil.HookExecutionLock(dataDir) if err != nil { return nil, err } st, entity, err := OpenAPIState(agentConfig, a) if err != nil { return nil, err } unitTag, err := names.ParseUnitTag(entity.Tag()) if err != nil { return nil, errors.Trace(err) } // Ensure that the environment uuid is stored in the agent config. // Luckily the API has it recorded for us after we connect. if agentConfig.Environment().Id() == "" { err := a.ChangeConfig(func(setter agent.ConfigSetter) error { environTag, err := st.EnvironTag() if err != nil { return errors.Annotate(err, "no environment uuid set on api") } return setter.Migrate(agent.MigrateParams{ Environment: environTag, }) }) if err != nil { logger.Warningf("unable to save environment uuid: %v", err) // Not really fatal, just annoying. } } defer func() { if err != nil { st.Close() reportClosedUnitAPI(st) } }() // Before starting any workers, ensure we record the Juju version this unit // agent is running. currentTools := &tools.Tools{Version: version.Current} apiStateUpgrader := a.getUpgrader(st) if err := apiStateUpgrader.SetVersion(agentConfig.Tag().String(), currentTools.Version); err != nil { return nil, errors.Annotate(err, "cannot set unit agent version") } runner := worker.NewRunner(cmdutil.ConnectionIsFatal(logger, st), cmdutil.MoreImportant) // start proxyupdater first to ensure proxy settings are correct runner.StartWorker("proxyupdater", func() (worker.Worker, error) { return proxyupdater.New(st.Environment(), false), nil }) runner.StartWorker("upgrader", func() (worker.Worker, error) { return upgrader.NewAgentUpgrader( st.Upgrader(), agentConfig, agentConfig.UpgradedToVersion(), func() bool { return false }, a.initialAgentUpgradeCheckComplete, ), nil }) runner.StartWorker("logger", func() (worker.Worker, error) { return workerlogger.NewLogger(st.Logger(), agentConfig), nil }) runner.StartWorker("uniter", func() (worker.Worker, error) { uniterFacade, err := st.Uniter() if err != nil { return nil, errors.Trace(err) } uniterParams := uniter.UniterParams{ uniterFacade, unitTag, leadership.NewClient(st), dataDir, hookLock, uniter.NewMetricsTimerChooser(), uniter.NewUpdateStatusTimer(), } return uniter.NewUniter(&uniterParams), nil }) runner.StartWorker("apiaddressupdater", func() (worker.Worker, error) { uniterFacade, err := st.Uniter() if err != nil { return nil, errors.Trace(err) } return apiaddressupdater.NewAPIAddressUpdater(uniterFacade, a), nil }) runner.StartWorker("rsyslog", func() (worker.Worker, error) { return cmdutil.NewRsyslogConfigWorker(st.Rsyslog(), agentConfig, rsyslog.RsyslogModeForwarding) }) return cmdutil.NewCloseWorker(logger, runner, st), nil }