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) {}