github.com/containerd/nerdctl@v1.7.7/cmd/nerdctl/image_list_test.go (about) 1 /* 2 Copyright The containerd Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package main 18 19 import ( 20 "fmt" 21 "os" 22 "strings" 23 "testing" 24 25 "github.com/containerd/nerdctl/pkg/tabutil" 26 "github.com/containerd/nerdctl/pkg/testutil" 27 "gotest.tools/v3/assert" 28 ) 29 30 func TestImagesWithNames(t *testing.T) { 31 t.Parallel() 32 testutil.DockerIncompatible(t) 33 base := testutil.NewBase(t) 34 35 base.Cmd("pull", testutil.CommonImage).AssertOK() 36 base.Cmd("images", "--names", testutil.CommonImage).AssertOutContains(testutil.CommonImage) 37 base.Cmd("images", "--names", testutil.CommonImage).AssertOutWithFunc(func(out string) error { 38 lines := strings.Split(strings.TrimSpace(out), "\n") 39 if len(lines) < 2 { 40 return fmt.Errorf("expected at least 2 lines, got %d", len(lines)) 41 } 42 tab := tabutil.NewReader("NAME\tIMAGE ID\tCREATED\tPLATFORM\tSIZE\tBLOB SIZE") 43 err := tab.ParseHeader(lines[0]) 44 if err != nil { 45 return fmt.Errorf("failed to parse header: %v", err) 46 } 47 name, _ := tab.ReadRow(lines[1], "NAME") 48 assert.Equal(t, name, testutil.CommonImage) 49 return nil 50 }) 51 } 52 53 func TestImages(t *testing.T) { 54 t.Parallel() 55 base := testutil.NewBase(t) 56 header := "REPOSITORY\tTAG\tIMAGE ID\tCREATED\tPLATFORM\tSIZE\tBLOB SIZE" 57 if base.Target == testutil.Docker { 58 header = "REPOSITORY\tTAG\tIMAGE ID\tCREATED\tSIZE" 59 } 60 61 base.Cmd("pull", testutil.CommonImage).AssertOK() 62 base.Cmd("images", testutil.CommonImage).AssertOutWithFunc(func(out string) error { 63 lines := strings.Split(strings.TrimSpace(out), "\n") 64 if len(lines) < 2 { 65 return fmt.Errorf("expected at least 2 lines, got %d", len(lines)) 66 } 67 tab := tabutil.NewReader(header) 68 err := tab.ParseHeader(lines[0]) 69 if err != nil { 70 return fmt.Errorf("failed to parse header: %v", err) 71 } 72 repo, _ := tab.ReadRow(lines[1], "REPOSITORY") 73 tag, _ := tab.ReadRow(lines[1], "TAG") 74 assert.Equal(t, repo+":"+tag, testutil.CommonImage) 75 return nil 76 }) 77 } 78 79 func TestImagesFilter(t *testing.T) { 80 testutil.RequiresBuild(t) 81 t.Parallel() 82 base := testutil.NewBase(t) 83 tempName := testutil.Identifier(base.T) 84 base.Cmd("pull", testutil.CommonImage).AssertOK() 85 86 dockerfile := fmt.Sprintf(`FROM %s 87 CMD ["echo", "nerdctl-build-test-string"] \n 88 LABEL foo=bar 89 LABEL version=0.1`, testutil.CommonImage) 90 91 buildCtx, err := createBuildContext(dockerfile) 92 assert.NilError(t, err) 93 defer os.RemoveAll(buildCtx) 94 base.Cmd("build", "-t", tempName, "-f", buildCtx+"/Dockerfile", buildCtx).AssertOK() 95 defer base.Cmd("rmi", tempName).AssertOK() 96 97 busyboxGlibc, busyboxUclibc := "busybox:glibc", "busybox:uclibc" 98 base.Cmd("pull", busyboxGlibc).AssertOK() 99 defer base.Cmd("rmi", busyboxGlibc).AssertOK() 100 101 base.Cmd("pull", busyboxUclibc).AssertOK() 102 defer base.Cmd("rmi", busyboxUclibc).AssertOK() 103 104 // before/since filters are not compatible with DOCKER_BUILDKIT=1? (but still compatible with DOCKER_BUILDKIT=0) 105 if base.Target == testutil.Nerdctl { 106 base.Cmd("images", "--filter", fmt.Sprintf("before=%s:%s", tempName, "latest")).AssertOutContains(testutil.ImageRepo(testutil.CommonImage)) 107 base.Cmd("images", "--filter", fmt.Sprintf("before=%s:%s", tempName, "latest")).AssertOutNotContains(tempName) 108 base.Cmd("images", "--filter", fmt.Sprintf("since=%s", testutil.CommonImage)).AssertOutContains(tempName) 109 base.Cmd("images", "--filter", fmt.Sprintf("since=%s", testutil.CommonImage)).AssertOutNotContains(testutil.ImageRepo(testutil.CommonImage)) 110 base.Cmd("images", "--filter", fmt.Sprintf("since=%s", testutil.CommonImage), testutil.CommonImage).AssertOutNotContains(testutil.ImageRepo(testutil.CommonImage)) 111 base.Cmd("images", "--filter", fmt.Sprintf("since=%s", testutil.CommonImage), testutil.CommonImage).AssertOutNotContains(tempName) 112 } 113 base.Cmd("images", "--filter", "label=foo=bar").AssertOutContains(tempName) 114 base.Cmd("images", "--filter", "label=foo=bar1").AssertOutNotContains(tempName) 115 base.Cmd("images", "--filter", "label=foo=bar", "--filter", "label=version=0.1").AssertOutContains(tempName) 116 base.Cmd("images", "--filter", "label=foo=bar", "--filter", "label=version=0.2").AssertOutNotContains(tempName) 117 base.Cmd("images", "--filter", "label=version").AssertOutContains(tempName) 118 base.Cmd("images", "--filter", fmt.Sprintf("reference=%s*", tempName)).AssertOutContains(tempName) 119 base.Cmd("images", "--filter", "reference=busy*:*libc*").AssertOutContains("glibc") 120 base.Cmd("images", "--filter", "reference=busy*:*libc*").AssertOutContains("uclibc") 121 } 122 123 func TestImagesFilterDangling(t *testing.T) { 124 testutil.RequiresBuild(t) 125 base := testutil.NewBase(t) 126 base.Cmd("images", "prune", "--all").AssertOK() 127 128 dockerfile := fmt.Sprintf(`FROM %s 129 CMD ["echo", "nerdctl-build-notag-string"] 130 `, testutil.CommonImage) 131 buildCtx, err := createBuildContext(dockerfile) 132 assert.NilError(t, err) 133 134 defer os.RemoveAll(buildCtx) 135 base.Cmd("build", "-f", buildCtx+"/Dockerfile", buildCtx).AssertOK() 136 137 // dangling image test 138 base.Cmd("images", "--filter", "dangling=true").AssertOutContains("<none>") 139 base.Cmd("images", "--filter", "dangling=false").AssertOutNotContains("<none>") 140 }