572 lines
12 KiB
Go
572 lines
12 KiB
Go
package storage
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/containers/storage/pkg/idtools"
|
|
"github.com/containers/storage/pkg/reexec"
|
|
digest "github.com/opencontainers/go-digest"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func newTestStore(t *testing.T, testOptions StoreOptions) Store {
|
|
wd := t.TempDir()
|
|
|
|
options := testOptions
|
|
if testOptions.RunRoot == "" {
|
|
options.RunRoot = filepath.Join(wd, "run")
|
|
}
|
|
if testOptions.GraphRoot == "" {
|
|
options.GraphRoot = filepath.Join(wd, "root")
|
|
}
|
|
if testOptions.GraphDriverName == "" {
|
|
options.GraphDriverName = "vfs"
|
|
}
|
|
if testOptions.GraphDriverOptions == nil {
|
|
options.GraphDriverOptions = []string{}
|
|
}
|
|
if len(testOptions.UIDMap) == 0 {
|
|
options.UIDMap = []idtools.IDMap{{
|
|
ContainerID: 0,
|
|
HostID: os.Getuid(),
|
|
Size: 1,
|
|
}}
|
|
}
|
|
if len(testOptions.GIDMap) == 0 {
|
|
options.GIDMap = []idtools.IDMap{{
|
|
ContainerID: 0,
|
|
HostID: os.Getgid(),
|
|
Size: 1,
|
|
}}
|
|
}
|
|
|
|
store, err := GetStore(options)
|
|
require.NoError(t, err)
|
|
return store
|
|
}
|
|
|
|
func TestStore(t *testing.T) {
|
|
pullOpts := map[string]string{"Test1": "test1", "Test2": "test2"}
|
|
store := newTestStore(t, StoreOptions{
|
|
PullOptions: pullOpts,
|
|
})
|
|
|
|
root := store.RunRoot()
|
|
require.NotNil(t, root)
|
|
|
|
root = store.GraphRoot()
|
|
require.NotNil(t, root)
|
|
|
|
root = store.GraphDriverName()
|
|
require.NotNil(t, root)
|
|
|
|
gopts := store.GraphOptions()
|
|
assert.Equal(t, []string{}, gopts)
|
|
|
|
store.UIDMap()
|
|
store.GIDMap()
|
|
|
|
opts := store.PullOptions()
|
|
assert.Equal(t, pullOpts, opts)
|
|
|
|
_, err := store.GraphDriver()
|
|
require.Nil(t, err)
|
|
|
|
_, err = store.CreateLayer("foo", "bar", nil, "", false, nil)
|
|
require.Error(t, err)
|
|
|
|
_, _, err = store.PutLayer("foo", "bar", nil, "", true, nil, nil)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.CreateImage("foo", nil, "bar", "", nil)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.CreateContainer("foo", nil, "bar", "layer", "", nil)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Metadata("foobar")
|
|
require.Error(t, err)
|
|
|
|
err = store.SetMetadata("foo", "bar")
|
|
require.Error(t, err)
|
|
|
|
exists := store.Exists("foobar")
|
|
require.False(t, exists)
|
|
|
|
_, err = store.Status()
|
|
require.Nil(t, err)
|
|
|
|
err = store.Delete("foobar")
|
|
require.Error(t, err)
|
|
|
|
err = store.DeleteLayer("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.DeleteImage("foobar", true)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.DeleteImage("foobar", false)
|
|
require.Error(t, err)
|
|
|
|
err = store.DeleteContainer("foobar")
|
|
require.Error(t, err)
|
|
|
|
err = store.DeleteContainer("foobar")
|
|
require.Error(t, err)
|
|
|
|
err = store.Wipe()
|
|
require.Nil(t, err)
|
|
|
|
_, err = store.Mount("foobar", "")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Unmount("foobar", true)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Unmount("foobar", false)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Mounted("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Changes("foobar", "foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.DiffSize("foobar", "foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Diff("foobar", "foobar", nil)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ApplyDiff("foobar", nil)
|
|
require.Error(t, err)
|
|
|
|
var d digest.Digest
|
|
_, err = store.LayersByCompressedDigest(d)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.LayersByUncompressedDigest(d)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.LayerSize("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, _, err = store.LayerParentOwners("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Layers()
|
|
require.Nil(t, err)
|
|
|
|
_, err = store.Images()
|
|
require.Nil(t, err)
|
|
|
|
_, err = store.Containers()
|
|
require.Nil(t, err)
|
|
|
|
_, err = store.Names("foobar")
|
|
require.Error(t, err)
|
|
|
|
err = store.SetNames("foobar", nil)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ListImageBigData("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ImageBigData("foo", "bar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ImageBigDataSize("foo", "bar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ImageBigDataDigest("foo", "bar")
|
|
require.Error(t, err)
|
|
|
|
err = store.SetImageBigData("foo", "bar", nil, nil)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ImageSize("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ListContainerBigData("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ContainerBigData("foo", "bar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ContainerBigDataSize("foo", "bar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ContainerBigDataDigest("foo", "bar")
|
|
require.Error(t, err)
|
|
|
|
err = store.SetContainerBigData("foo", "bar", nil)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ContainerSize("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Layer("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Image("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ImagesByTopLayer("foobar")
|
|
require.Error(t, err)
|
|
|
|
images, err := store.ImagesByDigest("foobar")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, len(images), 0)
|
|
|
|
_, err = store.Container("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ContainerByLayer("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ContainerDirectory("foobar")
|
|
require.Error(t, err)
|
|
|
|
err = store.SetContainerDirectoryFile("foo", "bar", nil)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.FromContainerDirectory("foo", "bar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ContainerRunDirectory("foobar")
|
|
require.Error(t, err)
|
|
|
|
err = store.SetContainerRunDirectoryFile("foo", "bar", nil)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.FromContainerRunDirectory("foo", "bar")
|
|
require.Error(t, err)
|
|
|
|
_, _, err = store.ContainerParentOwners("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Lookup("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Shutdown(false)
|
|
require.Nil(t, err)
|
|
|
|
_, err = store.Shutdown(true)
|
|
require.Nil(t, err)
|
|
|
|
_, err = store.Version()
|
|
require.Nil(t, err)
|
|
|
|
// GetDigestLock returns digest-specific Locker.
|
|
_, err = store.GetDigestLock(d)
|
|
require.Error(t, err)
|
|
|
|
store.Free()
|
|
store.Free()
|
|
}
|
|
|
|
func TestWithSplitStore(t *testing.T) {
|
|
wd := t.TempDir()
|
|
|
|
pullOpts := map[string]string{"Test1": "test1", "Test2": "test2"}
|
|
store := newTestStore(t, StoreOptions{
|
|
ImageStore: filepath.Join(wd, "imgstore"),
|
|
PullOptions: pullOpts,
|
|
})
|
|
|
|
root := store.RunRoot()
|
|
require.NotNil(t, root)
|
|
|
|
root = store.GraphRoot()
|
|
require.NotNil(t, root)
|
|
|
|
root = store.GraphDriverName()
|
|
require.NotNil(t, root)
|
|
|
|
gopts := store.GraphOptions()
|
|
assert.Equal(t, []string{}, gopts)
|
|
|
|
store.UIDMap()
|
|
store.GIDMap()
|
|
|
|
opts := store.PullOptions()
|
|
assert.Equal(t, pullOpts, opts)
|
|
|
|
_, err := store.GraphDriver()
|
|
require.Nil(t, err)
|
|
|
|
_, err = store.CreateLayer("foo", "bar", nil, "", false, nil)
|
|
require.Error(t, err)
|
|
|
|
_, _, err = store.PutLayer("foo", "bar", nil, "", true, nil, nil)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.CreateImage("foo", nil, "bar", "", nil)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.CreateContainer("foo", nil, "bar", "layer", "", nil)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Metadata("foobar")
|
|
require.Error(t, err)
|
|
|
|
err = store.SetMetadata("foo", "bar")
|
|
require.Error(t, err)
|
|
|
|
exists := store.Exists("foobar")
|
|
require.False(t, exists)
|
|
|
|
_, err = store.Status()
|
|
require.Nil(t, err)
|
|
|
|
err = store.Delete("foobar")
|
|
require.Error(t, err)
|
|
|
|
err = store.DeleteLayer("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.DeleteImage("foobar", true)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.DeleteImage("foobar", false)
|
|
require.Error(t, err)
|
|
|
|
err = store.DeleteContainer("foobar")
|
|
require.Error(t, err)
|
|
|
|
err = store.DeleteContainer("foobar")
|
|
require.Error(t, err)
|
|
|
|
err = store.Wipe()
|
|
require.Nil(t, err)
|
|
|
|
_, err = store.Mount("foobar", "")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Unmount("foobar", true)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Unmount("foobar", false)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Mounted("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Changes("foobar", "foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.DiffSize("foobar", "foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Diff("foobar", "foobar", nil)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ApplyDiff("foobar", nil)
|
|
require.Error(t, err)
|
|
|
|
var d digest.Digest
|
|
_, err = store.LayersByCompressedDigest(d)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.LayersByUncompressedDigest(d)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.LayerSize("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, _, err = store.LayerParentOwners("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Layers()
|
|
require.Nil(t, err)
|
|
|
|
_, err = store.Images()
|
|
require.Nil(t, err)
|
|
|
|
_, err = store.Containers()
|
|
require.Nil(t, err)
|
|
|
|
_, err = store.Names("foobar")
|
|
require.Error(t, err)
|
|
|
|
err = store.SetNames("foobar", nil)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ListImageBigData("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ImageBigData("foo", "bar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ImageBigDataSize("foo", "bar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ImageBigDataDigest("foo", "bar")
|
|
require.Error(t, err)
|
|
|
|
err = store.SetImageBigData("foo", "bar", nil, nil)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ImageSize("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ListContainerBigData("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ContainerBigData("foo", "bar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ContainerBigDataSize("foo", "bar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ContainerBigDataDigest("foo", "bar")
|
|
require.Error(t, err)
|
|
|
|
err = store.SetContainerBigData("foo", "bar", nil)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ContainerSize("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Layer("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Image("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ImagesByTopLayer("foobar")
|
|
require.Error(t, err)
|
|
|
|
images, err := store.ImagesByDigest("foobar")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, len(images), 0)
|
|
|
|
_, err = store.Container("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ContainerByLayer("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ContainerDirectory("foobar")
|
|
require.Error(t, err)
|
|
|
|
err = store.SetContainerDirectoryFile("foo", "bar", nil)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.FromContainerDirectory("foo", "bar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.ContainerRunDirectory("foobar")
|
|
require.Error(t, err)
|
|
|
|
err = store.SetContainerRunDirectoryFile("foo", "bar", nil)
|
|
require.Error(t, err)
|
|
|
|
_, err = store.FromContainerRunDirectory("foo", "bar")
|
|
require.Error(t, err)
|
|
|
|
_, _, err = store.ContainerParentOwners("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Lookup("foobar")
|
|
require.Error(t, err)
|
|
|
|
_, err = store.Shutdown(false)
|
|
require.Nil(t, err)
|
|
|
|
_, err = store.Shutdown(true)
|
|
require.Nil(t, err)
|
|
|
|
_, err = store.Version()
|
|
require.Nil(t, err)
|
|
|
|
// GetDigestLock returns digest-specific Locker.
|
|
_, err = store.GetDigestLock(d)
|
|
require.Error(t, err)
|
|
|
|
store.Free()
|
|
store.Free()
|
|
}
|
|
|
|
func TestStoreMultiList(t *testing.T) {
|
|
reexec.Init()
|
|
|
|
store := newTestStore(t, StoreOptions{})
|
|
|
|
_, err := store.CreateLayer("Layer", "", nil, "", false, nil)
|
|
require.NoError(t, err)
|
|
|
|
_, err = store.CreateImage("Image", nil, "Layer", "", nil)
|
|
require.NoError(t, err)
|
|
|
|
_, err = store.CreateContainer("Container", nil, "Image", "", "", nil)
|
|
require.NoError(t, err)
|
|
|
|
tests := []struct {
|
|
options MultiListOptions
|
|
layerCounts int
|
|
imageCounts int
|
|
containerCounts int
|
|
}{
|
|
{
|
|
options: MultiListOptions{
|
|
Layers: true,
|
|
Images: true,
|
|
Containers: true,
|
|
},
|
|
layerCounts: 3,
|
|
imageCounts: 1,
|
|
containerCounts: 1,
|
|
},
|
|
|
|
{
|
|
options: MultiListOptions{
|
|
Layers: true,
|
|
Images: false,
|
|
Containers: false,
|
|
},
|
|
layerCounts: 3,
|
|
imageCounts: 0,
|
|
containerCounts: 0,
|
|
},
|
|
|
|
{
|
|
options: MultiListOptions{
|
|
Layers: false,
|
|
Images: true,
|
|
Containers: false,
|
|
},
|
|
layerCounts: 0,
|
|
imageCounts: 1,
|
|
containerCounts: 0,
|
|
},
|
|
|
|
{
|
|
options: MultiListOptions{
|
|
Layers: false,
|
|
Images: false,
|
|
Containers: true,
|
|
},
|
|
layerCounts: 0,
|
|
imageCounts: 0,
|
|
containerCounts: 1,
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
listResults, err := store.MultiList(test.options)
|
|
require.NoError(t, err)
|
|
require.Len(t, listResults.Layers, test.layerCounts)
|
|
require.Len(t, listResults.Images, test.imageCounts)
|
|
require.Len(t, listResults.Containers, test.containerCounts)
|
|
}
|
|
|
|
_, err = store.Shutdown(true)
|
|
require.Nil(t, err)
|
|
|
|
store.Free()
|
|
}
|