From 99d7702df95c628682c0be3e758b115213a3546e Mon Sep 17 00:00:00 2001 From: Laure-di <62625835+Laure-di@users.noreply.github.com> Date: Mon, 27 May 2024 14:12:28 +0200 Subject: [PATCH] feat(inference): add waiter (#2086) --- api/inference/v1beta1/inference_utils.go | 58 ++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 api/inference/v1beta1/inference_utils.go diff --git a/api/inference/v1beta1/inference_utils.go b/api/inference/v1beta1/inference_utils.go new file mode 100644 index 000000000..1c0f2fd2a --- /dev/null +++ b/api/inference/v1beta1/inference_utils.go @@ -0,0 +1,58 @@ +package inference + +import ( + "github.com/scaleway/scaleway-sdk-go/internal/async" + "github.com/scaleway/scaleway-sdk-go/internal/errors" + "github.com/scaleway/scaleway-sdk-go/scw" + "time" +) + +const ( + defaultRetryInterval = 15 * time.Second + defaultTimeout = 30 * time.Minute +) + +type WaitForDeploymentRequest struct { + DeploymentId string + Region scw.Region + Status DeploymentStatus + Timeout *time.Duration + RetryInterval *time.Duration +} + +func (s *API) WaitForDeployment(req *WaitForDeploymentRequest, opts ...scw.RequestOption) (*Deployment, error) { + timeout := defaultTimeout + if req.Timeout != nil { + timeout = *req.Timeout + } + retryInterval := defaultRetryInterval + if req.RetryInterval != nil { + retryInterval = *req.RetryInterval + } + + terminalStatus := map[DeploymentStatus]struct{}{ + DeploymentStatusReady: {}, + DeploymentStatusError: {}, + DeploymentStatusLocked: {}, + } + + deployment, err := async.WaitSync(&async.WaitSyncConfig{ + Get: func() (interface{}, bool, error) { + deployment, err := s.GetDeployment(&GetDeploymentRequest{ + Region: req.Region, + DeploymentID: req.DeploymentId, + }, opts...) + if err != nil { + return nil, false, err + } + _, isTerminal := terminalStatus[deployment.Status] + return deployment, isTerminal, nil + }, + IntervalStrategy: async.LinearIntervalStrategy(retryInterval), + Timeout: timeout, + }) + if err != nil { + return nil, errors.Wrap(err, "waiting for deployment failed") + } + return deployment.(*Deployment), nil +}