|
@@ -0,0 +1,115 @@
|
|
|
+package volume
|
|
|
+
|
|
|
+import (
|
|
|
+ "context"
|
|
|
+ "fmt"
|
|
|
+ "strings"
|
|
|
+ "testing"
|
|
|
+ "time"
|
|
|
+
|
|
|
+ "github.com/docker/docker/api/types"
|
|
|
+ "github.com/docker/docker/api/types/filters"
|
|
|
+ volumetypes "github.com/docker/docker/api/types/volume"
|
|
|
+ "github.com/docker/docker/integration/internal/container"
|
|
|
+ "github.com/docker/docker/integration/internal/request"
|
|
|
+ "github.com/docker/docker/internal/testutil"
|
|
|
+ "github.com/stretchr/testify/assert"
|
|
|
+ "github.com/stretchr/testify/require"
|
|
|
+)
|
|
|
+
|
|
|
+func TestVolumesCreateAndList(t *testing.T) {
|
|
|
+ defer setupTest(t)()
|
|
|
+ client := request.NewAPIClient(t)
|
|
|
+ ctx := context.Background()
|
|
|
+
|
|
|
+ name := t.Name()
|
|
|
+ vol, err := client.VolumeCreate(ctx, volumetypes.VolumesCreateBody{
|
|
|
+ Name: name,
|
|
|
+ })
|
|
|
+ require.NoError(t, err)
|
|
|
+
|
|
|
+ expected := types.Volume{
|
|
|
+ // Ignore timestamp of CreatedAt
|
|
|
+ CreatedAt: vol.CreatedAt,
|
|
|
+ Driver: "local",
|
|
|
+ Scope: "local",
|
|
|
+ Name: name,
|
|
|
+ Options: map[string]string{},
|
|
|
+ Mountpoint: fmt.Sprintf("%s/volumes/%s/_data", testEnv.DaemonInfo.DockerRootDir, name),
|
|
|
+ }
|
|
|
+ assert.Equal(t, vol, expected)
|
|
|
+
|
|
|
+ volumes, err := client.VolumeList(ctx, filters.Args{})
|
|
|
+ require.NoError(t, err)
|
|
|
+
|
|
|
+ assert.Equal(t, len(volumes.Volumes), 1)
|
|
|
+ assert.NotNil(t, volumes.Volumes[0])
|
|
|
+ assert.Equal(t, *volumes.Volumes[0], expected)
|
|
|
+}
|
|
|
+
|
|
|
+func TestVolumesRemove(t *testing.T) {
|
|
|
+ defer setupTest(t)()
|
|
|
+ client := request.NewAPIClient(t)
|
|
|
+ ctx := context.Background()
|
|
|
+
|
|
|
+ prefix, _ := getPrefixAndSlashFromDaemonPlatform()
|
|
|
+
|
|
|
+ id := container.Create(t, ctx, client, container.WithVolume(prefix+"foo"))
|
|
|
+
|
|
|
+ c, err := client.ContainerInspect(ctx, id)
|
|
|
+ require.NoError(t, err)
|
|
|
+ vname := c.Mounts[0].Name
|
|
|
+
|
|
|
+ err = client.VolumeRemove(ctx, vname, false)
|
|
|
+ testutil.ErrorContains(t, err, "volume is in use")
|
|
|
+
|
|
|
+ err = client.ContainerRemove(ctx, id, types.ContainerRemoveOptions{
|
|
|
+ Force: true,
|
|
|
+ })
|
|
|
+ require.NoError(t, err)
|
|
|
+
|
|
|
+ err = client.VolumeRemove(ctx, vname, false)
|
|
|
+ require.NoError(t, err)
|
|
|
+}
|
|
|
+
|
|
|
+func TestVolumesInspect(t *testing.T) {
|
|
|
+ defer setupTest(t)()
|
|
|
+ client := request.NewAPIClient(t)
|
|
|
+ ctx := context.Background()
|
|
|
+
|
|
|
+ // sampling current time minus a minute so to now have false positive in case of delays
|
|
|
+ now := time.Now().Truncate(time.Minute)
|
|
|
+
|
|
|
+ name := t.Name()
|
|
|
+ _, err := client.VolumeCreate(ctx, volumetypes.VolumesCreateBody{
|
|
|
+ Name: name,
|
|
|
+ })
|
|
|
+ require.NoError(t, err)
|
|
|
+
|
|
|
+ vol, err := client.VolumeInspect(ctx, name)
|
|
|
+ require.NoError(t, err)
|
|
|
+
|
|
|
+ expected := types.Volume{
|
|
|
+ // Ignore timestamp of CreatedAt
|
|
|
+ CreatedAt: vol.CreatedAt,
|
|
|
+ Driver: "local",
|
|
|
+ Scope: "local",
|
|
|
+ Name: name,
|
|
|
+ Options: map[string]string{},
|
|
|
+ Mountpoint: fmt.Sprintf("%s/volumes/%s/_data", testEnv.DaemonInfo.DockerRootDir, name),
|
|
|
+ }
|
|
|
+ assert.Equal(t, vol, expected)
|
|
|
+
|
|
|
+ // comparing CreatedAt field time for the new volume to now. Removing a minute from both to avoid false positive
|
|
|
+ testCreatedAt, err := time.Parse(time.RFC3339, strings.TrimSpace(vol.CreatedAt))
|
|
|
+ require.NoError(t, err)
|
|
|
+ testCreatedAt = testCreatedAt.Truncate(time.Minute)
|
|
|
+ assert.Equal(t, testCreatedAt.Equal(now), true, "Time Volume is CreatedAt not equal to current time")
|
|
|
+}
|
|
|
+
|
|
|
+func getPrefixAndSlashFromDaemonPlatform() (prefix, slash string) {
|
|
|
+ if testEnv.OSType == "windows" {
|
|
|
+ return "c:", `\`
|
|
|
+ }
|
|
|
+ return "", "/"
|
|
|
+}
|