diff --git a/CHANGELOG.md b/CHANGELOG.md index 91fa1296f..4dbf1ee36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -307,6 +307,8 @@ - **Dependencies:** Bump STACKIT SDK core module from `v0.24.1` to `v0.25.0` - [v0.28.2](services/redis/CHANGELOG.md#v0282) - **Dependencies:** Bump STACKIT SDK core module from `v0.25.0` to `v0.26.0` + - [v0.29.0](services/redis/CHANGELOG.md#v0290) + - `v1api`: **Improvement**: Use new `WaiterHandler` struct in the Redis WaitHandler - `resourcemanager`: - [v0.21.2](services/resourcemanager/CHANGELOG.md#v0212) - **Dependencies:** Bump STACKIT SDK core module from `v0.24.0` to `v0.24.1` diff --git a/services/redis/CHANGELOG.md b/services/redis/CHANGELOG.md index cf6d467b0..8e2069beb 100644 --- a/services/redis/CHANGELOG.md +++ b/services/redis/CHANGELOG.md @@ -1,3 +1,6 @@ +## v0.29.0 +- `v1api`: **Improvement**: Use new `WaiterHandler` struct in the Redis WaitHandler + ## v0.28.2 - **Dependencies:** Bump STACKIT SDK core module from `v0.25.0` to `v0.26.0` diff --git a/services/redis/VERSION b/services/redis/VERSION index f53b7bda1..5bc296535 100644 --- a/services/redis/VERSION +++ b/services/redis/VERSION @@ -1 +1 @@ -v0.28.2 \ No newline at end of file +v0.29.0 \ No newline at end of file diff --git a/services/redis/v1api/wait/wait.go b/services/redis/v1api/wait/wait.go index ae0e8c238..18a66aa9b 100644 --- a/services/redis/v1api/wait/wait.go +++ b/services/redis/v1api/wait/wait.go @@ -2,6 +2,7 @@ package wait import ( "context" + "errors" "fmt" "net/http" "strings" @@ -26,45 +27,45 @@ const ( ) // CreateInstanceWaitHandler will wait for instance creation -func CreateInstanceWaitHandler(ctx context.Context, a redis.DefaultAPI, projectId, instanceId string) *wait.AsyncActionHandler[redis.Instance] { - handler := wait.New(func() (waitFinished bool, response *redis.Instance, err error) { - s, err := a.GetInstance(ctx, projectId, instanceId).Execute() - if err != nil { - return false, nil, err - } - if s.Status == nil { - return false, nil, fmt.Errorf("create failed for instance with id %s. The response is not valid: the status is missing", instanceId) - } - switch *s.Status { - case INSTANCESTATUS_ACTIVE: - return true, s, nil - case INSTANCESTATUS_FAILED: - return true, s, fmt.Errorf("create failed for instance with id %s: %s", instanceId, s.LastOperation.Description) - } - return false, nil, nil - }) +func CreateInstanceWaitHandler(ctx context.Context, client redis.DefaultAPI, projectId, instanceId string) *wait.AsyncActionHandler[redis.Instance] { + waitConfig := wait.WaiterHelper[redis.Instance, string]{ + FetchInstance: client.GetInstance(ctx, projectId, instanceId).Execute, + GetState: func(response *redis.Instance) (string, error) { + if response == nil { + return "", errors.New("empty response") + } + if response.Status == nil { + return "", errors.New("status is missing in response") + } + return *response.Status, nil + }, + ActiveState: []string{INSTANCESTATUS_ACTIVE}, + ErrorState: []string{INSTANCESTATUS_FAILED}, + } + + handler := wait.New(waitConfig.Wait()) handler.SetTimeout(45 * time.Minute) return handler } // PartialUpdateInstanceWaitHandler will wait for instance update -func PartialUpdateInstanceWaitHandler(ctx context.Context, a redis.DefaultAPI, projectId, instanceId string) *wait.AsyncActionHandler[redis.Instance] { - handler := wait.New(func() (waitFinished bool, response *redis.Instance, err error) { - s, err := a.GetInstance(ctx, projectId, instanceId).Execute() - if err != nil { - return false, nil, err - } - if s.Status == nil { - return false, nil, fmt.Errorf("update failed for instance with id %s. The response is not valid: the instance id or the status are missing", instanceId) - } - switch *s.Status { - case INSTANCESTATUS_ACTIVE: - return true, s, nil - case INSTANCESTATUS_FAILED: - return true, s, fmt.Errorf("update failed for instance with id %s: %s", instanceId, s.LastOperation.Description) - } - return false, nil, nil - }) +func PartialUpdateInstanceWaitHandler(ctx context.Context, client redis.DefaultAPI, projectId, instanceId string) *wait.AsyncActionHandler[redis.Instance] { + waitConfig := wait.WaiterHelper[redis.Instance, string]{ + FetchInstance: client.GetInstance(ctx, projectId, instanceId).Execute, + GetState: func(response *redis.Instance) (string, error) { + if response == nil { + return "", errors.New("empty response") + } + if response.Status == nil { + return "", errors.New("status is missing in response") + } + return *response.Status, nil + }, + ActiveState: []string{INSTANCESTATUS_ACTIVE}, + ErrorState: []string{INSTANCESTATUS_FAILED}, + } + + handler := wait.New(waitConfig.Wait()) handler.SetTimeout(45 * time.Minute) return handler } diff --git a/services/redis/v1api/wait/wait_test.go b/services/redis/v1api/wait/wait_test.go index e71d036b1..0f08783e3 100644 --- a/services/redis/v1api/wait/wait_test.go +++ b/services/redis/v1api/wait/wait_test.go @@ -98,6 +98,13 @@ func TestCreateInstanceWaitHandler(t *testing.T) { wantErr: true, wantResp: true, }, + { + desc: "wrong state in response", + getFails: false, + resourceState: utils.Ptr("wrong state"), + wantErr: true, + wantResp: false, + }, { desc: "get_fails", getFails: true, @@ -169,6 +176,13 @@ func TestUpdateInstanceWaitHandler(t *testing.T) { wantErr: true, wantResp: true, }, + { + desc: "wrong state in response", + getFails: false, + resourceState: utils.Ptr("wrong state"), + wantErr: true, + wantResp: false, + }, { desc: "get_fails", getFails: true,