mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
407a626be6
Export image/container metadata stored in graph driver. Right now 3 fields DeviceId, DeviceSize and DeviceName are being exported from devicemapper. Other graph drivers can export fields as they see fit. This data can be used to mount the thin device outside of docker and tools can look into image/container and do some kind of inspection. Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
158 lines
4.7 KiB
Go
158 lines
4.7 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os/exec"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/go-check/check"
|
|
)
|
|
|
|
func (s *DockerSuite) TestInspectImage(c *check.C) {
|
|
imageTest := "emptyfs"
|
|
imageTestID := "511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158"
|
|
id, err := inspectField(imageTest, "Id")
|
|
c.Assert(err, check.IsNil)
|
|
|
|
if id != imageTestID {
|
|
c.Fatalf("Expected id: %s for image: %s but received id: %s", imageTestID, imageTest, id)
|
|
}
|
|
|
|
}
|
|
|
|
func (s *DockerSuite) TestInspectInt64(c *check.C) {
|
|
runCmd := exec.Command(dockerBinary, "run", "-d", "-m=300M", "busybox", "true")
|
|
out, _, _, err := runCommandWithStdoutStderr(runCmd)
|
|
if err != nil {
|
|
c.Fatalf("failed to run container: %v, output: %q", err, out)
|
|
}
|
|
|
|
out = strings.TrimSpace(out)
|
|
|
|
inspectOut, err := inspectField(out, "HostConfig.Memory")
|
|
c.Assert(err, check.IsNil)
|
|
|
|
if inspectOut != "314572800" {
|
|
c.Fatalf("inspect got wrong value, got: %q, expected: 314572800", inspectOut)
|
|
}
|
|
}
|
|
|
|
func (s *DockerSuite) TestInspectImageFilterInt(c *check.C) {
|
|
imageTest := "emptyfs"
|
|
out, err := inspectField(imageTest, "Size")
|
|
c.Assert(err, check.IsNil)
|
|
|
|
size, err := strconv.Atoi(out)
|
|
if err != nil {
|
|
c.Fatalf("failed to inspect size of the image: %s, %v", out, err)
|
|
}
|
|
|
|
//now see if the size turns out to be the same
|
|
formatStr := fmt.Sprintf("--format='{{eq .Size %d}}'", size)
|
|
imagesCmd := exec.Command(dockerBinary, "inspect", formatStr, imageTest)
|
|
out, exitCode, err := runCommandWithOutput(imagesCmd)
|
|
if exitCode != 0 || err != nil {
|
|
c.Fatalf("failed to inspect image: %s, %v", out, err)
|
|
}
|
|
if result, err := strconv.ParseBool(strings.TrimSuffix(out, "\n")); err != nil || !result {
|
|
c.Fatalf("Expected size: %d for image: %s but received size: %s", size, imageTest, strings.TrimSuffix(out, "\n"))
|
|
}
|
|
}
|
|
|
|
func (s *DockerSuite) TestInspectContainerFilterInt(c *check.C) {
|
|
runCmd := exec.Command(dockerBinary, "run", "-i", "-a", "stdin", "busybox", "cat")
|
|
runCmd.Stdin = strings.NewReader("blahblah")
|
|
out, _, _, err := runCommandWithStdoutStderr(runCmd)
|
|
if err != nil {
|
|
c.Fatalf("failed to run container: %v, output: %q", err, out)
|
|
}
|
|
|
|
id := strings.TrimSpace(out)
|
|
|
|
out, err = inspectField(id, "State.ExitCode")
|
|
c.Assert(err, check.IsNil)
|
|
|
|
exitCode, err := strconv.Atoi(out)
|
|
if err != nil {
|
|
c.Fatalf("failed to inspect exitcode of the container: %s, %v", out, err)
|
|
}
|
|
|
|
//now get the exit code to verify
|
|
formatStr := fmt.Sprintf("--format='{{eq .State.ExitCode %d}}'", exitCode)
|
|
runCmd = exec.Command(dockerBinary, "inspect", formatStr, id)
|
|
out, _, err = runCommandWithOutput(runCmd)
|
|
if err != nil {
|
|
c.Fatalf("failed to inspect container: %s, %v", out, err)
|
|
}
|
|
if result, err := strconv.ParseBool(strings.TrimSuffix(out, "\n")); err != nil || !result {
|
|
c.Fatalf("Expected exitcode: %d for container: %s", exitCode, id)
|
|
}
|
|
}
|
|
|
|
func (s *DockerSuite) TestInspectImageGraphDriver(c *check.C) {
|
|
imageTest := "emptyfs"
|
|
name, err := inspectField(imageTest, "GraphDriver.Name")
|
|
c.Assert(err, check.IsNil)
|
|
|
|
if name != "devicemapper" && name != "overlay" && name != "vfs" && name != "zfs" && name != "btrfs" && name != "aufs" {
|
|
c.Fatalf("%v is not a valid graph driver name", name)
|
|
}
|
|
|
|
if name != "devicemapper" {
|
|
return
|
|
}
|
|
|
|
deviceId, err := inspectField(imageTest, "GraphDriver.Data.DeviceId")
|
|
c.Assert(err, check.IsNil)
|
|
|
|
_, err = strconv.Atoi(deviceId)
|
|
if err != nil {
|
|
c.Fatalf("failed to inspect DeviceId of the image: %s, %v", deviceId, err)
|
|
}
|
|
|
|
deviceSize, err := inspectField(imageTest, "GraphDriver.Data.DeviceSize")
|
|
c.Assert(err, check.IsNil)
|
|
|
|
_, err = strconv.ParseUint(deviceSize, 10, 64)
|
|
if err != nil {
|
|
c.Fatalf("failed to inspect DeviceSize of the image: %s, %v", deviceSize, err)
|
|
}
|
|
}
|
|
|
|
func (s *DockerSuite) TestInspectContainerGraphDriver(c *check.C) {
|
|
runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
|
|
out, _, _, err := runCommandWithStdoutStderr(runCmd)
|
|
if err != nil {
|
|
c.Fatalf("failed to run container: %v, output: %q", err, out)
|
|
}
|
|
|
|
out = strings.TrimSpace(out)
|
|
|
|
name, err := inspectField(out, "GraphDriver.Name")
|
|
c.Assert(err, check.IsNil)
|
|
|
|
if name != "devicemapper" && name != "overlay" && name != "vfs" && name != "zfs" && name != "btrfs" && name != "aufs" {
|
|
c.Fatalf("%v is not a valid graph driver name", name)
|
|
}
|
|
|
|
if name != "devicemapper" {
|
|
return
|
|
}
|
|
|
|
deviceId, err := inspectField(out, "GraphDriver.Data.DeviceId")
|
|
c.Assert(err, check.IsNil)
|
|
|
|
_, err = strconv.Atoi(deviceId)
|
|
if err != nil {
|
|
c.Fatalf("failed to inspect DeviceId of the image: %s, %v", deviceId, err)
|
|
}
|
|
|
|
deviceSize, err := inspectField(out, "GraphDriver.Data.DeviceSize")
|
|
c.Assert(err, check.IsNil)
|
|
|
|
_, err = strconv.ParseUint(deviceSize, 10, 64)
|
|
if err != nil {
|
|
c.Fatalf("failed to inspect DeviceSize of the image: %s, %v", deviceSize, err)
|
|
}
|
|
}
|