github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/engine/volume/service/service_test.go (about)

     1  package service
     2  
     3  import (
     4  	"context"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/docker/docker/api/types/filters"
     9  	"github.com/docker/docker/errdefs"
    10  	"github.com/docker/docker/volume"
    11  	volumedrivers "github.com/docker/docker/volume/drivers"
    12  	"github.com/docker/docker/volume/service/opts"
    13  	"github.com/docker/docker/volume/testutils"
    14  	"gotest.tools/v3/assert"
    15  	is "gotest.tools/v3/assert/cmp"
    16  )
    17  
    18  func TestServiceCreate(t *testing.T) {
    19  	t.Parallel()
    20  
    21  	ds := volumedrivers.NewStore(nil)
    22  	assert.Assert(t, ds.Register(testutils.NewFakeDriver("d1"), "d1"))
    23  	assert.Assert(t, ds.Register(testutils.NewFakeDriver("d2"), "d2"))
    24  
    25  	ctx := context.Background()
    26  	service, cleanup := newTestService(t, ds)
    27  	defer cleanup()
    28  
    29  	_, err := service.Create(ctx, "v1", "notexist")
    30  	assert.Assert(t, errdefs.IsNotFound(err), err)
    31  
    32  	v, err := service.Create(ctx, "v1", "d1")
    33  	assert.NilError(t, err)
    34  
    35  	vCopy, err := service.Create(ctx, "v1", "d1")
    36  	assert.NilError(t, err)
    37  	assert.Assert(t, is.DeepEqual(v, vCopy))
    38  
    39  	_, err = service.Create(ctx, "v1", "d2")
    40  	assert.Check(t, IsNameConflict(err), err)
    41  	assert.Check(t, errdefs.IsConflict(err), err)
    42  
    43  	assert.Assert(t, service.Remove(ctx, "v1"))
    44  	_, err = service.Create(ctx, "v1", "d2")
    45  	assert.NilError(t, err)
    46  	_, err = service.Create(ctx, "v1", "d2")
    47  	assert.NilError(t, err)
    48  
    49  }
    50  
    51  func TestServiceList(t *testing.T) {
    52  	t.Parallel()
    53  
    54  	ds := volumedrivers.NewStore(nil)
    55  	assert.Assert(t, ds.Register(testutils.NewFakeDriver("d1"), "d1"))
    56  	assert.Assert(t, ds.Register(testutils.NewFakeDriver("d2"), "d2"))
    57  
    58  	service, cleanup := newTestService(t, ds)
    59  	defer cleanup()
    60  
    61  	ctx := context.Background()
    62  
    63  	_, err := service.Create(ctx, "v1", "d1")
    64  	assert.NilError(t, err)
    65  	_, err = service.Create(ctx, "v2", "d1")
    66  	assert.NilError(t, err)
    67  	_, err = service.Create(ctx, "v3", "d2")
    68  	assert.NilError(t, err)
    69  
    70  	ls, _, err := service.List(ctx, filters.NewArgs(filters.Arg("driver", "d1")))
    71  	assert.NilError(t, err)
    72  	assert.Check(t, is.Len(ls, 2))
    73  
    74  	ls, _, err = service.List(ctx, filters.NewArgs(filters.Arg("driver", "d2")))
    75  	assert.NilError(t, err)
    76  	assert.Check(t, is.Len(ls, 1))
    77  
    78  	ls, _, err = service.List(ctx, filters.NewArgs(filters.Arg("driver", "notexist")))
    79  	assert.NilError(t, err)
    80  	assert.Check(t, is.Len(ls, 0))
    81  
    82  	ls, _, err = service.List(ctx, filters.NewArgs(filters.Arg("dangling", "true")))
    83  	assert.NilError(t, err)
    84  	assert.Check(t, is.Len(ls, 3))
    85  	ls, _, err = service.List(ctx, filters.NewArgs(filters.Arg("dangling", "false")))
    86  	assert.NilError(t, err)
    87  	assert.Check(t, is.Len(ls, 0))
    88  
    89  	_, err = service.Get(ctx, "v1", opts.WithGetReference("foo"))
    90  	assert.NilError(t, err)
    91  	ls, _, err = service.List(ctx, filters.NewArgs(filters.Arg("dangling", "true")))
    92  	assert.NilError(t, err)
    93  	assert.Check(t, is.Len(ls, 2))
    94  	ls, _, err = service.List(ctx, filters.NewArgs(filters.Arg("dangling", "false")))
    95  	assert.NilError(t, err)
    96  	assert.Check(t, is.Len(ls, 1))
    97  
    98  	ls, _, err = service.List(ctx, filters.NewArgs(filters.Arg("dangling", "false"), filters.Arg("driver", "d2")))
    99  	assert.NilError(t, err)
   100  	assert.Check(t, is.Len(ls, 0))
   101  	ls, _, err = service.List(ctx, filters.NewArgs(filters.Arg("dangling", "true"), filters.Arg("driver", "d2")))
   102  	assert.NilError(t, err)
   103  	assert.Check(t, is.Len(ls, 1))
   104  }
   105  
   106  func TestServiceRemove(t *testing.T) {
   107  	t.Parallel()
   108  
   109  	ds := volumedrivers.NewStore(nil)
   110  	assert.Assert(t, ds.Register(testutils.NewFakeDriver("d1"), "d1"))
   111  
   112  	service, cleanup := newTestService(t, ds)
   113  	defer cleanup()
   114  	ctx := context.Background()
   115  
   116  	_, err := service.Create(ctx, "test", "d1")
   117  	assert.NilError(t, err)
   118  
   119  	assert.Assert(t, service.Remove(ctx, "test"))
   120  	assert.Assert(t, service.Remove(ctx, "test", opts.WithPurgeOnError(true)))
   121  }
   122  
   123  func TestServiceGet(t *testing.T) {
   124  	t.Parallel()
   125  
   126  	ds := volumedrivers.NewStore(nil)
   127  	assert.Assert(t, ds.Register(testutils.NewFakeDriver("d1"), "d1"))
   128  
   129  	service, cleanup := newTestService(t, ds)
   130  	defer cleanup()
   131  	ctx := context.Background()
   132  
   133  	v, err := service.Get(ctx, "notexist")
   134  	assert.Assert(t, IsNotExist(err))
   135  	assert.Check(t, v == nil)
   136  
   137  	created, err := service.Create(ctx, "test", "d1")
   138  	assert.NilError(t, err)
   139  	assert.Assert(t, created != nil)
   140  
   141  	v, err = service.Get(ctx, "test")
   142  	assert.NilError(t, err)
   143  	assert.Assert(t, is.DeepEqual(created, v))
   144  
   145  	v, err = service.Get(ctx, "test", opts.WithGetResolveStatus)
   146  	assert.NilError(t, err)
   147  	assert.Assert(t, is.Len(v.Status, 1), v.Status)
   148  
   149  	_, err = service.Get(ctx, "test", opts.WithGetDriver("notarealdriver"))
   150  	assert.Assert(t, errdefs.IsConflict(err), err)
   151  	v, err = service.Get(ctx, "test", opts.WithGetDriver("d1"))
   152  	assert.Assert(t, err == nil)
   153  	assert.Assert(t, is.DeepEqual(created, v))
   154  
   155  	assert.Assert(t, ds.Register(testutils.NewFakeDriver("d2"), "d2"))
   156  	_, err = service.Get(ctx, "test", opts.WithGetDriver("d2"))
   157  	assert.Assert(t, errdefs.IsConflict(err), err)
   158  }
   159  
   160  func TestServicePrune(t *testing.T) {
   161  	t.Parallel()
   162  
   163  	ds := volumedrivers.NewStore(nil)
   164  	assert.Assert(t, ds.Register(testutils.NewFakeDriver(volume.DefaultDriverName), volume.DefaultDriverName))
   165  	assert.Assert(t, ds.Register(testutils.NewFakeDriver("other"), "other"))
   166  
   167  	service, cleanup := newTestService(t, ds)
   168  	defer cleanup()
   169  	ctx := context.Background()
   170  
   171  	_, err := service.Create(ctx, "test", volume.DefaultDriverName)
   172  	assert.NilError(t, err)
   173  	_, err = service.Create(ctx, "test2", "other")
   174  	assert.NilError(t, err)
   175  
   176  	pr, err := service.Prune(ctx, filters.NewArgs(filters.Arg("label", "banana")))
   177  	assert.NilError(t, err)
   178  	assert.Assert(t, is.Len(pr.VolumesDeleted, 0))
   179  
   180  	pr, err = service.Prune(ctx, filters.NewArgs())
   181  	assert.NilError(t, err)
   182  	assert.Assert(t, is.Len(pr.VolumesDeleted, 1))
   183  	assert.Assert(t, is.Equal(pr.VolumesDeleted[0], "test"))
   184  
   185  	_, err = service.Get(ctx, "test")
   186  	assert.Assert(t, IsNotExist(err), err)
   187  
   188  	v, err := service.Get(ctx, "test2")
   189  	assert.NilError(t, err)
   190  	assert.Assert(t, is.Equal(v.Driver, "other"))
   191  
   192  	_, err = service.Create(ctx, "test", volume.DefaultDriverName)
   193  	assert.NilError(t, err)
   194  
   195  	pr, err = service.Prune(ctx, filters.NewArgs(filters.Arg("label!", "banana")))
   196  	assert.NilError(t, err)
   197  	assert.Assert(t, is.Len(pr.VolumesDeleted, 1))
   198  	assert.Assert(t, is.Equal(pr.VolumesDeleted[0], "test"))
   199  	v, err = service.Get(ctx, "test2")
   200  	assert.NilError(t, err)
   201  	assert.Assert(t, is.Equal(v.Driver, "other"))
   202  
   203  	_, err = service.Create(ctx, "test", volume.DefaultDriverName, opts.WithCreateLabels(map[string]string{"banana": ""}))
   204  	assert.NilError(t, err)
   205  	pr, err = service.Prune(ctx, filters.NewArgs(filters.Arg("label!", "banana")))
   206  	assert.NilError(t, err)
   207  	assert.Assert(t, is.Len(pr.VolumesDeleted, 0))
   208  
   209  	_, err = service.Create(ctx, "test3", volume.DefaultDriverName, opts.WithCreateLabels(map[string]string{"banana": "split"}))
   210  	assert.NilError(t, err)
   211  	pr, err = service.Prune(ctx, filters.NewArgs(filters.Arg("label!", "banana=split")))
   212  	assert.NilError(t, err)
   213  	assert.Assert(t, is.Len(pr.VolumesDeleted, 1))
   214  	assert.Assert(t, is.Equal(pr.VolumesDeleted[0], "test"))
   215  
   216  	pr, err = service.Prune(ctx, filters.NewArgs(filters.Arg("label", "banana=split")))
   217  	assert.NilError(t, err)
   218  	assert.Assert(t, is.Len(pr.VolumesDeleted, 1))
   219  	assert.Assert(t, is.Equal(pr.VolumesDeleted[0], "test3"))
   220  
   221  	v, err = service.Create(ctx, "test", volume.DefaultDriverName, opts.WithCreateReference(t.Name()))
   222  	assert.NilError(t, err)
   223  
   224  	pr, err = service.Prune(ctx, filters.NewArgs())
   225  	assert.NilError(t, err)
   226  	assert.Assert(t, is.Len(pr.VolumesDeleted, 0))
   227  	assert.Assert(t, service.Release(ctx, v.Name, t.Name()))
   228  
   229  	pr, err = service.Prune(ctx, filters.NewArgs())
   230  	assert.NilError(t, err)
   231  	assert.Assert(t, is.Len(pr.VolumesDeleted, 1))
   232  	assert.Assert(t, is.Equal(pr.VolumesDeleted[0], "test"))
   233  }
   234  
   235  func newTestService(t *testing.T, ds *volumedrivers.Store) (*VolumesService, func()) {
   236  	t.Helper()
   237  
   238  	dir, err := os.MkdirTemp("", t.Name())
   239  	assert.NilError(t, err)
   240  
   241  	store, err := NewStore(dir, ds)
   242  	assert.NilError(t, err)
   243  	s := &VolumesService{vs: store, eventLogger: dummyEventLogger{}}
   244  	return s, func() {
   245  		assert.Check(t, s.Shutdown())
   246  		assert.Check(t, os.RemoveAll(dir))
   247  	}
   248  }
   249  
   250  type dummyEventLogger struct{}
   251  
   252  func (dummyEventLogger) LogVolumeEvent(_, _ string, _ map[string]string) {}