github.com/codemac/docker@v1.2.1-0.20150518222241-6a18412d5b9c/integration-cli/docker_api_images_test.go (about)

     1  package main
     2  
     3  import (
     4  	"encoding/json"
     5  	"net/http"
     6  	"net/url"
     7  	"os/exec"
     8  	"strings"
     9  
    10  	"github.com/docker/docker/api/types"
    11  	"github.com/go-check/check"
    12  )
    13  
    14  func (s *DockerSuite) TestApiImagesFilter(c *check.C) {
    15  	name := "utest:tag1"
    16  	name2 := "utest/docker:tag2"
    17  	name3 := "utest:5000/docker:tag3"
    18  	for _, n := range []string{name, name2, name3} {
    19  		if out, err := exec.Command(dockerBinary, "tag", "busybox", n).CombinedOutput(); err != nil {
    20  			c.Fatal(err, out)
    21  		}
    22  	}
    23  	type image types.Image
    24  	getImages := func(filter string) []image {
    25  		v := url.Values{}
    26  		v.Set("filter", filter)
    27  		status, b, err := sockRequest("GET", "/images/json?"+v.Encode(), nil)
    28  		c.Assert(status, check.Equals, http.StatusOK)
    29  		c.Assert(err, check.IsNil)
    30  
    31  		var images []image
    32  		if err := json.Unmarshal(b, &images); err != nil {
    33  			c.Fatal(err)
    34  		}
    35  
    36  		return images
    37  	}
    38  
    39  	errMsg := "incorrect number of matches returned"
    40  	if images := getImages("utest*/*"); len(images[0].RepoTags) != 2 {
    41  		c.Fatal(errMsg)
    42  	}
    43  	if images := getImages("utest"); len(images[0].RepoTags) != 1 {
    44  		c.Fatal(errMsg)
    45  	}
    46  	if images := getImages("utest*"); len(images[0].RepoTags) != 1 {
    47  		c.Fatal(errMsg)
    48  	}
    49  	if images := getImages("*5000*/*"); len(images[0].RepoTags) != 1 {
    50  		c.Fatal(errMsg)
    51  	}
    52  }
    53  
    54  func (s *DockerSuite) TestApiImagesSaveAndLoad(c *check.C) {
    55  	testRequires(c, Network)
    56  	out, err := buildImage("saveandload", "FROM hello-world\nENV FOO bar", false)
    57  	if err != nil {
    58  		c.Fatal(err)
    59  	}
    60  	id := strings.TrimSpace(out)
    61  
    62  	res, body, err := sockRequestRaw("GET", "/images/"+id+"/get", nil, "")
    63  	c.Assert(err, check.IsNil)
    64  	c.Assert(res.StatusCode, check.Equals, http.StatusOK)
    65  
    66  	defer body.Close()
    67  
    68  	if out, err := exec.Command(dockerBinary, "rmi", id).CombinedOutput(); err != nil {
    69  		c.Fatal(err, out)
    70  	}
    71  
    72  	res, loadBody, err := sockRequestRaw("POST", "/images/load", body, "application/x-tar")
    73  	c.Assert(err, check.IsNil)
    74  	c.Assert(res.StatusCode, check.Equals, http.StatusOK)
    75  
    76  	defer loadBody.Close()
    77  
    78  	inspectOut, err := exec.Command(dockerBinary, "inspect", "--format='{{ .Id }}'", id).CombinedOutput()
    79  	if err != nil {
    80  		c.Fatal(err, inspectOut)
    81  	}
    82  	if strings.TrimSpace(string(inspectOut)) != id {
    83  		c.Fatal("load did not work properly")
    84  	}
    85  }
    86  
    87  func (s *DockerSuite) TestApiImagesDelete(c *check.C) {
    88  	testRequires(c, Network)
    89  	name := "test-api-images-delete"
    90  	out, err := buildImage(name, "FROM hello-world\nENV FOO bar", false)
    91  	if err != nil {
    92  		c.Fatal(err)
    93  	}
    94  	defer deleteImages(name)
    95  	id := strings.TrimSpace(out)
    96  
    97  	if out, err := exec.Command(dockerBinary, "tag", name, "test:tag1").CombinedOutput(); err != nil {
    98  		c.Fatal(err, out)
    99  	}
   100  
   101  	status, _, err := sockRequest("DELETE", "/images/"+id, nil)
   102  	c.Assert(status, check.Equals, http.StatusConflict)
   103  	c.Assert(err, check.IsNil)
   104  
   105  	status, _, err = sockRequest("DELETE", "/images/test:noexist", nil)
   106  	c.Assert(status, check.Equals, http.StatusNotFound) //Status Codes:404 – no such image
   107  	c.Assert(err, check.IsNil)
   108  
   109  	status, _, err = sockRequest("DELETE", "/images/test:tag1", nil)
   110  	c.Assert(status, check.Equals, http.StatusOK)
   111  	c.Assert(err, check.IsNil)
   112  }
   113  
   114  func (s *DockerSuite) TestApiImagesHistory(c *check.C) {
   115  	testRequires(c, Network)
   116  	name := "test-api-images-history"
   117  	out, err := buildImage(name, "FROM hello-world\nENV FOO bar", false)
   118  	c.Assert(err, check.IsNil)
   119  
   120  	defer deleteImages(name)
   121  	id := strings.TrimSpace(out)
   122  
   123  	status, body, err := sockRequest("GET", "/images/"+id+"/history", nil)
   124  	c.Assert(err, check.IsNil)
   125  	c.Assert(status, check.Equals, http.StatusOK)
   126  
   127  	var historydata []types.ImageHistory
   128  	if err = json.Unmarshal(body, &historydata); err != nil {
   129  		c.Fatalf("Error on unmarshal: %s", err)
   130  	}
   131  
   132  	c.Assert(len(historydata), check.Not(check.Equals), 0)
   133  	c.Assert(historydata[0].Tags[0], check.Equals, "test-api-images-history:latest")
   134  }