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