From 4375cd66a350a04dfb04f56cf9923c22e12e78b3 Mon Sep 17 00:00:00 2001 From: Peter Paul Schaffrath Date: Wed, 10 Jun 2026 11:57:39 +0200 Subject: [PATCH 01/11] feat(mexp): add model experiments wait handler --- services/modelexperiments/CHANGELOG.md | 4 + services/modelexperiments/VERSION | 2 +- services/modelexperiments/go.mod | 5 +- services/modelexperiments/v1api/wait/wait.go | 96 +++++ .../modelexperiments/v1api/wait/wait_test.go | 327 ++++++++++++++++++ 5 files changed, 432 insertions(+), 2 deletions(-) create mode 100644 services/modelexperiments/v1api/wait/wait.go create mode 100644 services/modelexperiments/v1api/wait/wait_test.go diff --git a/services/modelexperiments/CHANGELOG.md b/services/modelexperiments/CHANGELOG.md index 4794a642e..b77c0b1d8 100644 --- a/services/modelexperiments/CHANGELOG.md +++ b/services/modelexperiments/CHANGELOG.md @@ -1,2 +1,6 @@ +## v0.2.0 + +- **New**: STACKIT Model Experiments module wait handler added. + ## v0.1.0 - **New**: API for STACKIT modelexperiments \ No newline at end of file diff --git a/services/modelexperiments/VERSION b/services/modelexperiments/VERSION index 9ff151c5b..81fd7ba08 100644 --- a/services/modelexperiments/VERSION +++ b/services/modelexperiments/VERSION @@ -1 +1 @@ -v0.1.0 \ No newline at end of file +v0.2.0 \ No newline at end of file diff --git a/services/modelexperiments/go.mod b/services/modelexperiments/go.mod index 6ea1a4c6f..b62e53f0e 100644 --- a/services/modelexperiments/go.mod +++ b/services/modelexperiments/go.mod @@ -2,7 +2,10 @@ module github.com/stackitcloud/stackit-sdk-go/services/modelexperiments go 1.25 -require github.com/stackitcloud/stackit-sdk-go/core v0.26.0 +require ( + github.com/google/go-cmp v0.7.0 + github.com/stackitcloud/stackit-sdk-go/core v0.26.0 +) require ( github.com/golang-jwt/jwt/v5 v5.3.1 // indirect diff --git a/services/modelexperiments/v1api/wait/wait.go b/services/modelexperiments/v1api/wait/wait.go new file mode 100644 index 000000000..4541684a3 --- /dev/null +++ b/services/modelexperiments/v1api/wait/wait.go @@ -0,0 +1,96 @@ +package wait + +import ( + "context" + "errors" + "net/http" + "time" + + "github.com/stackitcloud/stackit-sdk-go/core/wait" + modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" +) + +const ( + INSTANCESTATE_ACTIVE = "active" + INSTANCESTATE_IMPAIRED = "impaired" + + TOKENSTATE_ACTIVE = "active" +) + +// CreateMExpInstanceWaitHandler will wait for creation of Model Experiments instance +func CreateMExpInstanceWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceResponse] { + waitConfig := wait.WaiterHelper[modelexperiments.GetInstanceResponse, modelexperiments.InstanceState]{ + FetchInstance: a.GetInstance(ctx, projectId, region, instanceId).Execute, + GetState: func(response *modelexperiments.GetInstanceResponse) (modelexperiments.InstanceState, error) { + if response == nil { + return "", errors.New("empty response") + } + return response.Instance.State, nil + }, + ActiveState: []modelexperiments.InstanceState{modelexperiments.INSTANCESTATE_ACTIVE}, + ErrorState: []modelexperiments.InstanceState{modelexperiments.INSTANCESTATE_IMPAIRED}, + } + handler := wait.New(waitConfig.Wait()) + + handler.SetTimeout(10 * time.Minute) + + return handler +} + +// DeleteMExpInstanceWaitHandler will wait for deletion of Model Experiments instance +func DeleteMExpInstanceWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceResponse] { + waitConfig := wait.WaiterHelper[modelexperiments.GetInstanceResponse, modelexperiments.InstanceState]{ + FetchInstance: a.GetInstance(ctx, projectId, region, instanceId).Execute, + GetState: func(response *modelexperiments.GetInstanceResponse) (modelexperiments.InstanceState, error) { + if response == nil { + return "", errors.New("empty response") + } + return response.Instance.State, nil + }, + DeleteHttpErrorStatusCodes: []int{http.StatusNotFound}, + } + handler := wait.New(waitConfig.Wait()) + + handler.SetTimeout(10 * time.Minute) + + return handler +} + +// CreateMExpTokenWait Handler will wait for creation of Model Experiments instance token +func CreateMExpInstanceTokenWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId, tokenId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceTokenResponse] { + waitConfig := wait.WaiterHelper[modelexperiments.GetInstanceTokenResponse, modelexperiments.TokenState]{ + FetchInstance: a.GetInstanceToken(ctx, projectId, region, tokenId, instanceId).Execute, + GetState: func(response *modelexperiments.GetInstanceTokenResponse) (modelexperiments.TokenState, error) { + if response == nil { + return "", errors.New("empty response") + } + return response.Token.State, nil + }, + ActiveState: []modelexperiments.TokenState{modelexperiments.TOKENSTATE_ACTIVE}, + ErrorState: []modelexperiments.TokenState{}, + } + handler := wait.New(waitConfig.Wait()) + + handler.SetTimeout(10 * time.Minute) + + return handler +} + +// DeleteMExpInstanceTokenWaitHandler will wait for deletion of Model Experiments instance token +func DeleteMExpInstanceTokenWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId, tokenId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceTokenResponse] { + waitConfig := wait.WaiterHelper[modelexperiments.GetInstanceTokenResponse, modelexperiments.TokenState]{ + FetchInstance: a.GetInstanceToken(ctx, projectId, region, tokenId, instanceId).Execute, + GetState: func(response *modelexperiments.GetInstanceTokenResponse) (modelexperiments.TokenState, error) { + if response == nil { + return "", errors.New("empty response") + } + return response.Token.State, nil + }, + DeleteHttpErrorStatusCodes: []int{http.StatusNotFound}, + } + handler := wait.New(waitConfig.Wait()) + + handler.SetTimeout(10 * time.Minute) + + return handler +} diff --git a/services/modelexperiments/v1api/wait/wait_test.go b/services/modelexperiments/v1api/wait/wait_test.go new file mode 100644 index 000000000..9d2c61972 --- /dev/null +++ b/services/modelexperiments/v1api/wait/wait_test.go @@ -0,0 +1,327 @@ +package wait + +import ( + "context" + "testing" + "testing/synctest" + "time" + + "github.com/google/go-cmp/cmp" + + "github.com/stackitcloud/stackit-sdk-go/core/oapierror" + "github.com/stackitcloud/stackit-sdk-go/core/utils" + modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" +) + +type mockSettings struct { + getFails bool + statusCode int + resourceState string +} + +func newAPIMock(settings *mockSettings) modelexperiments.DefaultAPI { + return &modelexperiments.DefaultAPIServiceMock{ + GetInstanceExecuteMock: utils.Ptr(func(_ modelexperiments.ApiGetInstanceRequest) (*modelexperiments.GetInstanceResponse, error) { + if settings.getFails { + return nil, &oapierror.GenericOpenAPIError{ + StatusCode: settings.statusCode, + } + } + + return &modelexperiments.GetInstanceResponse{ + Instance: modelexperiments.Instance{ + State: modelexperiments.InstanceState(settings.resourceState), + }, + }, nil + }), + GetInstanceTokenExecuteMock: utils.Ptr(func(_ modelexperiments.ApiGetInstanceTokenRequest) (*modelexperiments.GetInstanceTokenResponse, error) { + if settings.getFails { + return nil, &oapierror.GenericOpenAPIError{ + StatusCode: settings.statusCode, + } + } + + return &modelexperiments.GetInstanceTokenResponse{ + Token: modelexperiments.TokenMetadata{ + State: modelexperiments.TokenState(settings.resourceState), + }, + }, nil + }), + } +} + +func TestCreateMExpInstanceWaitHandler(t *testing.T) { + tests := []struct { + desc string + getFails bool + statusCode int + resourceState string + wantErr bool + wantResp bool + }{ + { + desc: "create_succeeded", + getFails: false, + statusCode: 202, + resourceState: string(modelexperiments.INSTANCESTATE_ACTIVE), + wantErr: false, + wantResp: true, + }, + { + desc: "get_fails", + getFails: true, + statusCode: 500, + resourceState: "", + wantErr: true, + wantResp: false, + }, + { + desc: "not_found", + getFails: true, + statusCode: 404, + resourceState: "", + wantErr: true, + wantResp: false, + }, + { + desc: "impaired", + getFails: false, + statusCode: 200, + resourceState: string(modelexperiments.INSTANCESTATE_IMPAIRED), + wantErr: true, + wantResp: true, + }, + } + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + synctest.Test(t, func(t *testing.T) { + apiClient := newAPIMock(&mockSettings{ + getFails: tt.getFails, + statusCode: tt.statusCode, + resourceState: tt.resourceState, + }) + + var wantRes *modelexperiments.GetInstanceResponse + if tt.wantResp { + wantRes = &modelexperiments.GetInstanceResponse{ + Instance: modelexperiments.Instance{ + State: modelexperiments.InstanceState(tt.resourceState), + }, + } + } + + handler := CreateMExpInstanceWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId") + + gotRes, err := handler.SetTimeout(10 * time.Millisecond).WaitWithContext(context.Background()) + + if (err != nil) != tt.wantErr { + t.Fatalf("handler error = %v, wantErr %v", err, tt.wantErr) + } + if !cmp.Equal(gotRes, wantRes) { + t.Fatalf("handler gotRes = %v, want %v", gotRes, wantRes) + } + }) + }) + } +} + +func TestDeleteMExpInstanceWaitHandler(t *testing.T) { + tests := []struct { + desc string + getFails bool + statusCode int + resourceState string + wantErr bool + wantResp bool + }{ + { + desc: "delete_succeeded", + getFails: true, + statusCode: 404, + resourceState: "", + wantErr: false, + wantResp: false, + }, + { + desc: "delete_in_progress", + getFails: false, + statusCode: 200, + resourceState: string(modelexperiments.INSTANCESTATE_DELETING), + wantErr: true, // Should timeout since delete is not complete + wantResp: false, + }, + { + desc: "get_fails_with_other_error", + getFails: true, + statusCode: 500, + resourceState: "", + wantErr: true, + wantResp: false, + }, + } + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + synctest.Test(t, func(t *testing.T) { + apiClient := newAPIMock(&mockSettings{ + getFails: tt.getFails, + statusCode: tt.statusCode, + resourceState: tt.resourceState, + }) + + var wantRes *modelexperiments.GetInstanceResponse + if tt.wantResp { + wantRes = &modelexperiments.GetInstanceResponse{ + Instance: modelexperiments.Instance{ + State: modelexperiments.InstanceState(tt.resourceState), + }, + } + } + + handler := DeleteMExpInstanceWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId") + + gotRes, err := handler.SetTimeout(10 * time.Millisecond).WaitWithContext(context.Background()) + + if (err != nil) != tt.wantErr { + t.Fatalf("handler error = %v, wantErr %v", err, tt.wantErr) + } + if !cmp.Equal(gotRes, wantRes) { + t.Fatalf("handler gotRes = %v, want %v", gotRes, wantRes) + } + }) + }) + } +} + +func TestCreateMExpInstanceTokenWaitHandler(t *testing.T) { + tests := []struct { + desc string + getFails bool + statusCode int + resourceState string + wantErr bool + wantResp bool + }{ + { + desc: "create_succeeded", + getFails: false, + statusCode: 202, + resourceState: string(modelexperiments.TOKENSTATE_ACTIVE), + wantErr: false, + wantResp: true, + }, + { + desc: "get_fails", + getFails: true, + statusCode: 500, + resourceState: "", + wantErr: true, + wantResp: false, + }, + { + desc: "not_found", + getFails: true, + statusCode: 404, + resourceState: "", + wantErr: true, + wantResp: false, + }, + } + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + synctest.Test(t, func(t *testing.T) { + apiClient := newAPIMock(&mockSettings{ + getFails: tt.getFails, + statusCode: tt.statusCode, + resourceState: tt.resourceState, + }) + + var wantRes *modelexperiments.GetInstanceTokenResponse + if tt.wantResp { + wantRes = &modelexperiments.GetInstanceTokenResponse{ + Token: modelexperiments.TokenMetadata{ + State: modelexperiments.TokenState(tt.resourceState), + }, + } + } + + handler := CreateMExpInstanceTokenWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId", "tid") + + gotRes, err := handler.SetTimeout(10 * time.Millisecond).WaitWithContext(context.Background()) + + if (err != nil) != tt.wantErr { + t.Fatalf("handler error = %v, wantErr %v", err, tt.wantErr) + } + if !cmp.Equal(gotRes, wantRes) { + t.Fatalf("handler gotRes = %v, want %v", gotRes, wantRes) + } + }) + }) + } +} + +func TestDeleteMExpInstanceTokenWaitHandler(t *testing.T) { + tests := []struct { + desc string + getFails bool + statusCode int + resourceState string + wantErr bool + wantResp bool + }{ + { + desc: "delete_succeeded", + getFails: true, + statusCode: 404, + resourceState: "", + wantErr: false, + wantResp: false, + }, + { + desc: "delete_in_progress", + getFails: false, + statusCode: 200, + resourceState: string(modelexperiments.TOKENSTATE_DELETING), + wantErr: true, // Should timeout since delete is not complete + wantResp: false, + }, + { + desc: "get_fails_with_other_error", + getFails: true, + statusCode: 500, + resourceState: "", + wantErr: true, + wantResp: false, + }, + } + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + synctest.Test(t, func(t *testing.T) { + apiClient := newAPIMock(&mockSettings{ + getFails: tt.getFails, + statusCode: tt.statusCode, + resourceState: tt.resourceState, + }) + + var wantRes *modelexperiments.GetInstanceTokenResponse + if tt.wantResp { + wantRes = &modelexperiments.GetInstanceTokenResponse{ + Token: modelexperiments.TokenMetadata{ + State: modelexperiments.TokenState(tt.resourceState), + }, + } + } + + handler := DeleteMExpInstanceTokenWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId", "tid") + + gotRes, err := handler.SetTimeout(10 * time.Millisecond).WaitWithContext(context.Background()) + + if (err != nil) != tt.wantErr { + t.Fatalf("handler error = %v, wantErr %v", err, tt.wantErr) + } + if !cmp.Equal(gotRes, wantRes) { + t.Fatalf("handler gotRes = %v, want %v", gotRes, wantRes) + } + }) + }) + } +} From 9432f508c072131245d5df0fefd82a11c65d5395 Mon Sep 17 00:00:00 2001 From: Peter Paul Schaffrath Date: Wed, 10 Jun 2026 13:18:31 +0200 Subject: [PATCH 02/11] feat(mexp): add example and update changelog --- CHANGELOG.md | 2 + examples/modelexperiments/go.mod | 16 ++++++ examples/modelexperiments/go.sum | 8 +++ examples/modelexperiments/modelexperiments.go | 53 +++++++++++++++++++ services/modelexperiments/CHANGELOG.md | 1 - 5 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 examples/modelexperiments/go.mod create mode 100644 examples/modelexperiments/go.sum create mode 100644 examples/modelexperiments/modelexperiments.go diff --git a/CHANGELOG.md b/CHANGELOG.md index b1bfb6eb0..660b342cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -306,6 +306,8 @@ - `v1api`: - **Feature:** Added optional `CreateCredentialsPayload` to `ApiCreateCredentialsRequest`. - `modelexperiments`: + - [v.0.2.0](services/modelexperiments/CHANGELOG.md#v020) + - **New**: STACKIT Model Experiments module wait handler added. - [v0.1.0](services/modelexperiments/CHANGELOG.md#v010) - **New**: API for STACKIT modelexperiments - `modelserving`: diff --git a/examples/modelexperiments/go.mod b/examples/modelexperiments/go.mod new file mode 100644 index 000000000..5d045f282 --- /dev/null +++ b/examples/modelexperiments/go.mod @@ -0,0 +1,16 @@ +module github.com/stackitcloud/stackit-sdk-go/examples/modelexperiments + +go 1.25 + +// This is not needed in production. This is only here to point the golangci linter to the local version instead of the last release on GitHub. +replace github.com/stackitcloud/stackit-sdk-go/services/modelexperiments => ../../services/modelexperiments + +require ( + github.com/stackitcloud/stackit-sdk-go/core v0.26.0 + github.com/stackitcloud/stackit-sdk-go/services/modelexperiments v0.2.0 +) + +require ( + github.com/golang-jwt/jwt/v5 v5.3.1 // indirect + github.com/google/uuid v1.6.0 // indirect +) diff --git a/examples/modelexperiments/go.sum b/examples/modelexperiments/go.sum new file mode 100644 index 000000000..3712a0c87 --- /dev/null +++ b/examples/modelexperiments/go.sum @@ -0,0 +1,8 @@ +github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= +github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +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.26.0 h1:jQEb9gkehfp6VCP6TcYk7BI10cz4l0KM2L6hqYBH2QA= +github.com/stackitcloud/stackit-sdk-go/core v0.26.0/go.mod h1:WU1hhxnjXw2EV7CYa1nlEvNpMiRY6CvmIOaHuL3pOaA= diff --git a/examples/modelexperiments/modelexperiments.go b/examples/modelexperiments/modelexperiments.go new file mode 100644 index 000000000..c5e603f87 --- /dev/null +++ b/examples/modelexperiments/modelexperiments.go @@ -0,0 +1,53 @@ +package main + +import ( + "context" + "fmt" + "os" + + modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" +) + +func main() { + projectId := "PROJECT_ID" // the uuid of your STACKIT project + region := "eu01" + instanceName := "instance" + description := "description" + + modelexperimentsClient, err := modelexperiments.NewAPIClient() + if err != nil { + fmt.Fprintf(os.Stderr, "Creating API client: %v\n", err) + os.Exit(1) + } + + // Create a instance + createInstancePayload := modelexperiments.CreateInstancePayload{ + Name: instanceName, + Description: &description, + } + createInstanceResp, err := modelexperimentsClient.DefaultAPI.CreateInstance(context.Background(), projectId, region).CreateInstancePayload(createInstancePayload).Execute() + if err != nil { + fmt.Fprintf(os.Stderr, "Error when calling `CreateInstance`: %v\n", err) + } else { + fmt.Printf("Created instance with instance id \"%s\".\n", createInstanceResp.Instance.Id) + } + + // Get the created instance + getInstanceResp, err := modelexperimentsClient.DefaultAPI.GetInstance(context.Background(), projectId, region, createInstanceResp.Instance.Id).Execute() + if err != nil { + fmt.Fprintf(os.Stderr, "Error when calling `GetInstance`: %v\n", err) + } else { + fmt.Printf("Retrieved instance: %+v\n", getInstanceResp.Instance) + } + + // Create a token for the instance + createTokenPayload := modelexperiments.CreateInstanceTokenPayload{ + Name: "token-name", + } + createTokenResp, err := modelexperimentsClient.DefaultAPI.CreateInstanceToken(context.Background(), projectId, region, createInstanceResp.Instance.Id).CreateInstanceTokenPayload(createTokenPayload).Execute() + if err != nil { + fmt.Fprintf(os.Stderr, "Error when calling `CreateToken`: %v\n", err) + } else { + fmt.Printf("Created token: %+v\n", createTokenResp.Token) + } +} diff --git a/services/modelexperiments/CHANGELOG.md b/services/modelexperiments/CHANGELOG.md index b77c0b1d8..55a0c150e 100644 --- a/services/modelexperiments/CHANGELOG.md +++ b/services/modelexperiments/CHANGELOG.md @@ -1,5 +1,4 @@ ## v0.2.0 - - **New**: STACKIT Model Experiments module wait handler added. ## v0.1.0 From 46fd1d9f35b32c905823a7a79656e66c5539464c Mon Sep 17 00:00:00 2001 From: Peter Paul Schaffrath Date: Wed, 10 Jun 2026 20:51:46 +0200 Subject: [PATCH 03/11] feat(mexp): fix linting --- examples/modelexperiments/go.mod | 4 ++-- go.work | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/modelexperiments/go.mod b/examples/modelexperiments/go.mod index 5d045f282..d3350d45c 100644 --- a/examples/modelexperiments/go.mod +++ b/examples/modelexperiments/go.mod @@ -6,8 +6,8 @@ go 1.25 replace github.com/stackitcloud/stackit-sdk-go/services/modelexperiments => ../../services/modelexperiments require ( - github.com/stackitcloud/stackit-sdk-go/core v0.26.0 - github.com/stackitcloud/stackit-sdk-go/services/modelexperiments v0.2.0 + github.com/stackitcloud/stackit-sdk-go/core v0.26.0 + github.com/stackitcloud/stackit-sdk-go/services/modelexperiments v0.2.0 ) require ( diff --git a/go.work b/go.work index 9d64b69f9..7c0013e6d 100644 --- a/go.work +++ b/go.work @@ -20,6 +20,7 @@ use ( ./examples/logs ./examples/mariadb ./examples/middleware + ./examples/modelexperiments ./examples/mongodbflex ./examples/objectstorage ./examples/observability From bd90c442aaad82f10a62e71b83a9bc50d77236d7 Mon Sep 17 00:00:00 2001 From: Peter Paul Schaffrath Date: Wed, 10 Jun 2026 21:04:34 +0200 Subject: [PATCH 04/11] feat(mexp): tidying dependencies --- examples/modelexperiments/go.mod | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/modelexperiments/go.mod b/examples/modelexperiments/go.mod index d3350d45c..7b5fb9fbf 100644 --- a/examples/modelexperiments/go.mod +++ b/examples/modelexperiments/go.mod @@ -5,12 +5,10 @@ go 1.25 // This is not needed in production. This is only here to point the golangci linter to the local version instead of the last release on GitHub. replace github.com/stackitcloud/stackit-sdk-go/services/modelexperiments => ../../services/modelexperiments -require ( - github.com/stackitcloud/stackit-sdk-go/core v0.26.0 - github.com/stackitcloud/stackit-sdk-go/services/modelexperiments v0.2.0 -) +require github.com/stackitcloud/stackit-sdk-go/services/modelexperiments v0.2.0 require ( github.com/golang-jwt/jwt/v5 v5.3.1 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/stackitcloud/stackit-sdk-go/core v0.26.0 // indirect ) From 63a6c9ba7c3df3bdb285a877da4a04f217074277 Mon Sep 17 00:00:00 2001 From: Peter Paul Schaffrath Date: Wed, 17 Jun 2026 16:44:33 +0200 Subject: [PATCH 05/11] chore: code review fixes --- examples/modelexperiments/modelexperiments.go | 124 ++++++++++++++++-- services/modelexperiments/NOTICE.txt | 2 +- services/modelexperiments/v1api/wait/wait.go | 28 ++-- .../modelexperiments/v1api/wait/wait_test.go | 16 +-- 4 files changed, 132 insertions(+), 38 deletions(-) diff --git a/examples/modelexperiments/modelexperiments.go b/examples/modelexperiments/modelexperiments.go index c5e603f87..8ecb668ef 100644 --- a/examples/modelexperiments/modelexperiments.go +++ b/examples/modelexperiments/modelexperiments.go @@ -6,48 +6,146 @@ import ( "os" modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" + "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api/wait" ) func main() { projectId := "PROJECT_ID" // the uuid of your STACKIT project region := "eu01" instanceName := "instance" + newInstanceName := "newInstance" + newTokenName := "newTokenName" description := "description" + ctx := context.Background() modelexperimentsClient, err := modelexperiments.NewAPIClient() if err != nil { - fmt.Fprintf(os.Stderr, "Creating API client: %v\n", err) + fmt.Fprintf(os.Stderr, "[Model Experiments] Creating API client: %v\n", err) os.Exit(1) } - // Create a instance + // Create an Model Experiments Instance createInstancePayload := modelexperiments.CreateInstancePayload{ Name: instanceName, Description: &description, } - createInstanceResp, err := modelexperimentsClient.DefaultAPI.CreateInstance(context.Background(), projectId, region).CreateInstancePayload(createInstancePayload).Execute() + createInstanceResp, err := modelexperimentsClient.DefaultAPI.CreateInstance(ctx, projectId, region).CreateInstancePayload(createInstancePayload).Execute() if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `CreateInstance`: %v\n", err) + fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `CreateInstance`: %v\n", err) } else { - fmt.Printf("Created instance with instance id \"%s\".\n", createInstanceResp.Instance.Id) + fmt.Printf("[Model Experiments] Created Model Experiments Instance with ID: \"%s\".\n", createInstanceResp.Instance.Id) } - // Get the created instance - getInstanceResp, err := modelexperimentsClient.DefaultAPI.GetInstance(context.Background(), projectId, region, createInstanceResp.Instance.Id).Execute() + // Wait for the Model Experiments Instance to be ready + fmt.Printf("[Model Experiments] Waiting for Model Experiments Instance to be created.\n") + _, err = wait.CreateModelExperimentsInstanceWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, createInstanceResp.Instance.Id).WaitWithContext(ctx) if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `GetInstance`: %v\n", err) + fmt.Fprintf(os.Stderr, "[Model Experiments] Error when waiting for creation: %v\n", err) + } + fmt.Printf("[Model Experiments] Model Experiments Instance \"%s\" has been successfully created.\n", createInstanceResp.Instance.Id) + + // Get the created Model Experiments Instance + getInstanceResp, err := modelexperimentsClient.DefaultAPI.GetInstance(ctx, projectId, region, createInstanceResp.Instance.Id).Execute() + if err != nil { + fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `GetInstance`: %v\n", err) } else { - fmt.Printf("Retrieved instance: %+v\n", getInstanceResp.Instance) + fmt.Printf("[Model Experiments] Retrieved Model Experiments Instance with ID: \"%s\" and display name: \"%s\"\n", getInstanceResp.Instance.Id, getInstanceResp.Instance.Name) } - // Create a token for the instance + // List Model Experiments Instances + listInstaceResp, err := modelexperimentsClient.DefaultAPI.ListInstances(ctx, projectId, region).Execute() + if err != nil { + fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `ListInstances`: %v\n", err) + } else { + fmt.Printf("[Model Experiments] Retrieved %d instances\n", len(listInstaceResp.Instances)) + } + + // Update an Model Experiments Instance + partialUpdateInstancePayload := modelexperiments.PartialUpdateInstancePayload{ + Name: &newInstanceName, + } + partialUpdateInstanceResp, err := modelexperimentsClient.DefaultAPI.PartialUpdateInstance(ctx, projectId, region, getInstanceResp.Instance.Id).PartialUpdateInstancePayload(partialUpdateInstancePayload).Execute() + if err != nil { + fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `PartialUpdateInstance`: %v\n", err) + } else { + fmt.Printf("[Model Experiments] Updated Model Experiments Instance with ID: \"%s\" and display name: \"%s\"\n", partialUpdateInstanceResp.Instance.Id, partialUpdateInstanceResp.Instance.Name) + } + + // Delete an Model Experiments Instance + deleteInstanceResp, err := modelexperimentsClient.DefaultAPI.DeleteInstance(ctx, projectId, region, getInstanceResp.Instance.Id).Execute() + if err != nil { + fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `DeleteInstance`: %v\n", err) + } else { + fmt.Printf("[Model Experiments] Deleted Model Experiments Instance with ID: \"%s\" and display name: \"%s\"\n", deleteInstanceResp.Instance.Id, deleteInstanceResp.Instance.Name) + } + + // Wait for the Model Experiments Instance to be deleted + fmt.Printf("[Model Experiments] Waiting for Model Experiments Instance to be deleted.\n") + _, err = wait.DeleteModelExperimentsInstanceWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, getInstanceResp.Instance.Id).WaitWithContext(ctx) + if err != nil { + fmt.Fprintf(os.Stderr, "[Model Experiments] Error when waiting for deletion: %v\n", err) + } + fmt.Printf("[Model Experiments] Model Experiments Instance \"%s\" has been successfully deleted.\n", deleteInstanceResp.Instance.Id) + + // Create an Model Experiments Instance Token createTokenPayload := modelexperiments.CreateInstanceTokenPayload{ Name: "token-name", } - createTokenResp, err := modelexperimentsClient.DefaultAPI.CreateInstanceToken(context.Background(), projectId, region, createInstanceResp.Instance.Id).CreateInstanceTokenPayload(createTokenPayload).Execute() + createTokenResp, err := modelexperimentsClient.DefaultAPI.CreateInstanceToken(ctx, projectId, region, createInstanceResp.Instance.Id).CreateInstanceTokenPayload(createTokenPayload).Execute() + if err != nil { + fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `CreateToken`: %v\n", err) + } else { + fmt.Printf("[Model Experiments] Created Model Experiments Instance Token: %+v\n", createTokenResp.Token) + } + + // Wait for the Model Experiments Instance Token to be ready + fmt.Printf("[Model Experiments] Waiting for Model Experiments Instance Token to be created.\n") + _, err = wait.CreateModelExperimentsInstanceTokenWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, getInstanceResp.Instance.Id, createTokenResp.Token.Id).WaitWithContext(ctx) + if err != nil { + fmt.Fprintf(os.Stderr, "[Model Experiments] Error when waiting for creation: %v\n", err) + } + fmt.Printf("[Model Experiments] Model Experiments Instance Token \"%s\" has been successfully created.\n", createTokenResp.Token.Id) + + // Get the created Model Experiments Instance Token + getTokenResp, err := modelexperimentsClient.DefaultAPI.GetInstanceToken(ctx, projectId, region, createTokenResp.Token.Id, getInstanceResp.Instance.Id).Execute() if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `CreateToken`: %v\n", err) + fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `GetInstanceToken`: %v\n", err) } else { - fmt.Printf("Created token: %+v\n", createTokenResp.Token) + fmt.Printf("[Model Experiments] Retrieved Model Experiments Instance Token with ID: \"%s\" and display name: \"%s\"\n", getTokenResp.Token.Id, getTokenResp.Token.Name) + } + + // List Model Experiments Instance Tokens + listTokenResp, err := modelexperimentsClient.DefaultAPI.ListInstanceTokens(ctx, projectId, region, getInstanceResp.Instance.Id).Execute() + if err != nil { + fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `ListInstanceTokens`: %v\n", err) + } else { + fmt.Printf("[Model Experiments] Retrieved %d instance tokens\n", len(listTokenResp.Tokens)) + } + + // Update an Model Experiments Instance Token + partialUpdateInstanceTokenPayload := modelexperiments.PartialUpdateInstanceTokenPayload{ + Name: &newTokenName, + } + partialUpdateTokenResp, err := modelexperimentsClient.DefaultAPI.PartialUpdateInstanceToken(ctx, projectId, region, getTokenResp.Token.Id, getInstanceResp.Instance.Id).PartialUpdateInstanceTokenPayload(partialUpdateInstanceTokenPayload).Execute() + if err != nil { + fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `PartialUpdateInstanceToken`: %v\n", err) + } else { + fmt.Printf("[Model Experiments] Updated Model Experiments Instance Token with ID: \"%s\" and display name: \"%s\"\n", partialUpdateTokenResp.Token.Id, partialUpdateTokenResp.Token.Name) + } + + // Delete an Model Experiments Instance Token + deleteTokenResp, err := modelexperimentsClient.DefaultAPI.DeleteInstanceToken(ctx, projectId, region, getTokenResp.Token.Id, getInstanceResp.Instance.Id).Execute() + if err != nil { + fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `DeleteInstanceToken`: %v\n", err) + } else { + fmt.Printf("[Model Experiments] Deleted Model Experiments Instance Token with ID: \"%s\" and display name: \"%s\"\n", deleteTokenResp.Token.Id, deleteTokenResp.Token.Name) + } + + // Wait for the Model Experiments Instance Token to be deleted + fmt.Printf("[Model Experiments] Waiting for Model Experiments Instance Token to be deleted.\n") + _, err = wait.DeleteModelExperimentsInstanceTokenWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, getInstanceResp.Instance.Id, deleteTokenResp.Token.Id).WaitWithContext(ctx) + if err != nil { + fmt.Fprintf(os.Stderr, "[Model Experiments] Error when waiting for deletion: %v\n", err) } + fmt.Printf("[Model Experiments] Model Experiments Instance Token \"%s\" has been successfully deleted.\n", deleteTokenResp.Token.Id) } diff --git a/services/modelexperiments/NOTICE.txt b/services/modelexperiments/NOTICE.txt index 80f267471..ae5b9e7f3 100644 --- a/services/modelexperiments/NOTICE.txt +++ b/services/modelexperiments/NOTICE.txt @@ -1,2 +1,2 @@ -STACKIT modelexperiments SDK for Go +STACKIT Model Experiments SDK for Go Copyright 2026 Schwarz IT KG \ No newline at end of file diff --git a/services/modelexperiments/v1api/wait/wait.go b/services/modelexperiments/v1api/wait/wait.go index 4541684a3..95160ffc1 100644 --- a/services/modelexperiments/v1api/wait/wait.go +++ b/services/modelexperiments/v1api/wait/wait.go @@ -17,8 +17,8 @@ const ( TOKENSTATE_ACTIVE = "active" ) -// CreateMExpInstanceWaitHandler will wait for creation of Model Experiments instance -func CreateMExpInstanceWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceResponse] { +// CreateModelExperimentsInstanceWaitHandler will wait for creation of Model Experiments instance +func CreateModelExperimentsInstanceWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceResponse] { waitConfig := wait.WaiterHelper[modelexperiments.GetInstanceResponse, modelexperiments.InstanceState]{ FetchInstance: a.GetInstance(ctx, projectId, region, instanceId).Execute, GetState: func(response *modelexperiments.GetInstanceResponse) (modelexperiments.InstanceState, error) { @@ -30,15 +30,14 @@ func CreateMExpInstanceWaitHandler(ctx context.Context, a modelexperiments.Defau ActiveState: []modelexperiments.InstanceState{modelexperiments.INSTANCESTATE_ACTIVE}, ErrorState: []modelexperiments.InstanceState{modelexperiments.INSTANCESTATE_IMPAIRED}, } - handler := wait.New(waitConfig.Wait()) + handler := wait.New(waitConfig.Wait()) handler.SetTimeout(10 * time.Minute) - return handler } -// DeleteMExpInstanceWaitHandler will wait for deletion of Model Experiments instance -func DeleteMExpInstanceWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceResponse] { +// DeleteModelExperimentsInstanceWaitHandler will wait for deletion of Model Experiments instance +func DeleteModelExperimentsInstanceWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceResponse] { waitConfig := wait.WaiterHelper[modelexperiments.GetInstanceResponse, modelexperiments.InstanceState]{ FetchInstance: a.GetInstance(ctx, projectId, region, instanceId).Execute, GetState: func(response *modelexperiments.GetInstanceResponse) (modelexperiments.InstanceState, error) { @@ -49,15 +48,14 @@ func DeleteMExpInstanceWaitHandler(ctx context.Context, a modelexperiments.Defau }, DeleteHttpErrorStatusCodes: []int{http.StatusNotFound}, } - handler := wait.New(waitConfig.Wait()) + handler := wait.New(waitConfig.Wait()) handler.SetTimeout(10 * time.Minute) - return handler } -// CreateMExpTokenWait Handler will wait for creation of Model Experiments instance token -func CreateMExpInstanceTokenWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId, tokenId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceTokenResponse] { +// CreateModelExperimentsTokenWait Handler will wait for creation of Model Experiments instance token +func CreateModelExperimentsInstanceTokenWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId, tokenId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceTokenResponse] { waitConfig := wait.WaiterHelper[modelexperiments.GetInstanceTokenResponse, modelexperiments.TokenState]{ FetchInstance: a.GetInstanceToken(ctx, projectId, region, tokenId, instanceId).Execute, GetState: func(response *modelexperiments.GetInstanceTokenResponse) (modelexperiments.TokenState, error) { @@ -69,15 +67,14 @@ func CreateMExpInstanceTokenWaitHandler(ctx context.Context, a modelexperiments. ActiveState: []modelexperiments.TokenState{modelexperiments.TOKENSTATE_ACTIVE}, ErrorState: []modelexperiments.TokenState{}, } - handler := wait.New(waitConfig.Wait()) + handler := wait.New(waitConfig.Wait()) handler.SetTimeout(10 * time.Minute) - return handler } -// DeleteMExpInstanceTokenWaitHandler will wait for deletion of Model Experiments instance token -func DeleteMExpInstanceTokenWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId, tokenId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceTokenResponse] { +// DeleteModelExperimentsInstanceTokenWaitHandler will wait for deletion of Model Experiments instance token +func DeleteModelExperimentsInstanceTokenWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId, tokenId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceTokenResponse] { waitConfig := wait.WaiterHelper[modelexperiments.GetInstanceTokenResponse, modelexperiments.TokenState]{ FetchInstance: a.GetInstanceToken(ctx, projectId, region, tokenId, instanceId).Execute, GetState: func(response *modelexperiments.GetInstanceTokenResponse) (modelexperiments.TokenState, error) { @@ -88,9 +85,8 @@ func DeleteMExpInstanceTokenWaitHandler(ctx context.Context, a modelexperiments. }, DeleteHttpErrorStatusCodes: []int{http.StatusNotFound}, } - handler := wait.New(waitConfig.Wait()) + handler := wait.New(waitConfig.Wait()) handler.SetTimeout(10 * time.Minute) - return handler } diff --git a/services/modelexperiments/v1api/wait/wait_test.go b/services/modelexperiments/v1api/wait/wait_test.go index 9d2c61972..709a076c8 100644 --- a/services/modelexperiments/v1api/wait/wait_test.go +++ b/services/modelexperiments/v1api/wait/wait_test.go @@ -50,7 +50,7 @@ func newAPIMock(settings *mockSettings) modelexperiments.DefaultAPI { } } -func TestCreateMExpInstanceWaitHandler(t *testing.T) { +func TestCreateModelExperimentsInstanceWaitHandler(t *testing.T) { tests := []struct { desc string getFails bool @@ -110,7 +110,7 @@ func TestCreateMExpInstanceWaitHandler(t *testing.T) { } } - handler := CreateMExpInstanceWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId") + handler := CreateModelExperimentsInstanceWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId") gotRes, err := handler.SetTimeout(10 * time.Millisecond).WaitWithContext(context.Background()) @@ -125,7 +125,7 @@ func TestCreateMExpInstanceWaitHandler(t *testing.T) { } } -func TestDeleteMExpInstanceWaitHandler(t *testing.T) { +func TestDeleteModelExperimentsInstanceWaitHandler(t *testing.T) { tests := []struct { desc string getFails bool @@ -177,7 +177,7 @@ func TestDeleteMExpInstanceWaitHandler(t *testing.T) { } } - handler := DeleteMExpInstanceWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId") + handler := DeleteModelExperimentsInstanceWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId") gotRes, err := handler.SetTimeout(10 * time.Millisecond).WaitWithContext(context.Background()) @@ -192,7 +192,7 @@ func TestDeleteMExpInstanceWaitHandler(t *testing.T) { } } -func TestCreateMExpInstanceTokenWaitHandler(t *testing.T) { +func TestCreateModelExperimentsInstanceTokenWaitHandler(t *testing.T) { tests := []struct { desc string getFails bool @@ -244,7 +244,7 @@ func TestCreateMExpInstanceTokenWaitHandler(t *testing.T) { } } - handler := CreateMExpInstanceTokenWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId", "tid") + handler := CreateModelExperimentsInstanceTokenWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId", "tid") gotRes, err := handler.SetTimeout(10 * time.Millisecond).WaitWithContext(context.Background()) @@ -259,7 +259,7 @@ func TestCreateMExpInstanceTokenWaitHandler(t *testing.T) { } } -func TestDeleteMExpInstanceTokenWaitHandler(t *testing.T) { +func TestDeleteModelExperimentsInstanceTokenWaitHandler(t *testing.T) { tests := []struct { desc string getFails bool @@ -311,7 +311,7 @@ func TestDeleteMExpInstanceTokenWaitHandler(t *testing.T) { } } - handler := DeleteMExpInstanceTokenWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId", "tid") + handler := DeleteModelExperimentsInstanceTokenWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId", "tid") gotRes, err := handler.SetTimeout(10 * time.Millisecond).WaitWithContext(context.Background()) From 8a4a1ba948a7a8ec16f5648fc2976d3992fca29c Mon Sep 17 00:00:00 2001 From: Peter Paul Schaffrath Date: Thu, 18 Jun 2026 08:45:11 +0200 Subject: [PATCH 06/11] chore: code review fixes --- examples/modelexperiments/modelexperiments.go | 122 +++++++++--------- 1 file changed, 60 insertions(+), 62 deletions(-) diff --git a/examples/modelexperiments/modelexperiments.go b/examples/modelexperiments/modelexperiments.go index 8ecb668ef..f12e3691a 100644 --- a/examples/modelexperiments/modelexperiments.go +++ b/examples/modelexperiments/modelexperiments.go @@ -2,8 +2,7 @@ package main import ( "context" - "fmt" - "os" + "log" modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api/wait" @@ -20,132 +19,131 @@ func main() { modelexperimentsClient, err := modelexperiments.NewAPIClient() if err != nil { - fmt.Fprintf(os.Stderr, "[Model Experiments] Creating API client: %v\n", err) - os.Exit(1) + log.Fatalf("[Model Experiments] Creating API client: %v\n", err) } - // Create an Model Experiments Instance + // Create a Model Experiments Instance + log.Printf("[Model Experiments] Creating Model Experiments Instance.\n") createInstancePayload := modelexperiments.CreateInstancePayload{ Name: instanceName, Description: &description, } createInstanceResp, err := modelexperimentsClient.DefaultAPI.CreateInstance(ctx, projectId, region).CreateInstancePayload(createInstancePayload).Execute() if err != nil { - fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `CreateInstance`: %v\n", err) - } else { - fmt.Printf("[Model Experiments] Created Model Experiments Instance with ID: \"%s\".\n", createInstanceResp.Instance.Id) + log.Fatalf("[Model Experiments] Error when calling `CreateInstance`: %v\n", err) } + log.Printf("[Model Experiments] Triggered creation of Model Experiments Instance with ID: \"%s\".\n", createInstanceResp.Instance.Id) // Wait for the Model Experiments Instance to be ready - fmt.Printf("[Model Experiments] Waiting for Model Experiments Instance to be created.\n") + log.Printf("[Model Experiments] Waiting for Model Experiments Instance to be created.\n") _, err = wait.CreateModelExperimentsInstanceWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, createInstanceResp.Instance.Id).WaitWithContext(ctx) if err != nil { - fmt.Fprintf(os.Stderr, "[Model Experiments] Error when waiting for creation: %v\n", err) + log.Fatalf("[Model Experiments] Error when waiting for creation: %v\n", err) } - fmt.Printf("[Model Experiments] Model Experiments Instance \"%s\" has been successfully created.\n", createInstanceResp.Instance.Id) + log.Printf("[Model Experiments] Model Experiments Instance \"%s\" has been successfully created.\n", createInstanceResp.Instance.Id) // Get the created Model Experiments Instance + log.Printf("[Model Experiments] Retrieving Model Experiments Instance.\n") getInstanceResp, err := modelexperimentsClient.DefaultAPI.GetInstance(ctx, projectId, region, createInstanceResp.Instance.Id).Execute() if err != nil { - fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `GetInstance`: %v\n", err) - } else { - fmt.Printf("[Model Experiments] Retrieved Model Experiments Instance with ID: \"%s\" and display name: \"%s\"\n", getInstanceResp.Instance.Id, getInstanceResp.Instance.Name) + log.Fatalf("[Model Experiments] Error when calling `GetInstance`: %v\n", err) } + log.Printf("[Model Experiments] Retrieved Model Experiments Instance with ID: \"%s\" and display name: \"%s\"\n", getInstanceResp.Instance.Id, getInstanceResp.Instance.Name) // List Model Experiments Instances - listInstaceResp, err := modelexperimentsClient.DefaultAPI.ListInstances(ctx, projectId, region).Execute() + log.Printf("[Model Experiments] Listing Model Experiments Instances.\n") + listInstanceResp, err := modelexperimentsClient.DefaultAPI.ListInstances(ctx, projectId, region).Execute() if err != nil { - fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `ListInstances`: %v\n", err) - } else { - fmt.Printf("[Model Experiments] Retrieved %d instances\n", len(listInstaceResp.Instances)) + log.Fatalf("[Model Experiments] Error when calling `ListInstances`: %v\n", err) } + log.Printf("[Model Experiments] Retrieved %d instances\n", len(listInstanceResp.Instances)) - // Update an Model Experiments Instance + // Update a Model Experiments Instance + log.Printf("[Model Experiments] Updating Model Experiments Instance.\n") partialUpdateInstancePayload := modelexperiments.PartialUpdateInstancePayload{ Name: &newInstanceName, } partialUpdateInstanceResp, err := modelexperimentsClient.DefaultAPI.PartialUpdateInstance(ctx, projectId, region, getInstanceResp.Instance.Id).PartialUpdateInstancePayload(partialUpdateInstancePayload).Execute() if err != nil { - fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `PartialUpdateInstance`: %v\n", err) - } else { - fmt.Printf("[Model Experiments] Updated Model Experiments Instance with ID: \"%s\" and display name: \"%s\"\n", partialUpdateInstanceResp.Instance.Id, partialUpdateInstanceResp.Instance.Name) + log.Fatalf("[Model Experiments] Error when calling `PartialUpdateInstance`: %v\n", err) } + log.Printf("[Model Experiments] Updated Model Experiments Instance with ID: \"%s\" and display name: \"%s\"\n", partialUpdateInstanceResp.Instance.Id, partialUpdateInstanceResp.Instance.Name) - // Delete an Model Experiments Instance - deleteInstanceResp, err := modelexperimentsClient.DefaultAPI.DeleteInstance(ctx, projectId, region, getInstanceResp.Instance.Id).Execute() - if err != nil { - fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `DeleteInstance`: %v\n", err) - } else { - fmt.Printf("[Model Experiments] Deleted Model Experiments Instance with ID: \"%s\" and display name: \"%s\"\n", deleteInstanceResp.Instance.Id, deleteInstanceResp.Instance.Name) - } - - // Wait for the Model Experiments Instance to be deleted - fmt.Printf("[Model Experiments] Waiting for Model Experiments Instance to be deleted.\n") - _, err = wait.DeleteModelExperimentsInstanceWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, getInstanceResp.Instance.Id).WaitWithContext(ctx) - if err != nil { - fmt.Fprintf(os.Stderr, "[Model Experiments] Error when waiting for deletion: %v\n", err) - } - fmt.Printf("[Model Experiments] Model Experiments Instance \"%s\" has been successfully deleted.\n", deleteInstanceResp.Instance.Id) - - // Create an Model Experiments Instance Token + // Create a Model Experiments Instance Token + log.Printf("[Model Experiments] Creating Model Experiments Instance Token.\n") createTokenPayload := modelexperiments.CreateInstanceTokenPayload{ Name: "token-name", } createTokenResp, err := modelexperimentsClient.DefaultAPI.CreateInstanceToken(ctx, projectId, region, createInstanceResp.Instance.Id).CreateInstanceTokenPayload(createTokenPayload).Execute() if err != nil { - fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `CreateToken`: %v\n", err) - } else { - fmt.Printf("[Model Experiments] Created Model Experiments Instance Token: %+v\n", createTokenResp.Token) + log.Fatalf("[Model Experiments] Error when calling `CreateToken`: %v\n", err) } + log.Printf("[Model Experiments] Triggered creation of Model Experiments Instance Token: %+v\n", createTokenResp.Token) // Wait for the Model Experiments Instance Token to be ready - fmt.Printf("[Model Experiments] Waiting for Model Experiments Instance Token to be created.\n") + log.Printf("[Model Experiments] Waiting for Model Experiments Instance Token to be created.\n") _, err = wait.CreateModelExperimentsInstanceTokenWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, getInstanceResp.Instance.Id, createTokenResp.Token.Id).WaitWithContext(ctx) if err != nil { - fmt.Fprintf(os.Stderr, "[Model Experiments] Error when waiting for creation: %v\n", err) + log.Fatalf("[Model Experiments] Error when waiting for creation: %v\n", err) } - fmt.Printf("[Model Experiments] Model Experiments Instance Token \"%s\" has been successfully created.\n", createTokenResp.Token.Id) + log.Printf("[Model Experiments] Model Experiments Instance Token \"%s\" has been successfully created.\n", createTokenResp.Token.Id) // Get the created Model Experiments Instance Token + log.Printf("[Model Experiments] Retrieving Model Experiments Instance Token.\n") getTokenResp, err := modelexperimentsClient.DefaultAPI.GetInstanceToken(ctx, projectId, region, createTokenResp.Token.Id, getInstanceResp.Instance.Id).Execute() if err != nil { - fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `GetInstanceToken`: %v\n", err) - } else { - fmt.Printf("[Model Experiments] Retrieved Model Experiments Instance Token with ID: \"%s\" and display name: \"%s\"\n", getTokenResp.Token.Id, getTokenResp.Token.Name) + log.Fatalf("[Model Experiments] Error when calling `GetInstanceToken`: %v\n", err) } + log.Printf("[Model Experiments] Retrieved Model Experiments Instance Token with ID: \"%s\" and display name: \"%s\"\n", getTokenResp.Token.Id, getTokenResp.Token.Name) // List Model Experiments Instance Tokens + log.Printf("[Model Experiments] Listing Model Experiments Instance Tokens.\n") listTokenResp, err := modelexperimentsClient.DefaultAPI.ListInstanceTokens(ctx, projectId, region, getInstanceResp.Instance.Id).Execute() if err != nil { - fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `ListInstanceTokens`: %v\n", err) - } else { - fmt.Printf("[Model Experiments] Retrieved %d instance tokens\n", len(listTokenResp.Tokens)) + log.Fatalf("[Model Experiments] Error when calling `ListInstanceTokens`: %v\n", err) } + log.Printf("[Model Experiments] Retrieved %d Instance tokens\n", len(listTokenResp.Tokens)) - // Update an Model Experiments Instance Token + // Update a Model Experiments Instance Token + log.Printf("[Model Experiments] Updating Model Experiments Instance Token.\n") partialUpdateInstanceTokenPayload := modelexperiments.PartialUpdateInstanceTokenPayload{ Name: &newTokenName, } partialUpdateTokenResp, err := modelexperimentsClient.DefaultAPI.PartialUpdateInstanceToken(ctx, projectId, region, getTokenResp.Token.Id, getInstanceResp.Instance.Id).PartialUpdateInstanceTokenPayload(partialUpdateInstanceTokenPayload).Execute() if err != nil { - fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `PartialUpdateInstanceToken`: %v\n", err) - } else { - fmt.Printf("[Model Experiments] Updated Model Experiments Instance Token with ID: \"%s\" and display name: \"%s\"\n", partialUpdateTokenResp.Token.Id, partialUpdateTokenResp.Token.Name) + log.Fatalf("[Model Experiments] Error when calling `PartialUpdateInstanceToken`: %v\n", err) } + log.Printf("[Model Experiments] Updated Model Experiments Instance Token with ID: \"%s\" and display name: \"%s\"\n", partialUpdateTokenResp.Token.Id, partialUpdateTokenResp.Token.Name) - // Delete an Model Experiments Instance Token + // Delete a Model Experiments Instance Token + log.Printf("[Model Experiments] Deleting Model Experiments Instance Token.\n") deleteTokenResp, err := modelexperimentsClient.DefaultAPI.DeleteInstanceToken(ctx, projectId, region, getTokenResp.Token.Id, getInstanceResp.Instance.Id).Execute() if err != nil { - fmt.Fprintf(os.Stderr, "[Model Experiments] Error when calling `DeleteInstanceToken`: %v\n", err) - } else { - fmt.Printf("[Model Experiments] Deleted Model Experiments Instance Token with ID: \"%s\" and display name: \"%s\"\n", deleteTokenResp.Token.Id, deleteTokenResp.Token.Name) + log.Fatalf("[Model Experiments] Error when calling `DeleteInstanceToken`: %v\n", err) } + log.Printf("[Model Experiments] Triggered deletion of Model Experiments Instance Token with ID: \"%s\" and display name: \"%s\"\n", deleteTokenResp.Token.Id, deleteTokenResp.Token.Name) // Wait for the Model Experiments Instance Token to be deleted - fmt.Printf("[Model Experiments] Waiting for Model Experiments Instance Token to be deleted.\n") + log.Printf("[Model Experiments] Waiting for Model Experiments Instance Token to be deleted.\n") _, err = wait.DeleteModelExperimentsInstanceTokenWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, getInstanceResp.Instance.Id, deleteTokenResp.Token.Id).WaitWithContext(ctx) if err != nil { - fmt.Fprintf(os.Stderr, "[Model Experiments] Error when waiting for deletion: %v\n", err) + log.Fatalf("[Model Experiments] Error when waiting for deletion: %v\n", err) + } + log.Printf("[Model Experiments] Model Experiments Instance Token \"%s\" has been successfully deleted.\n", deleteTokenResp.Token.Id) + + // Delete a Model Experiments Instance + log.Printf("[Model Experiments] Deleting Model Experiments Instance.\n") + deleteInstanceResp, err := modelexperimentsClient.DefaultAPI.DeleteInstance(ctx, projectId, region, getInstanceResp.Instance.Id).Execute() + if err != nil { + log.Fatalf("[Model Experiments] Error when calling `DeleteInstance`: %v\n", err) + } + log.Printf("[Model Experiments] Triggered deletion of Model Experiments Instance with ID: \"%s\" and display name: \"%s\"\n", deleteInstanceResp.Instance.Id, deleteInstanceResp.Instance.Name) + + // Wait for the Model Experiments Instance to be deleted + log.Printf("[Model Experiments] Waiting for Model Experiments Instance to be deleted.\n") + _, err = wait.DeleteModelExperimentsInstanceWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, getInstanceResp.Instance.Id).WaitWithContext(ctx) + if err != nil { + log.Fatalf("[Model Experiments] Error when waiting for deletion: %v\n", err) } - fmt.Printf("[Model Experiments] Model Experiments Instance Token \"%s\" has been successfully deleted.\n", deleteTokenResp.Token.Id) + log.Printf("[Model Experiments] Model Experiments Instance \"%s\" has been successfully deleted.\n", deleteInstanceResp.Instance.Id) } From 61f8db64dd51d74d08f20569ffe2ab941e96befe Mon Sep 17 00:00:00 2001 From: Peter Paul Schaffrath Date: Thu, 18 Jun 2026 09:53:27 +0200 Subject: [PATCH 07/11] chore: fix method naming --- examples/modelexperiments/modelexperiments.go | 8 ++++---- services/modelexperiments/v1api/wait/wait.go | 16 ++++++++-------- .../modelexperiments/v1api/wait/wait_test.go | 8 ++++---- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/examples/modelexperiments/modelexperiments.go b/examples/modelexperiments/modelexperiments.go index f12e3691a..5455725c7 100644 --- a/examples/modelexperiments/modelexperiments.go +++ b/examples/modelexperiments/modelexperiments.go @@ -36,7 +36,7 @@ func main() { // Wait for the Model Experiments Instance to be ready log.Printf("[Model Experiments] Waiting for Model Experiments Instance to be created.\n") - _, err = wait.CreateModelExperimentsInstanceWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, createInstanceResp.Instance.Id).WaitWithContext(ctx) + _, err = wait.CreateInstanceWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, createInstanceResp.Instance.Id).WaitWithContext(ctx) if err != nil { log.Fatalf("[Model Experiments] Error when waiting for creation: %v\n", err) } @@ -82,7 +82,7 @@ func main() { // Wait for the Model Experiments Instance Token to be ready log.Printf("[Model Experiments] Waiting for Model Experiments Instance Token to be created.\n") - _, err = wait.CreateModelExperimentsInstanceTokenWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, getInstanceResp.Instance.Id, createTokenResp.Token.Id).WaitWithContext(ctx) + _, err = wait.CreateInstanceTokenWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, getInstanceResp.Instance.Id, createTokenResp.Token.Id).WaitWithContext(ctx) if err != nil { log.Fatalf("[Model Experiments] Error when waiting for creation: %v\n", err) } @@ -125,7 +125,7 @@ func main() { // Wait for the Model Experiments Instance Token to be deleted log.Printf("[Model Experiments] Waiting for Model Experiments Instance Token to be deleted.\n") - _, err = wait.DeleteModelExperimentsInstanceTokenWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, getInstanceResp.Instance.Id, deleteTokenResp.Token.Id).WaitWithContext(ctx) + _, err = wait.DeleteInstanceTokenWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, getInstanceResp.Instance.Id, deleteTokenResp.Token.Id).WaitWithContext(ctx) if err != nil { log.Fatalf("[Model Experiments] Error when waiting for deletion: %v\n", err) } @@ -141,7 +141,7 @@ func main() { // Wait for the Model Experiments Instance to be deleted log.Printf("[Model Experiments] Waiting for Model Experiments Instance to be deleted.\n") - _, err = wait.DeleteModelExperimentsInstanceWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, getInstanceResp.Instance.Id).WaitWithContext(ctx) + _, err = wait.DeleteInstanceWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, getInstanceResp.Instance.Id).WaitWithContext(ctx) if err != nil { log.Fatalf("[Model Experiments] Error when waiting for deletion: %v\n", err) } diff --git a/services/modelexperiments/v1api/wait/wait.go b/services/modelexperiments/v1api/wait/wait.go index 95160ffc1..edcfe12e4 100644 --- a/services/modelexperiments/v1api/wait/wait.go +++ b/services/modelexperiments/v1api/wait/wait.go @@ -17,8 +17,8 @@ const ( TOKENSTATE_ACTIVE = "active" ) -// CreateModelExperimentsInstanceWaitHandler will wait for creation of Model Experiments instance -func CreateModelExperimentsInstanceWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceResponse] { +// CreateInstanceWaitHandler will wait for creation of Model Experiments instance +func CreateInstanceWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceResponse] { waitConfig := wait.WaiterHelper[modelexperiments.GetInstanceResponse, modelexperiments.InstanceState]{ FetchInstance: a.GetInstance(ctx, projectId, region, instanceId).Execute, GetState: func(response *modelexperiments.GetInstanceResponse) (modelexperiments.InstanceState, error) { @@ -36,8 +36,8 @@ func CreateModelExperimentsInstanceWaitHandler(ctx context.Context, a modelexper return handler } -// DeleteModelExperimentsInstanceWaitHandler will wait for deletion of Model Experiments instance -func DeleteModelExperimentsInstanceWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceResponse] { +// DeleteInstanceWaitHandler will wait for deletion of Model Experiments instance +func DeleteInstanceWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceResponse] { waitConfig := wait.WaiterHelper[modelexperiments.GetInstanceResponse, modelexperiments.InstanceState]{ FetchInstance: a.GetInstance(ctx, projectId, region, instanceId).Execute, GetState: func(response *modelexperiments.GetInstanceResponse) (modelexperiments.InstanceState, error) { @@ -54,8 +54,8 @@ func DeleteModelExperimentsInstanceWaitHandler(ctx context.Context, a modelexper return handler } -// CreateModelExperimentsTokenWait Handler will wait for creation of Model Experiments instance token -func CreateModelExperimentsInstanceTokenWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId, tokenId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceTokenResponse] { +// CreateInstanceTokenWaitHandler will wait for creation of Model Experiments instance token +func CreateInstanceTokenWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId, tokenId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceTokenResponse] { waitConfig := wait.WaiterHelper[modelexperiments.GetInstanceTokenResponse, modelexperiments.TokenState]{ FetchInstance: a.GetInstanceToken(ctx, projectId, region, tokenId, instanceId).Execute, GetState: func(response *modelexperiments.GetInstanceTokenResponse) (modelexperiments.TokenState, error) { @@ -73,8 +73,8 @@ func CreateModelExperimentsInstanceTokenWaitHandler(ctx context.Context, a model return handler } -// DeleteModelExperimentsInstanceTokenWaitHandler will wait for deletion of Model Experiments instance token -func DeleteModelExperimentsInstanceTokenWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId, tokenId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceTokenResponse] { +// DeleteInstanceTokenWaitHandler will wait for deletion of Model Experiments instance token +func DeleteInstanceTokenWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId, tokenId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceTokenResponse] { waitConfig := wait.WaiterHelper[modelexperiments.GetInstanceTokenResponse, modelexperiments.TokenState]{ FetchInstance: a.GetInstanceToken(ctx, projectId, region, tokenId, instanceId).Execute, GetState: func(response *modelexperiments.GetInstanceTokenResponse) (modelexperiments.TokenState, error) { diff --git a/services/modelexperiments/v1api/wait/wait_test.go b/services/modelexperiments/v1api/wait/wait_test.go index 709a076c8..7acfcdac4 100644 --- a/services/modelexperiments/v1api/wait/wait_test.go +++ b/services/modelexperiments/v1api/wait/wait_test.go @@ -110,7 +110,7 @@ func TestCreateModelExperimentsInstanceWaitHandler(t *testing.T) { } } - handler := CreateModelExperimentsInstanceWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId") + handler := CreateInstanceWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId") gotRes, err := handler.SetTimeout(10 * time.Millisecond).WaitWithContext(context.Background()) @@ -177,7 +177,7 @@ func TestDeleteModelExperimentsInstanceWaitHandler(t *testing.T) { } } - handler := DeleteModelExperimentsInstanceWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId") + handler := DeleteInstanceWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId") gotRes, err := handler.SetTimeout(10 * time.Millisecond).WaitWithContext(context.Background()) @@ -244,7 +244,7 @@ func TestCreateModelExperimentsInstanceTokenWaitHandler(t *testing.T) { } } - handler := CreateModelExperimentsInstanceTokenWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId", "tid") + handler := CreateInstanceTokenWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId", "tid") gotRes, err := handler.SetTimeout(10 * time.Millisecond).WaitWithContext(context.Background()) @@ -311,7 +311,7 @@ func TestDeleteModelExperimentsInstanceTokenWaitHandler(t *testing.T) { } } - handler := DeleteModelExperimentsInstanceTokenWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId", "tid") + handler := DeleteInstanceTokenWaitHandler(context.Background(), apiClient, "region", "pid", "instanceId", "tid") gotRes, err := handler.SetTimeout(10 * time.Millisecond).WaitWithContext(context.Background()) From 35edbc2ff3656b6de313f15180f8ea3ab046c040 Mon Sep 17 00:00:00 2001 From: Peter Paul Schaffrath Date: Thu, 18 Jun 2026 13:05:35 +0200 Subject: [PATCH 08/11] feat: set wait timeout to 45 min --- services/modelexperiments/v1api/wait/wait.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/services/modelexperiments/v1api/wait/wait.go b/services/modelexperiments/v1api/wait/wait.go index edcfe12e4..04fa556f8 100644 --- a/services/modelexperiments/v1api/wait/wait.go +++ b/services/modelexperiments/v1api/wait/wait.go @@ -32,7 +32,7 @@ func CreateInstanceWaitHandler(ctx context.Context, a modelexperiments.DefaultAP } handler := wait.New(waitConfig.Wait()) - handler.SetTimeout(10 * time.Minute) + handler.SetTimeout(45 * time.Minute) return handler } @@ -50,7 +50,7 @@ func DeleteInstanceWaitHandler(ctx context.Context, a modelexperiments.DefaultAP } handler := wait.New(waitConfig.Wait()) - handler.SetTimeout(10 * time.Minute) + handler.SetTimeout(45 * time.Minute) return handler } @@ -69,7 +69,7 @@ func CreateInstanceTokenWaitHandler(ctx context.Context, a modelexperiments.Defa } handler := wait.New(waitConfig.Wait()) - handler.SetTimeout(10 * time.Minute) + handler.SetTimeout(45 * time.Minute) return handler } @@ -87,6 +87,6 @@ func DeleteInstanceTokenWaitHandler(ctx context.Context, a modelexperiments.Defa } handler := wait.New(waitConfig.Wait()) - handler.SetTimeout(10 * time.Minute) + handler.SetTimeout(45 * time.Minute) return handler } From 0b1dbe6f509eb21d8d35fa1bb10320f6066e4543 Mon Sep 17 00:00:00 2001 From: Peter Paul Schaffrath Date: Mon, 22 Jun 2026 09:36:13 +0200 Subject: [PATCH 09/11] feat: fix code review --- examples/modelexperiments/modelexperiments.go | 22 +++++++++---------- services/modelexperiments/v1api/wait/wait.go | 8 +------ 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/examples/modelexperiments/modelexperiments.go b/examples/modelexperiments/modelexperiments.go index 5455725c7..9ea937c73 100644 --- a/examples/modelexperiments/modelexperiments.go +++ b/examples/modelexperiments/modelexperiments.go @@ -32,7 +32,7 @@ func main() { if err != nil { log.Fatalf("[Model Experiments] Error when calling `CreateInstance`: %v\n", err) } - log.Printf("[Model Experiments] Triggered creation of Model Experiments Instance with ID: \"%s\".\n", createInstanceResp.Instance.Id) + log.Printf("[Model Experiments] Triggered creation of Model Experiments Instance with ID: %q.\n", createInstanceResp.Instance.Id) // Wait for the Model Experiments Instance to be ready log.Printf("[Model Experiments] Waiting for Model Experiments Instance to be created.\n") @@ -40,7 +40,7 @@ func main() { if err != nil { log.Fatalf("[Model Experiments] Error when waiting for creation: %v\n", err) } - log.Printf("[Model Experiments] Model Experiments Instance \"%s\" has been successfully created.\n", createInstanceResp.Instance.Id) + log.Printf("[Model Experiments] Model Experiments Instance %q has been successfully created.\n", createInstanceResp.Instance.Id) // Get the created Model Experiments Instance log.Printf("[Model Experiments] Retrieving Model Experiments Instance.\n") @@ -48,7 +48,7 @@ func main() { if err != nil { log.Fatalf("[Model Experiments] Error when calling `GetInstance`: %v\n", err) } - log.Printf("[Model Experiments] Retrieved Model Experiments Instance with ID: \"%s\" and display name: \"%s\"\n", getInstanceResp.Instance.Id, getInstanceResp.Instance.Name) + log.Printf("[Model Experiments] Retrieved Model Experiments Instance with ID: %q and display name: %q\n", getInstanceResp.Instance.Id, getInstanceResp.Instance.Name) // List Model Experiments Instances log.Printf("[Model Experiments] Listing Model Experiments Instances.\n") @@ -67,7 +67,7 @@ func main() { if err != nil { log.Fatalf("[Model Experiments] Error when calling `PartialUpdateInstance`: %v\n", err) } - log.Printf("[Model Experiments] Updated Model Experiments Instance with ID: \"%s\" and display name: \"%s\"\n", partialUpdateInstanceResp.Instance.Id, partialUpdateInstanceResp.Instance.Name) + log.Printf("[Model Experiments] Updated Model Experiments Instance with ID: %q and display name: %q\n", partialUpdateInstanceResp.Instance.Id, partialUpdateInstanceResp.Instance.Name) // Create a Model Experiments Instance Token log.Printf("[Model Experiments] Creating Model Experiments Instance Token.\n") @@ -86,7 +86,7 @@ func main() { if err != nil { log.Fatalf("[Model Experiments] Error when waiting for creation: %v\n", err) } - log.Printf("[Model Experiments] Model Experiments Instance Token \"%s\" has been successfully created.\n", createTokenResp.Token.Id) + log.Printf("[Model Experiments] Model Experiments Instance Token %q has been successfully created.\n", createTokenResp.Token.Id) // Get the created Model Experiments Instance Token log.Printf("[Model Experiments] Retrieving Model Experiments Instance Token.\n") @@ -94,7 +94,7 @@ func main() { if err != nil { log.Fatalf("[Model Experiments] Error when calling `GetInstanceToken`: %v\n", err) } - log.Printf("[Model Experiments] Retrieved Model Experiments Instance Token with ID: \"%s\" and display name: \"%s\"\n", getTokenResp.Token.Id, getTokenResp.Token.Name) + log.Printf("[Model Experiments] Retrieved Model Experiments Instance Token with ID: %q and display name: %q\n", getTokenResp.Token.Id, getTokenResp.Token.Name) // List Model Experiments Instance Tokens log.Printf("[Model Experiments] Listing Model Experiments Instance Tokens.\n") @@ -113,7 +113,7 @@ func main() { if err != nil { log.Fatalf("[Model Experiments] Error when calling `PartialUpdateInstanceToken`: %v\n", err) } - log.Printf("[Model Experiments] Updated Model Experiments Instance Token with ID: \"%s\" and display name: \"%s\"\n", partialUpdateTokenResp.Token.Id, partialUpdateTokenResp.Token.Name) + log.Printf("[Model Experiments] Updated Model Experiments Instance Token with ID: %q and display name: %q\n", partialUpdateTokenResp.Token.Id, partialUpdateTokenResp.Token.Name) // Delete a Model Experiments Instance Token log.Printf("[Model Experiments] Deleting Model Experiments Instance Token.\n") @@ -121,7 +121,7 @@ func main() { if err != nil { log.Fatalf("[Model Experiments] Error when calling `DeleteInstanceToken`: %v\n", err) } - log.Printf("[Model Experiments] Triggered deletion of Model Experiments Instance Token with ID: \"%s\" and display name: \"%s\"\n", deleteTokenResp.Token.Id, deleteTokenResp.Token.Name) + log.Printf("[Model Experiments] Triggered deletion of Model Experiments Instance Token with ID: %q and display name: %q\n", deleteTokenResp.Token.Id, deleteTokenResp.Token.Name) // Wait for the Model Experiments Instance Token to be deleted log.Printf("[Model Experiments] Waiting for Model Experiments Instance Token to be deleted.\n") @@ -129,7 +129,7 @@ func main() { if err != nil { log.Fatalf("[Model Experiments] Error when waiting for deletion: %v\n", err) } - log.Printf("[Model Experiments] Model Experiments Instance Token \"%s\" has been successfully deleted.\n", deleteTokenResp.Token.Id) + log.Printf("[Model Experiments] Model Experiments Instance Token %q has been successfully deleted.\n", deleteTokenResp.Token.Id) // Delete a Model Experiments Instance log.Printf("[Model Experiments] Deleting Model Experiments Instance.\n") @@ -137,7 +137,7 @@ func main() { if err != nil { log.Fatalf("[Model Experiments] Error when calling `DeleteInstance`: %v\n", err) } - log.Printf("[Model Experiments] Triggered deletion of Model Experiments Instance with ID: \"%s\" and display name: \"%s\"\n", deleteInstanceResp.Instance.Id, deleteInstanceResp.Instance.Name) + log.Printf("[Model Experiments] Triggered deletion of Model Experiments Instance with ID: %q and display name: %q\n", deleteInstanceResp.Instance.Id, deleteInstanceResp.Instance.Name) // Wait for the Model Experiments Instance to be deleted log.Printf("[Model Experiments] Waiting for Model Experiments Instance to be deleted.\n") @@ -145,5 +145,5 @@ func main() { if err != nil { log.Fatalf("[Model Experiments] Error when waiting for deletion: %v\n", err) } - log.Printf("[Model Experiments] Model Experiments Instance \"%s\" has been successfully deleted.\n", deleteInstanceResp.Instance.Id) + log.Printf("[Model Experiments] Model Experiments Instance %q has been successfully deleted.\n", deleteInstanceResp.Instance.Id) } diff --git a/services/modelexperiments/v1api/wait/wait.go b/services/modelexperiments/v1api/wait/wait.go index 04fa556f8..50a51392d 100644 --- a/services/modelexperiments/v1api/wait/wait.go +++ b/services/modelexperiments/v1api/wait/wait.go @@ -10,13 +10,6 @@ import ( modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" ) -const ( - INSTANCESTATE_ACTIVE = "active" - INSTANCESTATE_IMPAIRED = "impaired" - - TOKENSTATE_ACTIVE = "active" -) - // CreateInstanceWaitHandler will wait for creation of Model Experiments instance func CreateInstanceWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceResponse] { waitConfig := wait.WaiterHelper[modelexperiments.GetInstanceResponse, modelexperiments.InstanceState]{ @@ -46,6 +39,7 @@ func DeleteInstanceWaitHandler(ctx context.Context, a modelexperiments.DefaultAP } return response.Instance.State, nil }, + ErrorState: []modelexperiments.InstanceState{modelexperiments.INSTANCESTATE_IMPAIRED}, DeleteHttpErrorStatusCodes: []int{http.StatusNotFound}, } From 7eaedb9f40cb99e1796a0a2dd87292e84eb1660f Mon Sep 17 00:00:00 2001 From: Peter Paul Schaffrath Date: Tue, 23 Jun 2026 19:10:44 +0200 Subject: [PATCH 10/11] chore: fix changelog entry --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 660b342cc..7f1a27f1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -306,10 +306,10 @@ - `v1api`: - **Feature:** Added optional `CreateCredentialsPayload` to `ApiCreateCredentialsRequest`. - `modelexperiments`: - - [v.0.2.0](services/modelexperiments/CHANGELOG.md#v020) - - **New**: STACKIT Model Experiments module wait handler added. - [v0.1.0](services/modelexperiments/CHANGELOG.md#v010) - **New**: API for STACKIT modelexperiments + - [v0.2.0](services/modelexperiments/CHANGELOG.md#v020) + - **New**: STACKIT Model Experiments module wait handler added. - `modelserving`: - [v0.8.3](services/modelserving/CHANGELOG.md#v083) - **Dependencies:** Bump STACKIT SDK core module from `v0.24.0` to `v0.24.1` From 2e9dbb98a8593e3cf3b51563198cc76f43b27ed7 Mon Sep 17 00:00:00 2001 From: Peter Paul Schaffrath Date: Wed, 24 Jun 2026 08:55:07 +0200 Subject: [PATCH 11/11] chore: put changelog entry to top --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f1a27f1e..62d2326c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ - `postgresflex`: - [v1.10.0](services/postgresflex/CHANGELOG.md#v1100) - `v3alpha1api`: Align package to latest API specification +- `modelexperiments`: + - [v0.2.0](services/modelexperiments/CHANGELOG.md#v020) + - **New**: STACKIT Model Experiments module wait handler added. ## Release (2026-06-18) - `core`: @@ -308,8 +311,6 @@ - `modelexperiments`: - [v0.1.0](services/modelexperiments/CHANGELOG.md#v010) - **New**: API for STACKIT modelexperiments - - [v0.2.0](services/modelexperiments/CHANGELOG.md#v020) - - **New**: STACKIT Model Experiments module wait handler added. - `modelserving`: - [v0.8.3](services/modelserving/CHANGELOG.md#v083) - **Dependencies:** Bump STACKIT SDK core module from `v0.24.0` to `v0.24.1`