diff --git a/test/e2e_node/services/server.go b/test/e2e_node/services/server.go index 2911a16210..999c11da65 100644 --- a/test/e2e_node/services/server.go +++ b/test/e2e_node/services/server.go @@ -94,51 +94,6 @@ func (s *server) String() string { commandToString(s.startCommand), commandToString(s.killCommand), commandToString(s.restartCommand), s.healthCheckUrls, s.outFilename) } -// readinessCheck checks whether services are ready via the supplied health -// check URLs. Once there is an error in errCh, the function will stop waiting -// and return the error. -// TODO(random-liu): Move this to util -func readinessCheck(name string, urls []string, errCh <-chan error) error { - glog.Infof("Running readiness check for service %q", name) - endTime := time.Now().Add(*serverStartTimeout) - blockCh := make(chan error) - defer close(blockCh) - for endTime.After(time.Now()) { - select { - // We *always* want to run the health check if there is no error on the channel. - // With systemd, reads from errCh report nil because cmd.Run() waits - // on systemd-run, rather than the service process. systemd-run quickly - // exits with status 0, causing the channel to be closed with no error. In - // this case, you want to wait for the health check to complete, rather - // than returning from readinessCheck as soon as the channel is closed. - case err, ok := <-errCh: - if ok { // The channel is not closed, this is a real error - if err != nil { // If there is an error, return it - return err - } - // If not, keep checking readiness. - } else { // The channel is closed, this is only a zero value. - // Replace the errCh with blockCh to avoid busy loop, - // and keep checking readiness. - errCh = blockCh - } - case <-time.After(time.Second): - ready := true - for _, url := range urls { - resp, err := http.Head(url) - if err != nil || resp.StatusCode != http.StatusOK { - ready = false - break - } - } - if ready { - return nil - } - } - } - return fmt.Errorf("e2e service %q readiness check timeout %v", name, *serverStartTimeout) -} - // start starts the server by running its commands, monitors it with a health // check, and ensures that it is restarted if applicable. // diff --git a/test/e2e_node/services/util.go b/test/e2e_node/services/util.go index 558be7d52d..a21a483d5f 100644 --- a/test/e2e_node/services/util.go +++ b/test/e2e_node/services/util.go @@ -17,9 +17,13 @@ limitations under the License. package services import ( + "fmt" + "github.com/golang/glog" + "net/http" "os" "os/signal" "syscall" + "time" ) // terminationSignals are signals that cause the program to exit in the @@ -32,3 +36,47 @@ func waitForTerminationSignal() { signal.Notify(sig, terminationSignals...) <-sig } + +// readinessCheck checks whether services are ready via the supplied health +// check URLs. Once there is an error in errCh, the function will stop waiting +// and return the error. +func readinessCheck(name string, urls []string, errCh <-chan error) error { + glog.Infof("Running readiness check for service %q", name) + endTime := time.Now().Add(*serverStartTimeout) + blockCh := make(chan error) + defer close(blockCh) + for endTime.After(time.Now()) { + select { + // We *always* want to run the health check if there is no error on the channel. + // With systemd, reads from errCh report nil because cmd.Run() waits + // on systemd-run, rather than the service process. systemd-run quickly + // exits with status 0, causing the channel to be closed with no error. In + // this case, you want to wait for the health check to complete, rather + // than returning from readinessCheck as soon as the channel is closed. + case err, ok := <-errCh: + if ok { // The channel is not closed, this is a real error + if err != nil { // If there is an error, return it + return err + } + // If not, keep checking readiness. + } else { // The channel is closed, this is only a zero value. + // Replace the errCh with blockCh to avoid busy loop, + // and keep checking readiness. + errCh = blockCh + } + case <-time.After(time.Second): + ready := true + for _, url := range urls { + resp, err := http.Head(url) + if err != nil || resp.StatusCode != http.StatusOK { + ready = false + break + } + } + if ready { + return nil + } + } + } + return fmt.Errorf("e2e service %q readiness check timeout %v", name, *serverStartTimeout) +}