From f49c3f287b0d26dc705940effa0ec03e1de7bb99 Mon Sep 17 00:00:00 2001 From: Jessica Frazelle Date: Fri, 5 Sep 2014 14:35:55 -0700 Subject: [PATCH] fixes #7802, when api version 1.11 is `json.Marshal`ing the container struct Signed-off-by: Jessica Frazelle Docker-DCO-1.1-Signed-off-by: Jessica Frazelle (github: ) --- daemon/container.go | 6 +-- integration-cli/docker_api_inspect_test.go | 54 ++++++++++++++++++++++ integration-cli/docker_utils.go | 29 ++++++++++++ 3 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 integration-cli/docker_api_inspect_test.go diff --git a/daemon/container.go b/daemon/container.go index f63bbe6370..a7b206722c 100644 --- a/daemon/container.go +++ b/daemon/container.go @@ -50,9 +50,9 @@ type StreamConfig struct { } type Container struct { - *State - root string // Path to the "home" of the container, including metadata. - basefs string // Path to the graphdriver mountpoint + *State `json:"State"` // Needed for remote api version <= 1.11 + root string // Path to the "home" of the container, including metadata. + basefs string // Path to the graphdriver mountpoint ID string diff --git a/integration-cli/docker_api_inspect_test.go b/integration-cli/docker_api_inspect_test.go new file mode 100644 index 0000000000..6902cd4b6f --- /dev/null +++ b/integration-cli/docker_api_inspect_test.go @@ -0,0 +1,54 @@ +package main + +import ( + "encoding/json" + "fmt" + "os/exec" + "testing" +) + +func TestInspectContainerResponse(t *testing.T) { + runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true") + out, _, err := runCommandWithOutput(runCmd) + errorOut(err, t, fmt.Sprintf("failed to create a container: %v %v", out, err)) + + cleanedContainerID := stripTrailingCharacters(out) + + // test on json marshal version + // and latest version + testVersions := []string{"v1.11", "latest"} + + for _, testVersion := range testVersions { + endpoint := "/containers/" + cleanedContainerID + "/json" + if testVersion != "latest" { + endpoint = "/" + testVersion + endpoint + } + body, err := sockRequest("GET", endpoint) + if err != nil { + t.Fatal("sockRequest failed for %s version: %v", testVersion, err) + } + + var inspect_json map[string]interface{} + if err = json.Unmarshal(body, &inspect_json); err != nil { + t.Fatalf("unable to unmarshal body for %s version: %v", testVersion, err) + } + + keys := []string{"State", "Created", "Path", "Args", "Config", "Image", "NetworkSettings", "ResolvConfPath", "HostnamePath", "HostsPath", "Name", "Driver", "ExecDriver", "MountLabel", "ProcessLabel", "Volumes", "VolumesRW"} + + if testVersion == "v1.11" { + keys = append(keys, "ID") + } else { + keys = append(keys, "Id") + } + + for _, key := range keys { + if _, ok := inspect_json[key]; !ok { + t.Fatalf("%s does not exist in reponse for %s version", key, testVersion) + } + } + } + + deleteAllContainers() + + logDone("container json - check keys in container json response") +} diff --git a/integration-cli/docker_utils.go b/integration-cli/docker_utils.go index 7e710b3bc3..8fb5074e93 100644 --- a/integration-cli/docker_utils.go +++ b/integration-cli/docker_utils.go @@ -231,6 +231,35 @@ func (d *Daemon) Cmd(name string, arg ...string) (string, error) { return string(b), err } +func sockRequest(method, endpoint string) ([]byte, error) { + // FIX: the path to sock should not be hardcoded + sock := filepath.Join("/", "var", "run", "docker.sock") + c, err := net.DialTimeout("unix", sock, time.Duration(10*time.Second)) + if err != nil { + return nil, fmt.Errorf("could not dial docker sock at %s: %v", sock, err) + } + + client := httputil.NewClientConn(c, nil) + defer client.Close() + + req, err := http.NewRequest(method, endpoint, nil) + req.Header.Set("Content-Type", "application/json") + if err != nil { + return nil, fmt.Errorf("could not create new request: %v", err) + } + + resp, err := client.Do(req) + if err != nil { + return nil, fmt.Errorf("could not perform request: %v", err) + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("received status != 200 OK: %s", resp.Status) + } + + return ioutil.ReadAll(resp.Body) +} + func deleteContainer(container string) error { container = strings.Replace(container, "\n", " ", -1) container = strings.Trim(container, " ")