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  }