156 lines
5.9 KiB
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)
|
|
}
|