Browse Source

Allowing resize tty to only work when container is started
Addresses #8728

Signed-off-by: Srini Brahmaroutu <srbrahma@us.ibm.com>

Srini Brahmaroutu 10 years ago
parent
commit
78a272ce14
3 changed files with 58 additions and 1 deletions
  1. 3 0
      daemon/container.go
  2. 53 0
      integration-cli/docker_api_resize_test.go
  3. 2 1
      integration-cli/docker_utils.go

+ 3 - 0
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)
 }
 

+ 53 - 0
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")
+}

+ 2 - 1
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)