From 4ec2f63e41f838b35986d6b7a3b0d9cc958c231f Mon Sep 17 00:00:00 2001 From: Michael Taufen Date: Tue, 28 Jun 2016 18:51:18 -0700 Subject: [PATCH] Use slices of items to clean up after tests Fixes #27582 We used to maintain a pointer variable for each process to kill after the tests finish. @lavalamp suggested using a slice instead, which is a much cleaner solution. This implements @lavalamp's suggestion and also extends the idea to tracking directories that need to be removed after the tests finish. This also means that we should no longer check for nil `killCmd`s inside `func (k *killCmd) Kill() error {...}` (see #27582 and #27589). If a nil `killCmd` makes it in there, something is bad elsewhere and we want to see the nil pointer exception immediately. --- test/e2e_node/e2e_service.go | 53 ++++++++++++++---------------------- 1 file changed, 20 insertions(+), 33 deletions(-) diff --git a/test/e2e_node/e2e_service.go b/test/e2e_node/e2e_service.go index bb73b67084..e71ff5e3b5 100644 --- a/test/e2e_node/e2e_service.go +++ b/test/e2e_node/e2e_service.go @@ -38,10 +38,10 @@ var serverStartTimeout = flag.Duration("server-start-timeout", time.Second*120, var reportDir = flag.String("report-dir", "", "Path to the directory where the JUnit XML reports should be saved. Default is empty, which doesn't generate these reports.") type e2eService struct { - etcdCmd *killCmd + killCmds []*killCmd + rmDirs []string + etcdDataDir string - apiServerCmd *killCmd - kubeletCmd *killCmd kubeletStaticPodDir string nodeName string logFiles map[string]logFileData @@ -79,19 +79,21 @@ func (es *e2eService) start() error { if err != nil { return err } - es.etcdCmd = cmd + es.killCmds = append(es.killCmds, cmd) + es.rmDirs = append(es.rmDirs, es.etcdDataDir) cmd, err = es.startApiServer() if err != nil { return err } - es.apiServerCmd = cmd + es.killCmds = append(es.killCmds, cmd) cmd, err = es.startKubeletServer() if err != nil { return err } - es.kubeletCmd = cmd + es.killCmds = append(es.killCmds, cmd) + es.rmDirs = append(es.rmDirs, es.kubeletStaticPodDir) return nil } @@ -152,25 +154,15 @@ func isJournaldAvailable() bool { } func (es *e2eService) stop() { - if err := es.stopService(es.kubeletCmd); err != nil { - glog.Errorf("Failed to stop kubelet: %v", err) - } - if es.kubeletStaticPodDir != "" { - err := os.RemoveAll(es.kubeletStaticPodDir) - if err != nil { - glog.Errorf("Failed to delete kubelet static pod directory %s.\n%v", es.kubeletStaticPodDir, err) + for _, k := range es.killCmds { + if err := k.Kill(); err != nil { + glog.Errorf("Failed to stop %v: %v", k.name, err) } } - if err := es.stopService(es.apiServerCmd); err != nil { - glog.Errorf("Failed to stop kube-apiserver: %v", err) - } - if err := es.stopService(es.etcdCmd); err != nil { - glog.Errorf("Failed to stop etcd: %v", err) - } - if es.etcdDataDir != "" { - err := os.RemoveAll(es.etcdDataDir) + for _, d := range es.rmDirs { + err := os.RemoveAll(d) if err != nil { - glog.Errorf("Failed to delete etcd data directory %s.\n%v", es.etcdDataDir, err) + glog.Errorf("Failed to delete directory %s.\n%v", d, err) } } } @@ -304,10 +296,6 @@ func (es *e2eService) startServer(cmd *healthCheckCommand) error { return fmt.Errorf("Timeout waiting for service %s", cmd) } -func (es *e2eService) stopService(cmd *killCmd) error { - return cmd.Kill() -} - // killCmd is a struct to kill a given cmd. The cmd member specifies a command // to find the pid of and attempt to kill. // If the override field is set, that will be used instead to kill the command. @@ -319,19 +307,18 @@ type killCmd struct { } func (k *killCmd) Kill() error { - if k == nil { - glog.V(2).Infof("The killCmd is nil, nothing will be killed") - return nil - } + name := k.name + cmd := k.cmd if k.override != nil { return k.override.Run() } - name := k.name - cmd := k.cmd + if cmd == nil { + return fmt.Errorf("Could not kill %s because both `override` and `cmd` are nil", name) + } - if cmd == nil || cmd.Process == nil { + if cmd.Process == nil { glog.V(2).Infof("%s not running", name) return nil }