// Run runs a machine agent. func (a *MachineAgent) Run(_ *cmd.Context) error { // Due to changes in the logging, and needing to care about old // environments that have been upgraded, we need to explicitly remove the // file writer if one has been added, otherwise we will get duplicate // lines of all logging in the log file. loggo.RemoveWriter("logfile") defer a.tomb.Done() logger.Infof("machine agent %v start (%s [%s])", a.Tag(), version.Current, runtime.Compiler) if err := a.ReadConfig(a.Tag().String()); err != nil { return fmt.Errorf("cannot read agent configuration: %v", err) } a.configChangedVal.Set(struct{}{}) agentConfig := a.CurrentConfig() charm.CacheDir = filepath.Join(agentConfig.DataDir(), "charmcache") if err := a.createJujuRun(agentConfig.DataDir()); err != nil { return fmt.Errorf("cannot create juju run symlink: %v", err) } a.runner.StartWorker("api", a.APIWorker) a.runner.StartWorker("statestarter", a.newStateStarterWorker) a.runner.StartWorker("termination", func() (worker.Worker, error) { return terminationworker.NewWorker(), nil }) // At this point, all workers will have been configured to start close(a.workersStarted) err := a.runner.Wait() if err == worker.ErrTerminateAgent { err = a.uninstallAgent(agentConfig) } err = agentDone(err) a.tomb.Kill(err) return err }
func (s *TerminationWorkerSuite) TestStartStop(c *gc.C) { w := terminationworker.NewWorker(func() error { return errors.New("anything") }) w.Kill() err := w.Wait() c.Assert(err, jc.ErrorIsNil) }
func (s *TerminationWorkerSuite) TestSignal(c *gc.C) { w := terminationworker.NewWorker() proc, err := os.FindProcess(os.Getpid()) c.Assert(err, gc.IsNil) defer proc.Release() err = proc.Signal(terminationworker.TerminationSignal) c.Assert(err, gc.IsNil) err = w.Wait() c.Assert(err, gc.Equals, worker.ErrTerminateAgent) }
func (s *TerminationWorkerSuite) TestSignal(c *gc.C) { //TODO(bogdanteleaga): Inspect this further on windows if runtime.GOOS == "windows" { c.Skip("bug 1403084: sending this signal is not supported on windows") } w := terminationworker.NewWorker() proc, err := os.FindProcess(os.Getpid()) c.Assert(err, jc.ErrorIsNil) defer proc.Release() err = proc.Signal(terminationworker.TerminationSignal) c.Assert(err, jc.ErrorIsNil) err = w.Wait() c.Assert(err, gc.Equals, worker.ErrTerminateAgent) }
func (s *TerminationWorkerSuite) TestStartStop(c *gc.C) { w := terminationworker.NewWorker() w.Kill() err := w.Wait() c.Assert(err, jc.ErrorIsNil) }