diff --git a/pkg/framework/test/apiserver.go b/pkg/framework/test/apiserver.go index 5499724d1..482470b55 100644 --- a/pkg/framework/test/apiserver.go +++ b/pkg/framework/test/apiserver.go @@ -1,9 +1,9 @@ package test import ( - "os/exec" - "fmt" + "os/exec" + "time" "github.com/onsi/gomega/gbytes" "github.com/onsi/gomega/gexec" @@ -21,6 +21,9 @@ type APIServer struct { // Start starts the apiserver, and returns a gexec.Session. To stop it again, call Terminate and Wait on that session. func (s *APIServer) Start() error { + s.stdOut = gbytes.NewBuffer() + s.stdErr = gbytes.NewBuffer() + args := []string{ "--authorization-mode=Node,RBAC", "--runtime-config=admissionregistration.k8s.io/v1alpha1", @@ -34,16 +37,28 @@ func (s *APIServer) Start() error { fmt.Sprintf("--etcd-servers=%s", s.EtcdURL), } + detectedStart := s.stdErr.Detect("Serving insecurely on 127.0.0.1:8080") + timedOut := time.After(20 * time.Second) + command := exec.Command(s.Path, args...) var err error s.session, err = gexec.Start(command, s.stdOut, s.stdErr) - return err + if err != nil { + return err + } + + select { + case <-detectedStart: + return nil + case <-timedOut: + return fmt.Errorf("timeout waiting for apiserver to start serving") + } } // Stop stops this process gracefully. func (s *APIServer) Stop() { if s.session != nil { - s.session.Terminate().Wait() + s.session.Terminate().Wait(20 * time.Second) } } diff --git a/pkg/framework/test/assets/fakeapiserver/apiserver.go b/pkg/framework/test/assets/fakeapiserver/apiserver.go index aee09e345..d9d2fc33a 100644 --- a/pkg/framework/test/assets/fakeapiserver/apiserver.go +++ b/pkg/framework/test/assets/fakeapiserver/apiserver.go @@ -35,6 +35,7 @@ func main() { } } fmt.Println("Everything is fine") + fmt.Fprintln(os.Stderr, "Serving insecurely on 127.0.0.1:8080") time.Sleep(10 * time.Minute) } diff --git a/pkg/framework/test/assets/fakeetcd/etcd.go b/pkg/framework/test/assets/fakeetcd/etcd.go index 3895d1f29..b0535c4b6 100644 --- a/pkg/framework/test/assets/fakeetcd/etcd.go +++ b/pkg/framework/test/assets/fakeetcd/etcd.go @@ -31,6 +31,7 @@ func main() { } } fmt.Println("Everything is dandy") + fmt.Fprintln(os.Stderr, "serving insecure client requests on 127.0.0.1:2379") time.Sleep(10 * time.Minute) } diff --git a/pkg/framework/test/etcd.go b/pkg/framework/test/etcd.go index 64075021e..7dd44e223 100644 --- a/pkg/framework/test/etcd.go +++ b/pkg/framework/test/etcd.go @@ -1,7 +1,9 @@ package test import ( + "fmt" "os/exec" + "time" "github.com/onsi/gomega" "github.com/onsi/gomega/gbytes" @@ -28,6 +30,8 @@ type DataDirManager interface { // Start starts the etcd, and returns a gexec.Session. To stop it again, call Terminate and Wait on that session. func (e *Etcd) Start() error { e.dataDirManager = NewTempDirManager() + e.stdOut = gbytes.NewBuffer() + e.stdErr = gbytes.NewBuffer() dataDir, err := e.dataDirManager.Create() if err != nil { @@ -44,15 +48,27 @@ func (e *Etcd) Start() error { dataDir, } + detectedStart := e.stdErr.Detect("serving insecure client requests on 127.0.0.1:2379") + timedOut := time.After(20 * time.Second) + command := exec.Command(e.Path, args...) e.session, err = gexec.Start(command, e.stdOut, e.stdErr) - return err + if err != nil { + return err + } + + select { + case <-detectedStart: + return nil + case <-timedOut: + return fmt.Errorf("timeout waiting for etcd to start serving") + } } // Stop stops this process gracefully. func (e *Etcd) Stop() { if e.session != nil { - e.session.Terminate().Wait() + e.session.Terminate().Wait(20 * time.Second) err := e.dataDirManager.Destroy() gomega.Expect(err).NotTo(gomega.HaveOccurred()) } diff --git a/pkg/framework/test/integration/integration_test.go b/pkg/framework/test/integration/integration_test.go index 8f71a4715..199f623d1 100644 --- a/pkg/framework/test/integration/integration_test.go +++ b/pkg/framework/test/integration/integration_test.go @@ -28,9 +28,9 @@ var _ = Describe("Integration", func() { isEtcdListening := isSomethingListeningOnPort(2379) isAPIServerListening := isSomethingListeningOnPort(8080) - Eventually(isEtcdListening, 25*time.Second).Should(BeTrue(), "Expected Etcd to listen on 2379") + Expect(isEtcdListening()).To(BeTrue(), "Expected Etcd to listen on 2379") - Eventually(isAPIServerListening, 25*time.Second).Should(BeTrue(), "Expected APIServer to listen on 8080") + Expect(isAPIServerListening()).To(BeTrue(), "Expected APIServer to listen on 8080") err = fixtures.Stop() Expect(err).NotTo(HaveOccurred(), "Expected fixtures to stop successfully")