@@ -21,6 +21,7 @@ import (
2121 "github.com/pkg/errors"
2222
2323 "gitlab.com/postgres-ai/database-lab/v2/pkg/log"
24+ "gitlab.com/postgres-ai/database-lab/v2/pkg/models"
2425 "gitlab.com/postgres-ai/database-lab/v2/pkg/services/provision/databases/postgres"
2526 "gitlab.com/postgres-ai/database-lab/v2/pkg/services/provision/docker"
2627 "gitlab.com/postgres-ai/database-lab/v2/pkg/services/provision/pool"
@@ -148,7 +149,7 @@ func (p *Provisioner) Reload(cfg Config, dbCfg resources.DB) {
148149// StartSession starts a new session.
149150func (p * Provisioner ) StartSession (snapshotID string , user resources.EphemeralUser ,
150151 extraConfig map [string ]string ) (* resources.Session , error ) {
151- snapshotID , err := p .getSnapshotID (snapshotID )
152+ snapshot , err := p .getSnapshot (snapshotID )
152153 if err != nil {
153154 return nil , errors .Wrap (err , "failed to get snapshots" )
154155 }
@@ -173,8 +174,8 @@ func (p *Provisioner) StartSession(snapshotID string, user resources.EphemeralUs
173174 }
174175 }()
175176
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" )
178179 }
179180
180181 appConfig := p .getAppConfig (fsm .Pool (), name , port )
@@ -228,19 +229,21 @@ func (p *Provisioner) StopSession(session *resources.Session) error {
228229}
229230
230231// 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 ) {
232233 fsm , err := p .pm .GetFSManager (session .Pool )
233234 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" )
235236 }
236237
237238 name := util .GetCloneName (session .Port )
238239
239- snapshotID , err = p .getSnapshotID (snapshotID )
240+ snapshot , err : = p .getSnapshot (snapshotID )
240241 if err != nil {
241- return errors .Wrap (err , "failed to get snapshots" )
242+ return nil , errors .Wrap (err , "failed to get snapshots" )
242243 }
243244
245+ log .Dbg ("Snapshot ID to reset session: " , snapshot .ID )
246+
244247 defer func () {
245248 if err != nil {
246249 p .revertSession (name )
@@ -251,26 +254,32 @@ func (p *Provisioner) ResetSession(session *resources.Session, snapshotID string
251254 appConfig .SetExtraConf (session .ExtraConfig )
252255
253256 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" )
255258 }
256259
257260 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" )
259262 }
260263
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" )
263266 }
264267
265268 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" )
267270 }
268271
269272 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" )
271274 }
272275
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
274283}
275284
276285// GetSnapshots provides a snapshot list.
@@ -306,21 +315,27 @@ func (p *Provisioner) revertSession(name string) {
306315 }
307316}
308317
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 ) {
314319 snapshots , err := p .GetSnapshots ()
315320 if err != nil {
316- return "" , errors .Wrap (err , "failed to get snapshots" )
321+ return nil , errors .Wrap (err , "failed to get snapshots" )
317322 }
318323
319324 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 )
321336 }
322337
323- return snapshots [0 ]. ID , nil
338+ return & snapshots [0 ], nil
324339}
325340
326341func (p * Provisioner ) initPortPool () error {
0 commit comments