mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
[testing] Use container address to talk to server running inside container.
Docker does not have IPv6 port forwarding as tracked by the following issue: https://github.com/moby/moby/issues/11518 So when running bazel itself inside a docker container, we can not use the host port bindings to communicate with sockets inside the container. This was causing integration tests and image tests to fail when run through our Makefile targets. PiperOrigin-RevId: 332355051
This commit is contained in:
@@ -332,13 +332,13 @@ func PollContext(ctx context.Context, cb func() error) error {
|
||||
}
|
||||
|
||||
// WaitForHTTP tries GET requests on a port until the call succeeds or timeout.
|
||||
func WaitForHTTP(port int, timeout time.Duration) error {
|
||||
func WaitForHTTP(ip string, port int, timeout time.Duration) error {
|
||||
cb := func() error {
|
||||
c := &http.Client{
|
||||
// Calculate timeout to be able to do minimum 5 attempts.
|
||||
Timeout: timeout / 5,
|
||||
}
|
||||
url := fmt.Sprintf("http://localhost:%d/", port)
|
||||
url := fmt.Sprintf("http://%s:%d/", ip, port)
|
||||
resp, err := c.Get(url)
|
||||
if err != nil {
|
||||
log.Printf("Waiting %s: %v", url, err)
|
||||
|
||||
@@ -64,9 +64,10 @@ func TestLifeCycle(t *testing.T) {
|
||||
defer d.CleanUp(ctx)
|
||||
|
||||
// Start the container.
|
||||
port := 80
|
||||
if err := d.Create(ctx, dockerutil.RunOpts{
|
||||
Image: "basic/nginx",
|
||||
Ports: []int{80},
|
||||
Ports: []int{port},
|
||||
}); err != nil {
|
||||
t.Fatalf("docker create failed: %v", err)
|
||||
}
|
||||
@@ -74,16 +75,15 @@ func TestLifeCycle(t *testing.T) {
|
||||
t.Fatalf("docker start failed: %v", err)
|
||||
}
|
||||
|
||||
// Test that container is working.
|
||||
port, err := d.FindPort(ctx, 80)
|
||||
ip, err := d.FindIP(ctx, false)
|
||||
if err != nil {
|
||||
t.Fatalf("docker.FindPort(80) failed: %v", err)
|
||||
t.Fatalf("docker.FindIP failed: %v", err)
|
||||
}
|
||||
if err := testutil.WaitForHTTP(port, defaultWait); err != nil {
|
||||
if err := testutil.WaitForHTTP(ip.String(), port, defaultWait); err != nil {
|
||||
t.Fatalf("WaitForHTTP() timeout: %v", err)
|
||||
}
|
||||
client := http.Client{Timeout: defaultWait}
|
||||
if err := httpRequestSucceeds(client, "localhost", port); err != nil {
|
||||
if err := httpRequestSucceeds(client, ip.String(), port); err != nil {
|
||||
t.Errorf("http request failed: %v", err)
|
||||
}
|
||||
|
||||
@@ -105,27 +105,28 @@ func TestPauseResume(t *testing.T) {
|
||||
defer d.CleanUp(ctx)
|
||||
|
||||
// Start the container.
|
||||
port := 8080
|
||||
if err := d.Spawn(ctx, dockerutil.RunOpts{
|
||||
Image: "basic/python",
|
||||
Ports: []int{8080}, // See Dockerfile.
|
||||
Ports: []int{port}, // See Dockerfile.
|
||||
}); err != nil {
|
||||
t.Fatalf("docker run failed: %v", err)
|
||||
}
|
||||
|
||||
// Find where port 8080 is mapped to.
|
||||
port, err := d.FindPort(ctx, 8080)
|
||||
// Find container IP address.
|
||||
ip, err := d.FindIP(ctx, false)
|
||||
if err != nil {
|
||||
t.Fatalf("docker.FindPort(8080) failed: %v", err)
|
||||
t.Fatalf("docker.FindIP failed: %v", err)
|
||||
}
|
||||
|
||||
// Wait until it's up and running.
|
||||
if err := testutil.WaitForHTTP(port, defaultWait); err != nil {
|
||||
if err := testutil.WaitForHTTP(ip.String(), port, defaultWait); err != nil {
|
||||
t.Fatalf("WaitForHTTP() timeout: %v", err)
|
||||
}
|
||||
|
||||
// Check that container is working.
|
||||
client := http.Client{Timeout: defaultWait}
|
||||
if err := httpRequestSucceeds(client, "localhost", port); err != nil {
|
||||
if err := httpRequestSucceeds(client, ip.String(), port); err != nil {
|
||||
t.Error("http request failed:", err)
|
||||
}
|
||||
|
||||
@@ -135,7 +136,7 @@ func TestPauseResume(t *testing.T) {
|
||||
|
||||
// Check if container is paused.
|
||||
client = http.Client{Timeout: 10 * time.Millisecond} // Don't wait a minute.
|
||||
switch _, err := client.Get(fmt.Sprintf("http://localhost:%d", port)); v := err.(type) {
|
||||
switch _, err := client.Get(fmt.Sprintf("http://%s:%d", ip.String(), port)); v := err.(type) {
|
||||
case nil:
|
||||
t.Errorf("http req expected to fail but it succeeded")
|
||||
case net.Error:
|
||||
@@ -151,13 +152,13 @@ func TestPauseResume(t *testing.T) {
|
||||
}
|
||||
|
||||
// Wait until it's up and running.
|
||||
if err := testutil.WaitForHTTP(port, defaultWait); err != nil {
|
||||
if err := testutil.WaitForHTTP(ip.String(), port, defaultWait); err != nil {
|
||||
t.Fatalf("WaitForHTTP() timeout: %v", err)
|
||||
}
|
||||
|
||||
// Check if container is working again.
|
||||
client = http.Client{Timeout: defaultWait}
|
||||
if err := httpRequestSucceeds(client, "localhost", port); err != nil {
|
||||
if err := httpRequestSucceeds(client, ip.String(), port); err != nil {
|
||||
t.Error("http request failed:", err)
|
||||
}
|
||||
}
|
||||
@@ -179,9 +180,10 @@ func TestCheckpointRestore(t *testing.T) {
|
||||
defer d.CleanUp(ctx)
|
||||
|
||||
// Start the container.
|
||||
port := 8080
|
||||
if err := d.Spawn(ctx, dockerutil.RunOpts{
|
||||
Image: "basic/python",
|
||||
Ports: []int{8080}, // See Dockerfile.
|
||||
Ports: []int{port}, // See Dockerfile.
|
||||
}); err != nil {
|
||||
t.Fatalf("docker run failed: %v", err)
|
||||
}
|
||||
@@ -199,20 +201,20 @@ func TestCheckpointRestore(t *testing.T) {
|
||||
t.Fatalf("docker restore failed: %v", err)
|
||||
}
|
||||
|
||||
// Find where port 8080 is mapped to.
|
||||
port, err := d.FindPort(ctx, 8080)
|
||||
// Find container IP address.
|
||||
ip, err := d.FindIP(ctx, false)
|
||||
if err != nil {
|
||||
t.Fatalf("docker.FindPort(8080) failed: %v", err)
|
||||
t.Fatalf("docker.FindIP failed: %v", err)
|
||||
}
|
||||
|
||||
// Wait until it's up and running.
|
||||
if err := testutil.WaitForHTTP(port, defaultWait); err != nil {
|
||||
if err := testutil.WaitForHTTP(ip.String(), port, defaultWait); err != nil {
|
||||
t.Fatalf("WaitForHTTP() timeout: %v", err)
|
||||
}
|
||||
|
||||
// Check if container is working again.
|
||||
client := http.Client{Timeout: defaultWait}
|
||||
if err := httpRequestSucceeds(client, "localhost", port); err != nil {
|
||||
if err := httpRequestSucceeds(client, ip.String(), port); err != nil {
|
||||
t.Error("http request failed:", err)
|
||||
}
|
||||
}
|
||||
|
||||
+34
-30
@@ -63,8 +63,8 @@ func TestHelloWorld(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func runHTTPRequest(port int) error {
|
||||
url := fmt.Sprintf("http://localhost:%d/not-found", port)
|
||||
func runHTTPRequest(ip string, port int) error {
|
||||
url := fmt.Sprintf("http://%s:%d/not-found", ip, port)
|
||||
resp, err := http.Get(url)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error reaching http server: %v", err)
|
||||
@@ -73,7 +73,7 @@ func runHTTPRequest(port int) error {
|
||||
return fmt.Errorf("Wrong response code, got: %d, want: %d", resp.StatusCode, want)
|
||||
}
|
||||
|
||||
url = fmt.Sprintf("http://localhost:%d/latin10k.txt", port)
|
||||
url = fmt.Sprintf("http://%s:%d/latin10k.txt", ip, port)
|
||||
resp, err = http.Get(url)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Error reaching http server: %v", err)
|
||||
@@ -95,13 +95,13 @@ func runHTTPRequest(port int) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func testHTTPServer(t *testing.T, port int) {
|
||||
func testHTTPServer(t *testing.T, ip string, port int) {
|
||||
const requests = 10
|
||||
ch := make(chan error, requests)
|
||||
for i := 0; i < requests; i++ {
|
||||
go func() {
|
||||
start := time.Now()
|
||||
err := runHTTPRequest(port)
|
||||
err := runHTTPRequest(ip, port)
|
||||
log.Printf("Response time %v: %v", time.Since(start).String(), err)
|
||||
ch <- err
|
||||
}()
|
||||
@@ -110,7 +110,7 @@ func testHTTPServer(t *testing.T, port int) {
|
||||
for i := 0; i < requests; i++ {
|
||||
err := <-ch
|
||||
if err != nil {
|
||||
t.Errorf("testHTTPServer(%d) failed: %v", port, err)
|
||||
t.Errorf("testHTTPServer(%s, %d) failed: %v", ip, port, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -121,27 +121,28 @@ func TestHttpd(t *testing.T) {
|
||||
defer d.CleanUp(ctx)
|
||||
|
||||
// Start the container.
|
||||
port := 80
|
||||
opts := dockerutil.RunOpts{
|
||||
Image: "basic/httpd",
|
||||
Ports: []int{80},
|
||||
Ports: []int{port},
|
||||
}
|
||||
d.CopyFiles(&opts, "/usr/local/apache2/htdocs", "test/image/latin10k.txt")
|
||||
if err := d.Spawn(ctx, opts); err != nil {
|
||||
t.Fatalf("docker run failed: %v", err)
|
||||
}
|
||||
|
||||
// Find where port 80 is mapped to.
|
||||
port, err := d.FindPort(ctx, 80)
|
||||
// Find container IP address.
|
||||
ip, err := d.FindIP(ctx, false)
|
||||
if err != nil {
|
||||
t.Fatalf("FindPort(80) failed: %v", err)
|
||||
t.Fatalf("docker.FindIP failed: %v", err)
|
||||
}
|
||||
|
||||
// Wait until it's up and running.
|
||||
if err := testutil.WaitForHTTP(port, defaultWait); err != nil {
|
||||
if err := testutil.WaitForHTTP(ip.String(), port, defaultWait); err != nil {
|
||||
t.Errorf("WaitForHTTP() timeout: %v", err)
|
||||
}
|
||||
|
||||
testHTTPServer(t, port)
|
||||
testHTTPServer(t, ip.String(), port)
|
||||
}
|
||||
|
||||
func TestNginx(t *testing.T) {
|
||||
@@ -150,27 +151,28 @@ func TestNginx(t *testing.T) {
|
||||
defer d.CleanUp(ctx)
|
||||
|
||||
// Start the container.
|
||||
port := 80
|
||||
opts := dockerutil.RunOpts{
|
||||
Image: "basic/nginx",
|
||||
Ports: []int{80},
|
||||
Ports: []int{port},
|
||||
}
|
||||
d.CopyFiles(&opts, "/usr/share/nginx/html", "test/image/latin10k.txt")
|
||||
if err := d.Spawn(ctx, opts); err != nil {
|
||||
t.Fatalf("docker run failed: %v", err)
|
||||
}
|
||||
|
||||
// Find where port 80 is mapped to.
|
||||
port, err := d.FindPort(ctx, 80)
|
||||
// Find container IP address.
|
||||
ip, err := d.FindIP(ctx, false)
|
||||
if err != nil {
|
||||
t.Fatalf("FindPort(80) failed: %v", err)
|
||||
t.Fatalf("docker.FindIP failed: %v", err)
|
||||
}
|
||||
|
||||
// Wait until it's up and running.
|
||||
if err := testutil.WaitForHTTP(port, defaultWait); err != nil {
|
||||
if err := testutil.WaitForHTTP(ip.String(), port, defaultWait); err != nil {
|
||||
t.Errorf("WaitForHTTP() timeout: %v", err)
|
||||
}
|
||||
|
||||
testHTTPServer(t, port)
|
||||
testHTTPServer(t, ip.String(), port)
|
||||
}
|
||||
|
||||
func TestMysql(t *testing.T) {
|
||||
@@ -218,26 +220,27 @@ func TestTomcat(t *testing.T) {
|
||||
defer d.CleanUp(ctx)
|
||||
|
||||
// Start the server.
|
||||
port := 8080
|
||||
if err := d.Spawn(ctx, dockerutil.RunOpts{
|
||||
Image: "basic/tomcat",
|
||||
Ports: []int{8080},
|
||||
Ports: []int{port},
|
||||
}); err != nil {
|
||||
t.Fatalf("docker run failed: %v", err)
|
||||
}
|
||||
|
||||
// Find where port 8080 is mapped to.
|
||||
port, err := d.FindPort(ctx, 8080)
|
||||
// Find container IP address.
|
||||
ip, err := d.FindIP(ctx, false)
|
||||
if err != nil {
|
||||
t.Fatalf("FindPort(8080) failed: %v", err)
|
||||
t.Fatalf("docker.FindIP failed: %v", err)
|
||||
}
|
||||
|
||||
// Wait until it's up and running.
|
||||
if err := testutil.WaitForHTTP(port, defaultWait); err != nil {
|
||||
if err := testutil.WaitForHTTP(ip.String(), port, defaultWait); err != nil {
|
||||
t.Fatalf("WaitForHTTP() timeout: %v", err)
|
||||
}
|
||||
|
||||
// Ensure that content is being served.
|
||||
url := fmt.Sprintf("http://localhost:%d", port)
|
||||
url := fmt.Sprintf("http://%s:%d", ip.String(), port)
|
||||
resp, err := http.Get(url)
|
||||
if err != nil {
|
||||
t.Errorf("Error reaching http server: %v", err)
|
||||
@@ -253,28 +256,29 @@ func TestRuby(t *testing.T) {
|
||||
defer d.CleanUp(ctx)
|
||||
|
||||
// Execute the ruby workload.
|
||||
port := 8080
|
||||
opts := dockerutil.RunOpts{
|
||||
Image: "basic/ruby",
|
||||
Ports: []int{8080},
|
||||
Ports: []int{port},
|
||||
}
|
||||
d.CopyFiles(&opts, "/src", "test/image/ruby.rb", "test/image/ruby.sh")
|
||||
if err := d.Spawn(ctx, opts, "/src/ruby.sh"); err != nil {
|
||||
t.Fatalf("docker run failed: %v", err)
|
||||
}
|
||||
|
||||
// Find where port 8080 is mapped to.
|
||||
port, err := d.FindPort(ctx, 8080)
|
||||
// Find container IP address.
|
||||
ip, err := d.FindIP(ctx, false)
|
||||
if err != nil {
|
||||
t.Fatalf("FindPort(8080) failed: %v", err)
|
||||
t.Fatalf("docker.FindIP failed: %v", err)
|
||||
}
|
||||
|
||||
// Wait until it's up and running, 'gem install' can take some time.
|
||||
if err := testutil.WaitForHTTP(port, time.Minute); err != nil {
|
||||
if err := testutil.WaitForHTTP(ip.String(), port, time.Minute); err != nil {
|
||||
t.Fatalf("WaitForHTTP() timeout: %v", err)
|
||||
}
|
||||
|
||||
// Ensure that content is being served.
|
||||
url := fmt.Sprintf("http://localhost:%d", port)
|
||||
url := fmt.Sprintf("http://%s:%d", ip.String(), port)
|
||||
resp, err := http.Get(url)
|
||||
if err != nil {
|
||||
t.Errorf("error reaching http server: %v", err)
|
||||
|
||||
Reference in New Issue
Block a user