github.com/ph/moby@v1.13.1/integration-cli/docker_cli_save_load_unix_test.go (about)

     1  // +build !windows
     2  
     3  package main
     4  
     5  import (
     6  	"context"
     7  	"fmt"
     8  	"io/ioutil"
     9  	"os"
    10  	"os/exec"
    11  	"strings"
    12  	"time"
    13  
    14  	"github.com/docker/docker/pkg/integration/checker"
    15  	"github.com/go-check/check"
    16  	"github.com/kr/pty"
    17  )
    18  
    19  // save a repo and try to load it using stdout
    20  func (s *DockerSuite) TestSaveAndLoadRepoStdout(c *check.C) {
    21  	name := "test-save-and-load-repo-stdout"
    22  	dockerCmd(c, "run", "--name", name, "busybox", "true")
    23  
    24  	repoName := "foobar-save-load-test"
    25  	before, _ := dockerCmd(c, "commit", name, repoName)
    26  	before = strings.TrimRight(before, "\n")
    27  
    28  	tmpFile, err := ioutil.TempFile("", "foobar-save-load-test.tar")
    29  	c.Assert(err, check.IsNil)
    30  	defer os.Remove(tmpFile.Name())
    31  
    32  	saveCmd := exec.Command(dockerBinary, "save", repoName)
    33  	saveCmd.Stdout = tmpFile
    34  
    35  	_, err = runCommand(saveCmd)
    36  	c.Assert(err, check.IsNil)
    37  
    38  	tmpFile, err = os.Open(tmpFile.Name())
    39  	c.Assert(err, check.IsNil)
    40  	defer tmpFile.Close()
    41  
    42  	deleteImages(repoName)
    43  
    44  	loadCmd := exec.Command(dockerBinary, "load")
    45  	loadCmd.Stdin = tmpFile
    46  
    47  	out, _, err := runCommandWithOutput(loadCmd)
    48  	c.Assert(err, check.IsNil, check.Commentf(out))
    49  
    50  	after := inspectField(c, repoName, "Id")
    51  	after = strings.TrimRight(after, "\n")
    52  
    53  	c.Assert(after, check.Equals, before) //inspect is not the same after a save / load
    54  
    55  	deleteImages(repoName)
    56  
    57  	pty, tty, err := pty.Open()
    58  	c.Assert(err, check.IsNil)
    59  	cmd := exec.Command(dockerBinary, "save", repoName)
    60  	cmd.Stdin = tty
    61  	cmd.Stdout = tty
    62  	cmd.Stderr = tty
    63  	c.Assert(cmd.Start(), check.IsNil)
    64  	c.Assert(cmd.Wait(), check.NotNil) //did not break writing to a TTY
    65  
    66  	buf := make([]byte, 1024)
    67  
    68  	n, err := pty.Read(buf)
    69  	c.Assert(err, check.IsNil) //could not read tty output
    70  	c.Assert(string(buf[:n]), checker.Contains, "Cowardly refusing", check.Commentf("help output is not being yielded", out))
    71  }
    72  
    73  func (s *DockerSuite) TestSaveAndLoadWithProgressBar(c *check.C) {
    74  	name := "test-load"
    75  	_, err := buildImage(name, `
    76  	FROM busybox
    77  	RUN touch aa
    78  	`, true)
    79  	c.Assert(err, check.IsNil)
    80  
    81  	tmptar := name + ".tar"
    82  	dockerCmd(c, "save", "-o", tmptar, name)
    83  	defer os.Remove(tmptar)
    84  
    85  	dockerCmd(c, "rmi", name)
    86  	dockerCmd(c, "tag", "busybox", name)
    87  	out, _ := dockerCmd(c, "load", "-i", tmptar)
    88  	expected := fmt.Sprintf("The image %s:latest already exists, renaming the old one with ID", name)
    89  	c.Assert(out, checker.Contains, expected)
    90  }
    91  
    92  // fail because load didn't receive data from stdin
    93  func (s *DockerSuite) TestLoadNoStdinFail(c *check.C) {
    94  	pty, tty, err := pty.Open()
    95  	c.Assert(err, check.IsNil)
    96  	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    97  	defer cancel()
    98  	cmd := exec.CommandContext(ctx, dockerBinary, "load")
    99  	cmd.Stdin = tty
   100  	cmd.Stdout = tty
   101  	cmd.Stderr = tty
   102  	c.Assert(cmd.Run(), check.NotNil) // docker-load should fail
   103  
   104  	buf := make([]byte, 1024)
   105  
   106  	n, err := pty.Read(buf)
   107  	c.Assert(err, check.IsNil) //could not read tty output
   108  	c.Assert(string(buf[:n]), checker.Contains, "requested load from stdin, but stdin is empty")
   109  }