@@ -21,6 +21,7 @@ import (
21
21
"github.com/pkg/errors"
22
22
23
23
"gitlab.com/postgres-ai/database-lab/v2/pkg/log"
24
+ "gitlab.com/postgres-ai/database-lab/v2/pkg/models"
24
25
"gitlab.com/postgres-ai/database-lab/v2/pkg/services/provision/databases/postgres"
25
26
"gitlab.com/postgres-ai/database-lab/v2/pkg/services/provision/docker"
26
27
"gitlab.com/postgres-ai/database-lab/v2/pkg/services/provision/pool"
@@ -148,7 +149,7 @@ func (p *Provisioner) Reload(cfg Config, dbCfg resources.DB) {
148
149
// StartSession starts a new session.
149
150
func (p * Provisioner ) StartSession (snapshotID string , user resources.EphemeralUser ,
150
151
extraConfig map [string ]string ) (* resources.Session , error ) {
151
- snapshotID , err := p .getSnapshotID (snapshotID )
152
+ snapshot , err := p .getSnapshot (snapshotID )
152
153
if err != nil {
153
154
return nil , errors .Wrap (err , "failed to get snapshots" )
154
155
}
@@ -173,8 +174,8 @@ func (p *Provisioner) StartSession(snapshotID string, user resources.EphemeralUs
173
174
}
174
175
}()
175
176
176
- if err := fsm .CreateClone (name , snapshotID ); err != nil {
177
- return nil , errors .Wrap (err , "failed to create a clone" )
177
+ if err := fsm .CreateClone (name , snapshot . ID ); err != nil {
178
+ return nil , errors .Wrap (err , "failed to create clone" )
178
179
}
179
180
180
181
appConfig := p .getAppConfig (fsm .Pool (), name , port )
@@ -228,19 +229,21 @@ func (p *Provisioner) StopSession(session *resources.Session) error {
228
229
}
229
230
230
231
// ResetSession resets an existing session.
231
- func (p * Provisioner ) ResetSession (session * resources.Session , snapshotID string ) error {
232
+ func (p * Provisioner ) ResetSession (session * resources.Session , snapshotID string ) ( * models. Snapshot , error ) {
232
233
fsm , err := p .pm .GetFSManager (session .Pool )
233
234
if err != nil {
234
- return errors .Wrap (err , "failed to find a filesystem manager of this session" )
235
+ return nil , errors .Wrap (err , "failed to find filesystem manager of this session" )
235
236
}
236
237
237
238
name := util .GetCloneName (session .Port )
238
239
239
- snapshotID , err = p .getSnapshotID (snapshotID )
240
+ snapshot , err : = p .getSnapshot (snapshotID )
240
241
if err != nil {
241
- return errors .Wrap (err , "failed to get snapshots" )
242
+ return nil , errors .Wrap (err , "failed to get snapshots" )
242
243
}
243
244
245
+ log .Dbg ("Snapshot ID to reset session: " , snapshot .ID )
246
+
244
247
defer func () {
245
248
if err != nil {
246
249
p .revertSession (name )
@@ -251,26 +254,32 @@ func (p *Provisioner) ResetSession(session *resources.Session, snapshotID string
251
254
appConfig .SetExtraConf (session .ExtraConfig )
252
255
253
256
if err := postgres .Stop (p .runner , fsm .Pool (), name ); err != nil {
254
- return errors .Wrap (err , "failed to stop a container" )
257
+ return nil , errors .Wrap (err , "failed to stop container" )
255
258
}
256
259
257
260
if err := fsm .DestroyClone (name ); err != nil {
258
- return errors .Wrap (err , "failed to destroy clone" )
261
+ return nil , errors .Wrap (err , "failed to destroy clone" )
259
262
}
260
263
261
- if err := fsm .CreateClone (name , snapshotID ); err != nil {
262
- return errors .Wrap (err , "failed to create a clone" )
264
+ if err := fsm .CreateClone (name , snapshot . ID ); err != nil {
265
+ return nil , errors .Wrap (err , "failed to create clone" )
263
266
}
264
267
265
268
if err := postgres .Start (p .runner , appConfig ); err != nil {
266
- return errors .Wrap (err , "failed to start a container" )
269
+ return nil , errors .Wrap (err , "failed to start container" )
267
270
}
268
271
269
272
if err := p .prepareDB (appConfig , session .EphemeralUser ); err != nil {
270
- return errors .Wrap (err , "failed to prepare a database" )
273
+ return nil , errors .Wrap (err , "failed to prepare database" )
271
274
}
272
275
273
- return nil
276
+ snapshotModel := & models.Snapshot {
277
+ ID : snapshot .ID ,
278
+ CreatedAt : util .FormatTime (snapshot .CreatedAt ),
279
+ DataStateAt : util .FormatTime (snapshot .DataStateAt ),
280
+ }
281
+
282
+ return snapshotModel , nil
274
283
}
275
284
276
285
// GetSnapshots provides a snapshot list.
@@ -306,21 +315,27 @@ func (p *Provisioner) revertSession(name string) {
306
315
}
307
316
}
308
317
309
- func (p * Provisioner ) getSnapshotID (snapshotID string ) (string , error ) {
310
- if snapshotID != "" {
311
- return snapshotID , nil
312
- }
313
-
318
+ func (p * Provisioner ) getSnapshot (snapshotID string ) (* resources.Snapshot , error ) {
314
319
snapshots , err := p .GetSnapshots ()
315
320
if err != nil {
316
- return "" , errors .Wrap (err , "failed to get snapshots" )
321
+ return nil , errors .Wrap (err , "failed to get snapshots" )
317
322
}
318
323
319
324
if len (snapshots ) == 0 {
320
- return "" , errors .New ("no snapshots available" )
325
+ return nil , errors .New ("no snapshots available" )
326
+ }
327
+
328
+ if snapshotID != "" {
329
+ for _ , snapshot := range snapshots {
330
+ if snapshot .ID == snapshotID {
331
+ return & snapshot , nil
332
+ }
333
+ }
334
+
335
+ return nil , errors .Errorf ("snapshot %q not found" , snapshotID )
321
336
}
322
337
323
- return snapshots [0 ]. ID , nil
338
+ return & snapshots [0 ], nil
324
339
}
325
340
326
341
func (p * Provisioner ) initPortPool () error {
0 commit comments