github.com/moby/docker@v26.1.3+incompatible/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/events"
     9  	"github.com/docker/docker/api/types/filters"
    10  	"github.com/docker/docker/errdefs"
    11  	"github.com/docker/docker/volume"
    12  	volumedrivers "github.com/docker/docker/volume/drivers"
    13  	"github.com/docker/docker/volume/service/opts"
    14  	"github.com/docker/docker/volume/testutils"
    15  	"gotest.tools/v3/assert"
    16  	is "gotest.tools/v3/assert/cmp"
    17  )
    18  
    19  func TestServiceCreate(t *testing.T) {
    20  	t.Parallel()
    21  
    22  	ds := volumedrivers.NewStore(nil)
    23  	assert.Assert(t, ds.Register(testutils.NewFakeDriver("d1"), "d1"))
    24  	assert.Assert(t, ds.Register(testutils.NewFakeDriver("d2"), "d2"))
    25  
    26  	ctx := context.Background()
    27  	service, cleanup := newTestService(t, ds)
    28  	defer cleanup()
    29  
    30  	_, err := service.Create(ctx, "v1", "notexist")
    31  	assert.Assert(t, errdefs.IsNotFound(err), err)
    32  
    33  	v, err := service.Create(ctx, "v1", "d1")
    34  	assert.NilError(t, err)
    35  
    36  	vCopy, err := service.Create(ctx, "v1", "d1")
    37  	assert.NilError(t, err)
    38  	assert.Assert(t, is.DeepEqual(v, vCopy))
    39  
    40  	_, err = service.Create(ctx, "v1", "d2")
    41  	assert.Check(t, IsNameConflict(err), err)
    42  	assert.Check(t, errdefs.IsConflict(err), err)
    43  
    44  	assert.Assert(t, service.Remove(ctx, "v1"))
    45  	_, err = service.Create(ctx, "v1", "d2")
    46  	assert.NilError(t, err)
    47  	_, err = service.Create(ctx, "v1", "d2")
    48  	assert.NilError(t, err)
    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"), filters.Arg("all", "true")))
   177  	assert.NilError(t, err)
   178  	assert.Assert(t, is.Len(pr.VolumesDeleted, 0))
   179  
   180  	pr, err = service.Prune(ctx, filters.NewArgs(filters.Arg("all", "true")))
   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"), filters.Arg("all", "true")))
   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"), filters.Arg("all", "true")))
   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"), filters.Arg("all", "true")))
   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(filters.Arg("all", "true")))
   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, _ events.Action, _ map[string]string) {}