Skip to content

Commit

Permalink
feat(instance): add a wait on volume (#418)
Browse files Browse the repository at this point in the history
  • Loading branch information
remyleone committed May 26, 2020
1 parent 93e630e commit bbbe8ec
Showing 1 changed file with 50 additions and 0 deletions.
50 changes: 50 additions & 0 deletions api/instance/v1/volume_utils.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package instance

import (
"time"

"github.com/scaleway/scaleway-sdk-go/internal/async"
"github.com/scaleway/scaleway-sdk-go/internal/errors"
"github.com/scaleway/scaleway-sdk-go/scw"
)

// WaitForImageRequest is used by WaitForImage method.
type WaitForVolumeRequest struct {
VolumeID string
Zone scw.Zone
Timeout time.Duration
}

// WaitForSnapshot wait for the snapshot to be in a "terminal state" before returning.
func (s *API) WaitForVolume(req *WaitForVolumeRequest) (*Volume, error) {
if req.Timeout == 0 {
req.Timeout = defaultTimeout
}

terminalStatus := map[VolumeState]struct{}{
VolumeStateAvailable: {},
VolumeStateError: {},
}

volume, err := async.WaitSync(&async.WaitSyncConfig{
Get: func() (interface{}, bool, error) {
res, err := s.GetVolume(&GetVolumeRequest{
VolumeID: req.VolumeID,
Zone: req.Zone,
})

if err != nil {
return nil, false, err
}
_, isTerminal := terminalStatus[res.Volume.State]

return res.Volume, isTerminal, err
},
Timeout: req.Timeout,
IntervalStrategy: async.LinearIntervalStrategy(RetryInterval),
})
if err != nil {
return nil, errors.Wrap(err, "waiting for volume failed")
}
return volume.(*Volume), nil
}

0 comments on commit bbbe8ec

Please sign in to comment.