automation-tests/common/libimage/load_test.go

156 lines
5.9 KiB
Go

//go:build !remote
package libimage
import (
"context"
"os"
"testing"
"github.com/containers/image/v5/transports/alltransports"
"github.com/stretchr/testify/require"
)
func TestLoadByPath(t *testing.T) {
// Make sure that loading images does not leave any artifacts in TMPDIR
// behind (containers/podman/issues/14287).
tmpdir := t.TempDir()
t.Setenv("TMPDIR", tmpdir)
defer func() {
dir, err := os.ReadDir(tmpdir)
require.NoError(t, err)
require.Len(t, dir, 0)
}()
runtime := testNewRuntime(t)
ctx := context.Background()
loadOptions := &LoadOptions{}
loadOptions.Writer = os.Stdout
for _, test := range []struct {
input string
expectError bool
numImages int
names []string
}{
// DOCKER ARCHIVE
{"testdata/docker-name-only.tar.xz", false, 1, []string{"localhost/pretty-empty:latest"}},
{"testdata/docker-registry-name.tar.xz", false, 1, []string{"example.com/empty:latest"}},
{"testdata/docker-two-names.tar.xz", false, 1, []string{"localhost/pretty-empty:latest", "example.com/empty:latest"}},
{"testdata/docker-two-images.tar.xz", false, 2, []string{"example.com/empty:latest", "example.com/empty/but:different"}},
{"testdata/docker-unnamed.tar.xz", false, 1, []string{"sha256:ec9293436c2e66da44edb9efb8d41f6b13baf62283ebe846468bc992d76d7951"}},
{"testdata/buildkit-docker.tar", false, 1, []string{"github.com/buildkit/archive:docker"}},
// OCI ARCHIVE
{"testdata/oci-name-only.tar.gz", false, 1, []string{"localhost/pretty-empty:latest"}},
{"testdata/oci-non-docker-name.tar.gz", true, 0, nil},
{"testdata/oci-registry-name.tar.gz", false, 1, []string{"example.com/empty:latest"}},
{"testdata/oci-unnamed.tar.gz", false, 1, []string{"sha256:5c8aca8137ac47e84c69ae93ce650ce967917cc001ba7aad5494073fac75b8b6"}},
{"testdata/buildkit-oci.tar", false, 1, []string{"github.com/buildkit/archive:oci"}},
} {
loadedImages, err := runtime.Load(ctx, test.input, loadOptions)
if test.expectError {
require.Error(t, err, test.input)
continue
}
require.NoError(t, err, test.input)
require.Equal(t, test.names, loadedImages, test.input)
// Make sure that all returned names exist as images in the
// local containers storage.
ids := []string{} // later used for image removal
names := [][]string{}
for _, name := range loadedImages {
image, resolvedName, err := runtime.LookupImage(name, nil)
require.NoError(t, err, test.input)
require.Equal(t, name, resolvedName, test.input)
ids = append(ids, image.ID())
names = append(names, image.Names())
}
// Now remove the image.
rmReports, rmErrors := runtime.RemoveImages(ctx, ids, &RemoveImagesOptions{Force: true})
require.Len(t, rmErrors, 0)
require.Len(t, rmReports, test.numImages)
// Now inspect the removal reports.
for i, report := range rmReports {
require.Equal(t, ids[i], report.ID, test.input)
require.Equal(t, names[i], report.Untagged, test.input)
}
}
}
func TestLoadReference(t *testing.T) {
// Make sure that loading images does not leave any artifacts in TMPDIR
// behind (containers/podman/issues/14287).
tmpdir := t.TempDir()
t.Setenv("TMPDIR", tmpdir)
runtime := testNewRuntime(t)
ctx := context.Background()
loadOptions := &LoadOptions{}
loadOptions.Writer = os.Stdout
for _, test := range []struct {
input string
expectError bool
numImages int
names []string
}{
// DOCKER ARCHIVE
{"docker-archive:testdata/docker-name-only.tar.xz", false, 1, []string{"localhost/pretty-empty:latest"}},
{"docker-archive:testdata/docker-registry-name.tar.xz", false, 1, []string{"example.com/empty:latest"}},
{"docker-archive:testdata/docker-two-names.tar.xz", false, 1, []string{"localhost/pretty-empty:latest", "example.com/empty:latest"}},
{"docker-archive:testdata/docker-two-images.tar.xz", false, 2, []string{"example.com/empty:latest", "example.com/empty/but:different"}},
{"docker-archive:testdata/docker-unnamed.tar.xz", false, 1, []string{"sha256:ec9293436c2e66da44edb9efb8d41f6b13baf62283ebe846468bc992d76d7951"}},
{"docker-archive:testdata/buildkit-docker.tar", false, 1, []string{"github.com/buildkit/archive:docker"}},
// OCI ARCHIVE
{"oci-archive:testdata/oci-name-only.tar.gz", false, 1, []string{"localhost/pretty-empty:latest"}},
{"oci-archive:testdata/oci-non-docker-name.tar.gz", true, 0, nil},
{"oci-archive:testdata/oci-registry-name.tar.gz", false, 1, []string{"example.com/empty:latest"}},
{"oci-archive:testdata/oci-unnamed.tar.gz", false, 1, []string{"sha256:5c8aca8137ac47e84c69ae93ce650ce967917cc001ba7aad5494073fac75b8b6"}},
{"oci-archive:testdata/buildkit-oci.tar", false, 1, []string{"github.com/buildkit/archive:oci"}},
{"docker://quay.io/libpod/alpine_nginx", false, 1, []string{"quay.io/libpod/alpine_nginx:latest"}},
} {
ref, err := alltransports.ParseImageName(test.input)
require.NoError(t, err, test.input)
loadedImages, err := runtime.LoadReference(ctx, ref, loadOptions)
if test.expectError {
require.Error(t, err, test.input)
continue
}
require.NoError(t, err, test.input)
require.Equal(t, test.names, loadedImages, test.input)
// Make sure that all returned names exist as images in the
// local containers storage.
ids := []string{} // later used for image removal
names := [][]string{}
for _, name := range loadedImages {
image, resolvedName, err := runtime.LookupImage(name, nil)
require.NoError(t, err, test.input)
require.Equal(t, name, resolvedName, test.input)
ids = append(ids, image.ID())
names = append(names, image.Names())
}
// Now remove the image.
rmReports, rmErrors := runtime.RemoveImages(ctx, ids, &RemoveImagesOptions{Force: true})
require.Len(t, rmErrors, 0)
require.Len(t, rmReports, test.numImages)
// Now inspect the removal reports.
for i, report := range rmReports {
require.Equal(t, ids[i], report.ID, test.input)
require.Equal(t, names[i], report.Untagged, test.input)
}
}
dir, err := os.ReadDir(tmpdir)
require.NoError(t, err)
require.Len(t, dir, 0)
}