Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,8 @@
- **Dependencies:** Bump STACKIT SDK core module from `v0.25.0` to `v0.26.0`
- [v1.8.0](services/kms/CHANGELOG.md#v180)
- **Feature:** Added `_UNKNOWN_DEFAULT_OPEN_API` fallback value to all enums to handle unknown API values gracefully.
- [v1.9.0](services/kms/CHANGELOG.md#v190)
- **Improvement:** Use new WaitHandler struct for all wait handlers
- `lbapplication`:
- [v0.5.7](services/lbapplication/CHANGELOG.md#v057)
- **Dependencies:** Bump STACKIT SDK core module from `v0.24.0` to `v0.24.1`
Expand Down
3 changes: 3 additions & 0 deletions services/kms/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
## v1.9.0
- **Improvement:** Use new WaitHandler struct for all wait handlers

## v1.8.0
- **Feature:** Added `_UNKNOWN_DEFAULT_OPEN_API` fallback value to all enums to handle unknown API values gracefully.

Expand Down
2 changes: 1 addition & 1 deletion services/kms/VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v1.8.0
v1.9.0
175 changes: 60 additions & 115 deletions services/kms/v1api/wait/wait.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,9 @@ package wait
import (
"context"
"errors"
"fmt"
"net/http"
"time"

"github.com/stackitcloud/stackit-sdk-go/core/oapierror"
"github.com/stackitcloud/stackit-sdk-go/core/wait"
kms "github.com/stackitcloud/stackit-sdk-go/services/kms/v1api"
)
Expand Down Expand Up @@ -39,149 +37,96 @@ const (
)

func CreateKeyRingWaitHandler(ctx context.Context, client kms.DefaultAPI, projectId, region, keyRingId string) *wait.AsyncActionHandler[kms.KeyRing] {
handler := wait.New(func() (bool, *kms.KeyRing, error) {
response, err := client.GetKeyRing(ctx, projectId, region, keyRingId).Execute()
if err != nil {
return false, nil, err
}

if response != nil {
switch response.State {
case KEYRINGSTATE_CREATING:
return false, nil, nil
default:
return true, response, nil
waitConfig := wait.WaiterHelper[kms.KeyRing, string]{
FetchInstance: client.GetKeyRing(ctx, projectId, region, keyRingId).Execute,
GetState: func(d *kms.KeyRing) (string, error) {
if d == nil || d.State == "" {
return "", errors.New("keyring or state is nil")
}
}

return false, nil, nil
})
return d.State, nil
},
ActiveState: []string{KEYRINGSTATE_ACTIVE, KEYRINGSTATE_DELETED},
}
handler := wait.New(waitConfig.Wait())
handler.SetTimeout(10 * time.Minute)
return handler
}

func CreateOrUpdateKeyWaitHandler(ctx context.Context, client kms.DefaultAPI, projectId, region, keyRingId, keyId string) *wait.AsyncActionHandler[kms.Key] {
handler := wait.New(func() (bool, *kms.Key, error) {
response, err := client.GetKey(ctx, projectId, region, keyRingId, keyId).Execute()
if err != nil {
return false, nil, err
}

if response != nil {
switch response.State {
case KEYSTATE_CREATING:
return false, nil, nil
default:
return true, response, nil
waitConfig := wait.WaiterHelper[kms.Key, string]{
FetchInstance: client.GetKey(ctx, projectId, region, keyRingId, keyId).Execute,
GetState: func(d *kms.Key) (string, error) {
if d == nil || d.State == "" {
return "", errors.New("key or state is nil")
}
}

return false, nil, nil
})
return d.State, nil
},
ActiveState: []string{KEYSTATE_ACTIVE, KEYSTATE_DELETED},
}
handler := wait.New(waitConfig.Wait())
handler.SetTimeout(10 * time.Minute)
return handler
}

func DeleteKeyWaitHandler(ctx context.Context, client kms.DefaultAPI, projectId, region, keyRingId, keyId string) *wait.AsyncActionHandler[kms.Key] {
handler := wait.New(func() (bool, *kms.Key, error) {
_, err := client.GetKey(ctx, projectId, region, keyRingId, keyId).Execute()
if err != nil {
var apiErr *oapierror.GenericOpenAPIError
if errors.As(err, &apiErr) {
if statusCode := apiErr.StatusCode; statusCode == http.StatusNotFound || statusCode == http.StatusGone {
return true, nil, nil
}
}
return true, nil, err
}
return false, nil, nil
})
waitConfig := wait.WaiterHelper[kms.Key, string]{
FetchInstance: client.GetKey(ctx, projectId, region, keyRingId, keyId).Execute,
GetState: func(_ *kms.Key) (string, error) {
return "", nil
},
DeleteHttpErrorStatusCodes: []int{http.StatusNotFound, http.StatusGone},
}
handler := wait.New(waitConfig.Wait())
handler.SetTimeout(10 * time.Minute)
return handler
}

func EnableKeyVersionWaitHandler(ctx context.Context, client kms.DefaultAPI, projectId, region, keyRingId, keyId string, version int64) *wait.AsyncActionHandler[kms.Version] {
handler := wait.New(func() (bool, *kms.Version, error) {
response, err := client.GetVersion(ctx, projectId, region, keyRingId, keyId, version).Execute()
if err != nil {
var apiErr *oapierror.GenericOpenAPIError
if errors.As(err, &apiErr) {
if statusCode := apiErr.StatusCode; statusCode == http.StatusNotFound || statusCode == http.StatusGone {
return true, nil, fmt.Errorf("enabling failed for key %s version %d: version or key not found", keyId, version)
}
}
return false, nil, err
}

if response != nil {
switch response.State {
case VERSIONSTATE_ACTIVE:
return true, response, nil
case VERSIONSTATE_CREATING:
return false, nil, nil
case VERSIONSTATE_DESTROYED, VERSIONSTATE_KEY_MATERIAL_INVALID:
return true, response, fmt.Errorf("enabling failed for key %s version %d: state %s", keyId, version, response.State)
default:
return true, response, fmt.Errorf("key version %d for key %s has unexpected state %s", version, keyId, response.State)
waitConfig := wait.WaiterHelper[kms.Version, string]{
FetchInstance: client.GetVersion(ctx, projectId, region, keyRingId, keyId, version).Execute,
GetState: func(d *kms.Version) (string, error) {
if d == nil || d.State == "" {
return "", errors.New("version or state is nil")
}
}

return false, nil, nil
})
return d.State, nil
},
ActiveState: []string{VERSIONSTATE_ACTIVE},
ErrorState: []string{VERSIONSTATE_DESTROYED, VERSIONSTATE_KEY_MATERIAL_INVALID, VERSIONSTATE_DISABLED, VERSIONSTATE_KEY_MATERIAL_UNAVAILABLE},
}
handler := wait.New(waitConfig.Wait())
handler.SetTimeout(10 * time.Minute)
return handler
}

func DisableKeyVersionWaitHandler(ctx context.Context, client kms.DefaultAPI, projectId, region, keyRingId, keyId string, version int64) *wait.AsyncActionHandler[kms.Version] {
handler := wait.New(func() (bool, *kms.Version, error) {
response, err := client.GetVersion(ctx, projectId, region, keyRingId, keyId, version).Execute()
if err != nil {
var apiErr *oapierror.GenericOpenAPIError
if errors.As(err, &apiErr) {
if statusCode := apiErr.StatusCode; statusCode == http.StatusNotFound || statusCode == http.StatusGone {
return true, nil, fmt.Errorf("disabling failed for key %s version %d: version or key not found", keyId, version)
}
}
return false, nil, err
}

if response != nil {
switch response.State {
case VERSIONSTATE_DISABLED:
return true, response, nil
case VERSIONSTATE_ACTIVE, VERSIONSTATE_CREATING, VERSIONSTATE_KEY_MATERIAL_UNAVAILABLE:
return false, nil, nil
case VERSIONSTATE_DESTROYED, VERSIONSTATE_KEY_MATERIAL_INVALID:
return true, response, fmt.Errorf("disabling failed for key %s version %d: state %s", keyId, version, response.State)
default:
return true, response, fmt.Errorf("key version %d for key %s has unexpected state %s", version, keyId, response.State)
waitConfig := wait.WaiterHelper[kms.Version, string]{
FetchInstance: client.GetVersion(ctx, projectId, region, keyRingId, keyId, version).Execute,
GetState: func(d *kms.Version) (string, error) {
if d == nil || d.State == "" {
return "", errors.New("version or state is nil")
}
}

return false, nil, nil
})
return d.State, nil
},
ActiveState: []string{VERSIONSTATE_DISABLED},
ErrorState: []string{VERSIONSTATE_DESTROYED, VERSIONSTATE_KEY_MATERIAL_INVALID},
}
handler := wait.New(waitConfig.Wait())
handler.SetTimeout(10 * time.Minute)
return handler
}

func CreateWrappingKeyWaitHandler(ctx context.Context, client kms.DefaultAPI, projectId, region, keyRingId, wrappingKeyId string) *wait.AsyncActionHandler[kms.WrappingKey] {
handler := wait.New(func() (bool, *kms.WrappingKey, error) {
response, err := client.GetWrappingKey(ctx, projectId, region, keyRingId, wrappingKeyId).Execute()
if err != nil {
return false, nil, err
}

if response != nil {
switch response.State {
case WRAPPINGKEYSTATE_CREATING:
return false, nil, nil
default:
return true, response, nil
waitConfig := wait.WaiterHelper[kms.WrappingKey, string]{
FetchInstance: client.GetWrappingKey(ctx, projectId, region, keyRingId, wrappingKeyId).Execute,
GetState: func(d *kms.WrappingKey) (string, error) {
if d == nil || d.State == "" {
return "", errors.New("wrappingkey or state is nil")
}
}

return false, nil, nil
})
return d.State, nil
},
ActiveState: []string{WRAPPINGKEYSTATE_ACTIVE, WRAPPINGKEYSTATE_DELETED},
}
handler := wait.New(waitConfig.Wait())
handler.SetTimeout(10 * time.Minute)
return handler
}
14 changes: 7 additions & 7 deletions services/kms/v1api/wait/wait_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -191,8 +191,8 @@ func TestCreateKeyRingWaitHandler(t *testing.T) {
responses: []keyRingResponse{
{fixtureKeyRing("bogus"), nil},
},
want: fixtureKeyRing("bogus"),
wantErr: false,
want: nil,
wantErr: true,
},
}
for _, tt := range tests {
Expand Down Expand Up @@ -267,8 +267,8 @@ func TestCreateOrUpdateKeyWaitHandler(t *testing.T) {
[]keyResponse{
{fixtureKey("bogus"), nil},
},
fixtureKey("bogus"),
false,
nil,
true,
},
// no special update tests needed as the states are the same
}
Expand Down Expand Up @@ -432,7 +432,7 @@ func TestEnableKeyVersionWaitHandler(t *testing.T) {
[]versionResponse{
{fixtureVersion(1, false, "bogus"), nil},
},
fixtureVersion(1, false, "bogus"),
nil,
true,
},
{
Expand Down Expand Up @@ -666,8 +666,8 @@ func TestCreateWrappingWaitHandler(t *testing.T) {
[]wrappingKeyResponse{
{fixtureWrappingKey("bogus"), nil},
},
fixtureWrappingKey("bogus"),
false,
nil,
true,
},
// no special update tests needed as the states are the same
}
Expand Down
Loading
Loading