Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Release (2024-XX-XX)
## Release (2024-XX-XX)

- `secretsmanager`: [v0.8.0](services/secretsmanager/CHANGELOG.md#v080-2024-05-23)
- **Breaking change**: Rename data types for uniformity
Expand All @@ -20,6 +20,8 @@ Release (2024-XX-XX)
- **Feature**: New methods `ExportRecordSets` and `ImportRecordSets`
- **Feature**: New methods `RestoreZone` and `RestoreRecordSet` to restore inactive zones and record-sets, respectively
- **Feature**: New method `RetrieveZone` to queue a secondary zone for a zone transfer request
- `sqlserverflex`: [v0.2.0](services/sqlserverflex/CHANGELOG.md#v020-2024-05-24)
- **Feature** Waiters for async operations `CreateInstanceWaitHandler`, `UpdateInstanceWaitHandler`, and `DeleteInstanceWaitHandler`

## Release (2024-05-22)

Expand Down
11 changes: 11 additions & 0 deletions examples/sqlserverflex/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module github.com/stackitcloud/stackit-sdk-go/examples/sqlserverflex

go 1.18

require github.com/stackitcloud/stackit-sdk-go/core v0.12.0

require (
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v0.1.0
)
9 changes: 9 additions & 0 deletions examples/sqlserverflex/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/stackitcloud/stackit-sdk-go/core v0.12.0 h1:auIzUUNRuydKOScvpICP4MifGgvOajiDQd+ncGmBL0U=
github.com/stackitcloud/stackit-sdk-go/core v0.12.0/go.mod h1:mDX1mSTsB3mP+tNBGcFNx6gH1mGBN4T+dVt+lcw7nlw=
github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v0.1.0 h1:zndnPbQLR9aeJXK7bWomQP1WcZgrzfPpDXlti4v4DP0=
github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v0.1.0/go.mod h1:27rHZe5pbIuDOdO2aZpUAWoRgOC2UB7rBJfmFnR1pBw=
76 changes: 76 additions & 0 deletions examples/sqlserverflex/sqlserverflex.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package main

import (
"context"
"fmt"
"os"

"github.com/stackitcloud/stackit-sdk-go/core/config"
"github.com/stackitcloud/stackit-sdk-go/core/utils"
"github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex"
"github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/wait"
)

func main() {
// Specify the project ID
projectId := "16f49d71-37ad-4137-8b97-44d9c55c4094"

// Specify instance configuration options
// flavorId := "FLAVOR_ID"
// version := "VERSION"
flavorId := "4.16-Single"
version := "2022"

ctx := context.Background()

// Create a new API client, that uses default authentication and configuration
sqlserverflexClient, err := sqlserverflex.NewAPIClient(
config.WithRegion("eu01"),
)
if err != nil {
fmt.Fprintf(os.Stderr, "Creating API client: %v\n", err)
os.Exit(1)
}

// Get the MongoDB Flex instances for your project
getInstancesResp, err := sqlserverflexClient.ListInstances(ctx, projectId).Execute()
if err != nil {
fmt.Fprintf(os.Stderr, "Error when calling `GetInstances`: %v\n", err)
os.Exit(1)
}
items := *getInstancesResp.Items
fmt.Printf("Number of instances: %v\n", len(items))

// Create an instance
createInstancePayload := sqlserverflex.CreateInstancePayload{
Name: utils.Ptr("my-instance-3"),
FlavorId: utils.Ptr(flavorId),
Version: utils.Ptr(version),
}
instance, err := sqlserverflexClient.CreateInstance(ctx, projectId).CreateInstancePayload(createInstancePayload).Execute()
if err != nil {
fmt.Fprintf(os.Stderr, "Error creating SQL Server Flex instance: %v\n", err)
}
instanceId := *instance.Id

_, err = wait.CreateInstanceWaitHandler(ctx, sqlserverflexClient, projectId, instanceId).WaitWithContext(ctx)
if err != nil {
fmt.Fprintf(os.Stderr, "Error when waiting for SQL Server Flex instance creation: %v\n", err)
}

fmt.Printf("Created SQL Server Flex instance \"%s\".\n", instanceId)

// Delete an instance
err = sqlserverflexClient.DeleteInstance(ctx, projectId, instanceId).Execute()

if err != nil {
fmt.Fprintf(os.Stderr, "Error deleting SQL Server Flex instance: %v\n", err)
}

_, err = wait.DeleteInstanceWaitHandler(ctx, sqlserverflexClient, projectId, instanceId).WaitWithContext(ctx)
if err != nil {
fmt.Fprintf(os.Stderr, "Error when waiting for SQL Server Flex instance deletion: %v\n", err)
}

fmt.Printf("Deleted SQL Server Flex instance \"%s\".\n", instanceId)
}
1 change: 1 addition & 0 deletions go.work
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ use (
./examples/secretsmanager
./examples/serviceaccount
./examples/ske
./examples/sqlserverflex
./examples/waiter
./scripts
./services/argus
Expand Down
2 changes: 1 addition & 1 deletion services/mongodbflex/wait/wait_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ func TestCreateInstanceWaitHandler(t *testing.T) {

handler := CreateInstanceWaitHandler(context.Background(), apiClient, "", instanceId)

gotRes, err := handler.SetTimeout(10 * time.Millisecond).WaitWithContext(context.Background())
gotRes, err := handler.SetTimeout(10 * time.Millisecond).SetSleepBeforeWait(1 * time.Millisecond).WaitWithContext(context.Background())

if (err != nil) != tt.wantErr {
t.Fatalf("handler error = %v, wantErr %v", err, tt.wantErr)
Expand Down
2 changes: 1 addition & 1 deletion services/postgresflex/wait/wait_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ func TestCreateInstanceWaitHandler(t *testing.T) {

handler := CreateInstanceWaitHandler(context.Background(), apiClient, "", instanceId)

gotRes, err := handler.SetTimeout(10 * time.Millisecond).WaitWithContext(context.Background())
gotRes, err := handler.SetTimeout(10 * time.Millisecond).SetSleepBeforeWait(1 * time.Millisecond).WaitWithContext(context.Background())

if (err != nil) != tt.wantErr {
t.Fatalf("handler error = %v, wantErr %v", err, tt.wantErr)
Expand Down
6 changes: 5 additions & 1 deletion services/sqlserverflex/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## v0.2.0 (2024-05-24)

- **Feature** Waiters for async operations `CreateInstanceWaitHandler`, `UpdateInstanceWaitHandler`, and `DeleteInstanceWaitHandler`

## v0.1.0 (2024-05-22)

- Manage your STACKIT SQL Server Flex resources: `Instance`, `Flavors`, `Users`, `Databases`, `Backups`
- Manage your STACKIT SQL Server Flex resources: `Instance`, `Flavors`, `Users`, `Databases`, `Backups`
1 change: 1 addition & 0 deletions services/sqlserverflex/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@ require github.com/stackitcloud/stackit-sdk-go/core v0.12.0

require (
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
github.com/google/go-cmp v0.6.0
github.com/google/uuid v1.6.0 // indirect
)
1 change: 1 addition & 0 deletions services/sqlserverflex/go.sum
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/stackitcloud/stackit-sdk-go/core v0.12.0 h1:auIzUUNRuydKOScvpICP4MifGgvOajiDQd+ncGmBL0U=
Expand Down
110 changes: 110 additions & 0 deletions services/sqlserverflex/wait/wait.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package wait

import (
"context"
"fmt"
"net/http"
"time"

"github.com/stackitcloud/stackit-sdk-go/core/oapierror"
"github.com/stackitcloud/stackit-sdk-go/core/wait"
"github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex"
)

const (
InstanceStateEmpty = ""
InstanceStateProcessing = "Progressing"
InstanceStateUnknown = "Unknown"
InstanceStateSuccess = "Ready"
InstanceStateFailed = "Failed"
)

// Interface needed for tests
type APIClientInstanceInterface interface {
GetInstanceExecute(ctx context.Context, projectId, instanceId string) (*sqlserverflex.GetInstanceResponse, error)
}

// CreateInstanceWaitHandler will wait for instance creation
func CreateInstanceWaitHandler(ctx context.Context, a APIClientInstanceInterface, projectId, instanceId string) *wait.AsyncActionHandler[sqlserverflex.GetInstanceResponse] {
handler := wait.New(func() (waitFinished bool, response *sqlserverflex.GetInstanceResponse, err error) {
s, err := a.GetInstanceExecute(ctx, projectId, instanceId)
if err != nil {
return false, nil, err
}
if s == nil || s.Item == nil || s.Item.Id == nil || *s.Item.Id != instanceId || s.Item.Status == nil {
return false, nil, nil
}
switch *s.Item.Status {
default:
return true, s, fmt.Errorf("instance with id %s has unexpected status %s", instanceId, *s.Item.Status)
case InstanceStateEmpty:
return false, s, nil
case InstanceStateProcessing:
return false, s, nil
case InstanceStateUnknown:
return false, s, nil
case InstanceStateSuccess:
return true, s, nil
case InstanceStateFailed:
return true, s, fmt.Errorf("create failed for instance with id %s", instanceId)
}
})
handler.SetTimeout(45 * time.Minute)
handler.SetSleepBeforeWait(5 * time.Second)
return handler
}

// UpdateInstanceWaitHandler will wait for instance update
func UpdateInstanceWaitHandler(ctx context.Context, a APIClientInstanceInterface, projectId, instanceId string) *wait.AsyncActionHandler[sqlserverflex.GetInstanceResponse] {
handler := wait.New(func() (waitFinished bool, response *sqlserverflex.GetInstanceResponse, err error) {
s, err := a.GetInstanceExecute(ctx, projectId, instanceId)
if err != nil {
return false, nil, err
}
if s == nil || s.Item == nil || s.Item.Id == nil || *s.Item.Id != instanceId || s.Item.Status == nil {
return false, nil, nil
}
switch *s.Item.Status {
default:
return true, s, fmt.Errorf("instance with id %s has unexpected status %s", instanceId, *s.Item.Status)
case InstanceStateEmpty:
return false, s, nil
case InstanceStateProcessing:
return false, s, nil
case InstanceStateUnknown:
return false, s, nil
case InstanceStateSuccess:
return true, s, nil
case InstanceStateFailed:
return true, s, fmt.Errorf("update failed for instance with id %s", instanceId)
}
})
handler.SetSleepBeforeWait(2 * time.Second)
handler.SetTimeout(45 * time.Minute)
return handler
}

// PartialUpdateInstanceWaitHandler will wait for instance update
func PartialUpdateInstanceWaitHandler(ctx context.Context, a APIClientInstanceInterface, projectId, instanceId string) *wait.AsyncActionHandler[sqlserverflex.GetInstanceResponse] {
return UpdateInstanceWaitHandler(ctx, a, projectId, instanceId)
}

// DeleteInstanceWaitHandler will wait for instance deletion
func DeleteInstanceWaitHandler(ctx context.Context, a APIClientInstanceInterface, projectId, instanceId string) *wait.AsyncActionHandler[struct{}] {
handler := wait.New(func() (waitFinished bool, response *struct{}, err error) {
_, err = a.GetInstanceExecute(ctx, projectId, instanceId)
if err == nil {
return false, nil, nil
}
oapiErr, ok := err.(*oapierror.GenericOpenAPIError) //nolint:errorlint //complaining that error.As should be used to catch wrapped errors, but this error should not be wrapped
if !ok {
return false, nil, fmt.Errorf("could not convert error to oapierror.GenericOpenAPIError")
}
if oapiErr.StatusCode != http.StatusNotFound {
return false, nil, err
}
return true, nil, nil
})
handler.SetTimeout(15 * time.Minute)
return handler
}
Loading