From 78a272ce14a43f81a79f1b948d5cfd120405f8c9 Mon Sep 17 00:00:00 2001 From: Srini Brahmaroutu Date: Thu, 23 Oct 2014 20:30:18 +0000 Subject: [PATCH] Allowing resize tty to only work when container is started Addresses #8728 Signed-off-by: Srini Brahmaroutu --- daemon/container.go | 3 ++ integration-cli/docker_api_resize_test.go | 53 +++++++++++++++++++++++ integration-cli/docker_utils.go | 3 +- 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 integration-cli/docker_api_resize_test.go diff --git a/daemon/container.go b/daemon/container.go index e5c9fadace..f3db268633 100644 --- a/daemon/container.go +++ b/daemon/container.go @@ -691,6 +691,9 @@ func (container *Container) Restart(seconds int) error { } func (container *Container) Resize(h, w int) error { + if !container.IsRunning() { + return fmt.Errorf("Cannot resize container %s, container is not running", container.ID) + } return container.command.ProcessConfig.Terminal.Resize(h, w) } diff --git a/integration-cli/docker_api_resize_test.go b/integration-cli/docker_api_resize_test.go new file mode 100644 index 0000000000..3595999a71 --- /dev/null +++ b/integration-cli/docker_api_resize_test.go @@ -0,0 +1,53 @@ +package main + +import ( + "os/exec" + "strings" + "testing" +) + +func TestResizeApiResponse(t *testing.T) { + runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true") + out, _, err := runCommandWithOutput(runCmd) + if err != nil { + t.Fatalf(out, err) + } + defer deleteAllContainers() + cleanedContainerID := stripTrailingCharacters(out) + + endpoint := "/containers/" + cleanedContainerID + "/resize?h=40&w=40" + _, err = sockRequest("POST", endpoint) + if err != nil { + t.Fatalf("resize Request failed %v", err) + } + + logDone("container resize - when started") +} + +func TestResizeApiResponseWhenContainerNotStarted(t *testing.T) { + runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true") + out, _, err := runCommandWithOutput(runCmd) + if err != nil { + t.Fatalf(out, err) + } + defer deleteAllContainers() + cleanedContainerID := stripTrailingCharacters(out) + + // make sure the exited cintainer is not running + runCmd = exec.Command(dockerBinary, "wait", cleanedContainerID) + out, _, err = runCommandWithOutput(runCmd) + if err != nil { + t.Fatalf(out, err) + } + + endpoint := "/containers/" + cleanedContainerID + "/resize?h=40&w=40" + body, err := sockRequest("POST", endpoint) + if err == nil { + t.Fatalf("resize should fail when container is not started") + } + if !strings.Contains(string(body), "Cannot resize container") && !strings.Contains(string(body), cleanedContainerID) { + t.Fatalf("resize should fail with message 'Cannot resize container' but instead received %s", string(body)) + } + + logDone("container resize - when not started should not resize") +} diff --git a/integration-cli/docker_utils.go b/integration-cli/docker_utils.go index 109014db74..b9660d20b6 100644 --- a/integration-cli/docker_utils.go +++ b/integration-cli/docker_utils.go @@ -254,7 +254,8 @@ func sockRequest(method, endpoint string) ([]byte, error) { } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("received status != 200 OK: %s", resp.Status) + body, _ := ioutil.ReadAll(resp.Body) + return body, fmt.Errorf("received status != 200 OK: %s", resp.Status) } return ioutil.ReadAll(resp.Body)