func (a *MachineAgent) uninstallAgent(agentConfig agent.Config) error { var errors []error agentServiceName := agentConfig.Value(agent.AgentServiceName) if agentServiceName == "" { // For backwards compatibility, handle lack of AgentServiceName. agentServiceName = os.Getenv("UPSTART_JOB") } if agentServiceName != "" { if err := service.NewService(agentServiceName, common.Conf{}).Remove(); err != nil { errors = append(errors, fmt.Errorf("cannot remove service %q: %v", agentServiceName, err)) } } // Remove the juju-run symlink. if err := os.Remove(jujuRun); err != nil && !os.IsNotExist(err) { errors = append(errors, err) } namespace := agentConfig.Value(agent.Namespace) if err := mongo.RemoveService(namespace); err != nil { errors = append(errors, fmt.Errorf("cannot stop/remove mongo service with namespace %q: %v", namespace, err)) } if err := os.RemoveAll(agentConfig.DataDir()); err != nil { errors = append(errors, err) } if len(errors) == 0 { return nil } return fmt.Errorf("uninstall failed: %v", errors) }
func (s *MongoSuite) TestRemoveService(c *gc.C) { err := mongo.RemoveService("namespace") c.Assert(err, gc.IsNil) c.Assert(s.removed, jc.DeepEquals, []upstart.Service{{ Name: "juju-db-namespace", Conf: common.Conf{InitDir: upstart.InitDir}, }}) }
func (a *MachineAgent) uninstallAgent() error { // We should only uninstall if the uninstall file is present. if !agent.CanUninstall(a) { logger.Infof("ignoring uninstall request") return nil } logger.Infof("uninstalling agent") agentConfig := a.CurrentConfig() var errs []error agentServiceName := agentConfig.Value(agent.AgentServiceName) if agentServiceName == "" { // For backwards compatibility, handle lack of AgentServiceName. agentServiceName = os.Getenv("UPSTART_JOB") } if agentServiceName != "" { svc, err := service.DiscoverService(agentServiceName, common.Conf{}) if err != nil { errs = append(errs, fmt.Errorf("cannot remove service %q: %v", agentServiceName, err)) } else if err := svc.Remove(); err != nil { errs = append(errs, fmt.Errorf("cannot remove service %q: %v", agentServiceName, err)) } } errs = append(errs, a.removeJujudSymlinks()...) // TODO(fwereade): surely this shouldn't be happening here? Once we're // at this point we should expect to be killed in short order; if this // work is remotely important we should be blocking machine death on // its completion. insideContainer := container.RunningInContainer() if insideContainer { // We're running inside LXC, so loop devices may leak. Detach // any loop devices that are backed by files on this machine. // // It is necessary to do this here as well as in container/lxc, // as container/lxc needs to check in the container's rootfs // to see if the loop device is attached to the container; that // will fail if the data-dir is removed first. if err := a.loopDeviceManager.DetachLoopDevices("/", agentConfig.DataDir()); err != nil { errs = append(errs, err) } } if err := mongo.RemoveService(); err != nil { errs = append(errs, errors.Annotate(err, "cannot stop/remove mongo service")) } if err := os.RemoveAll(agentConfig.DataDir()); err != nil { errs = append(errs, err) } if len(errs) == 0 { return nil } return fmt.Errorf("uninstall failed: %v", errs) }
func (s *MongoSuite) TestRemoveService(c *gc.C) { s.data.SetStatus(mongo.ServiceName, "running") err := mongo.RemoveService() c.Assert(err, jc.ErrorIsNil) removed := s.data.Removed() if !c.Check(removed, gc.HasLen, 1) { c.Check(removed[0].Name(), gc.Equals, "juju-db-namespace") c.Check(removed[0].Conf(), jc.DeepEquals, common.Conf{}) } s.data.CheckCallNames(c, "Stop", "Remove") }
// os.IsNotExist error isn't always returned. if _, statErr := os.Stat(env.config.rootDir()); os.IsNotExist(statErr) { return nil } return err } return nil } type agentService interface { Stop() error Remove() error } var mongoRemoveService = func(namespace string) error { return mongo.RemoveService(namespace) } var discoverService = func(name string) (agentService, error) { return service.DiscoverService(name, servicecommon.Conf{}) } // OpenPorts is specified in the Environ interface. func (env *localEnviron) OpenPorts(ports []network.PortRange) error { return fmt.Errorf("open ports not implemented") } // ClosePorts is specified in the Environ interface. func (env *localEnviron) ClosePorts(ports []network.PortRange) error { return fmt.Errorf("close ports not implemented") }