-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Salahuddin Khan <salah@docker.com>
- Loading branch information
1 parent
d3cc071
commit 4c8b1fd
Showing
17 changed files
with
630 additions
and
383 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
package container // import "github.com/docker/docker/integration/container" | ||
|
||
import ( | ||
"context" | ||
"fmt" | ||
"strconv" | ||
"strings" | ||
"testing" | ||
"time" | ||
|
||
"github.com/docker/docker/api/types" | ||
"github.com/docker/docker/integration/internal/container" | ||
"github.com/docker/docker/internal/test/request" | ||
"gotest.tools/assert" | ||
"gotest.tools/icmd" | ||
"gotest.tools/poll" | ||
"gotest.tools/skip" | ||
) | ||
|
||
// TestStopContainerWithTimeout checks that ContainerStop with | ||
// a timeout works as documented, i.e. in case of negative timeout | ||
// waiting is not limited (issue #35311). | ||
func TestStopContainerWithTimeout(t *testing.T) { | ||
defer setupTest(t)() | ||
client := request.NewAPIClient(t) | ||
ctx := context.Background() | ||
|
||
testCmd := container.WithCmd("sh", "-c", "sleep 2 && exit 42") | ||
testData := []struct { | ||
doc string | ||
timeout int | ||
expectedExitCode int | ||
}{ | ||
// In case container is forcefully killed, 137 is returned, | ||
// otherwise the exit code from the above script | ||
{ | ||
"zero timeout: expect forceful container kill", | ||
0, 137, | ||
}, | ||
{ | ||
"too small timeout: expect forceful container kill", | ||
1, 137, | ||
}, | ||
{ | ||
"big enough timeout: expect graceful container stop", | ||
3, 42, | ||
}, | ||
{ | ||
"unlimited timeout: expect graceful container stop", | ||
-1, 42, | ||
}, | ||
} | ||
|
||
for _, d := range testData { | ||
d := d | ||
t.Run(strconv.Itoa(d.timeout), func(t *testing.T) { | ||
t.Parallel() | ||
id := container.Run(t, ctx, client, testCmd) | ||
|
||
timeout := time.Duration(d.timeout) * time.Second | ||
err := client.ContainerStop(ctx, id, &timeout) | ||
assert.NilError(t, err) | ||
|
||
poll.WaitOn(t, container.IsStopped(ctx, client, id), | ||
poll.WithDelay(100*time.Millisecond)) | ||
|
||
inspect, err := client.ContainerInspect(ctx, id) | ||
assert.NilError(t, err) | ||
assert.Equal(t, inspect.State.ExitCode, d.expectedExitCode) | ||
}) | ||
} | ||
} | ||
|
||
func TestDeleteDevicemapper(t *testing.T) { | ||
skip.If(t, testEnv.DaemonInfo.Driver != "devicemapper") | ||
skip.If(t, testEnv.IsRemoteDaemon, "cannot start daemon on remote test run") | ||
|
||
defer setupTest(t)() | ||
client := request.NewAPIClient(t) | ||
ctx := context.Background() | ||
|
||
id := container.Run(t, ctx, client, container.WithName("foo-"+t.Name()), container.WithCmd("echo")) | ||
|
||
poll.WaitOn(t, container.IsStopped(ctx, client, id), poll.WithDelay(100*time.Millisecond)) | ||
|
||
inspect, err := client.ContainerInspect(ctx, id) | ||
assert.NilError(t, err) | ||
|
||
deviceID := inspect.GraphDriver.Data["DeviceId"] | ||
|
||
// Find pool name from device name | ||
deviceName := inspect.GraphDriver.Data["DeviceName"] | ||
devicePrefix := deviceName[:strings.LastIndex(deviceName, "-")] | ||
devicePool := fmt.Sprintf("/dev/mapper/%s-pool", devicePrefix) | ||
|
||
result := icmd.RunCommand("dmsetup", "message", devicePool, "0", fmt.Sprintf("delete %s", deviceID)) | ||
result.Assert(t, icmd.Success) | ||
|
||
err = client.ContainerRemove(ctx, id, types.ContainerRemoveOptions{}) | ||
assert.NilError(t, err) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
package container // import "github.com/docker/docker/integration/container" | ||
|
||
import ( | ||
"context" | ||
"strconv" | ||
"testing" | ||
"time" | ||
|
||
"github.com/docker/docker/integration/internal/container" | ||
"github.com/docker/docker/internal/test/request" | ||
"gotest.tools/assert" | ||
"gotest.tools/poll" | ||
"gotest.tools/skip" | ||
) | ||
|
||
// TestStopContainerWithTimeout checks that ContainerStop with | ||
// a timeout works as documented, i.e. in case of negative timeout | ||
// waiting is not limited (issue #35311). | ||
func TestStopContainerWithTimeout(t *testing.T) { | ||
skip.If(t, testEnv.OSType == "windows") | ||
defer setupTest(t)() | ||
client := request.NewAPIClient(t) | ||
ctx := context.Background() | ||
|
||
testCmd := container.WithCmd("sh", "-c", "sleep 2 && exit 42") | ||
testData := []struct { | ||
doc string | ||
timeout int | ||
expectedExitCode int | ||
}{ | ||
// In case container is forcefully killed, 137 is returned, | ||
// otherwise the exit code from the above script | ||
{ | ||
"zero timeout: expect forceful container kill", | ||
1, 0x40010004, | ||
}, | ||
{ | ||
"too small timeout: expect forceful container kill", | ||
2, 0x40010004, | ||
}, | ||
{ | ||
"big enough timeout: expect graceful container stop", | ||
120, 42, | ||
}, | ||
{ | ||
"unlimited timeout: expect graceful container stop", | ||
-1, 42, | ||
}, | ||
} | ||
|
||
for _, d := range testData { | ||
d := d | ||
t.Run(strconv.Itoa(d.timeout), func(t *testing.T) { | ||
t.Parallel() | ||
id := container.Run(t, ctx, client, testCmd) | ||
|
||
timeout := time.Duration(d.timeout) * time.Second | ||
err := client.ContainerStop(ctx, id, &timeout) | ||
assert.NilError(t, err) | ||
|
||
poll.WaitOn(t, container.IsStopped(ctx, client, id), | ||
poll.WithDelay(100*time.Millisecond)) | ||
|
||
inspect, err := client.ContainerInspect(ctx, id) | ||
assert.NilError(t, err) | ||
assert.Equal(t, inspect.State.ExitCode, d.expectedExitCode) | ||
}) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
package requirement // import "github.com/docker/docker/integration/internal/requirement" | ||
|
||
import ( | ||
"strings" | ||
|
||
"github.com/docker/docker/pkg/parsers/kernel" | ||
"gotest.tools/icmd" | ||
) | ||
|
||
func overlayFSSupported() bool { | ||
result := icmd.RunCommand("/bin/sh", "-c", "cat /proc/filesystems") | ||
if result.Error != nil { | ||
return false | ||
} | ||
return strings.Contains(result.Combined(), "overlay\n") | ||
} | ||
|
||
// Overlay2Supported returns true if the current system supports overlay2 as graphdriver | ||
func Overlay2Supported(kernelVersion string) bool { | ||
if !overlayFSSupported() { | ||
return false | ||
} | ||
|
||
daemonV, err := kernel.ParseRelease(kernelVersion) | ||
if err != nil { | ||
return false | ||
} | ||
requiredV := kernel.VersionInfo{Kernel: 4} | ||
return kernel.CompareKernelVersion(*daemonV, requiredV) > -1 | ||
|
||
} |
Oops, something went wrong.