Skip to content

Commit 394081d

Browse files
authored
feat: onboard model experiments wait handler (#7800)
1 parent f40e129 commit 394081d

11 files changed

Lines changed: 597 additions & 3 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
- `postgresflex`:
1010
- [v1.10.0](services/postgresflex/CHANGELOG.md#v1100)
1111
- `v3alpha1api`: Align package to latest API specification
12+
- `modelexperiments`:
13+
- [v0.2.0](services/modelexperiments/CHANGELOG.md#v020)
14+
- **New**: STACKIT Model Experiments module wait handler added.
1215

1316
## Release (2026-06-18)
1417
- `core`:

examples/modelexperiments/go.mod

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module github.com/stackitcloud/stackit-sdk-go/examples/modelexperiments
2+
3+
go 1.25
4+
5+
// 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.
6+
replace github.com/stackitcloud/stackit-sdk-go/services/modelexperiments => ../../services/modelexperiments
7+
8+
require github.com/stackitcloud/stackit-sdk-go/services/modelexperiments v0.2.0
9+
10+
require (
11+
github.com/golang-jwt/jwt/v5 v5.3.1 // indirect
12+
github.com/google/uuid v1.6.0 // indirect
13+
github.com/stackitcloud/stackit-sdk-go/core v0.26.0 // indirect
14+
)

examples/modelexperiments/go.sum

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY=
2+
github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
3+
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
4+
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
5+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
6+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
7+
github.com/stackitcloud/stackit-sdk-go/core v0.26.0 h1:jQEb9gkehfp6VCP6TcYk7BI10cz4l0KM2L6hqYBH2QA=
8+
github.com/stackitcloud/stackit-sdk-go/core v0.26.0/go.mod h1:WU1hhxnjXw2EV7CYa1nlEvNpMiRY6CvmIOaHuL3pOaA=
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"log"
6+
7+
modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api"
8+
"github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api/wait"
9+
)
10+
11+
func main() {
12+
projectId := "PROJECT_ID" // the uuid of your STACKIT project
13+
region := "eu01"
14+
instanceName := "instance"
15+
newInstanceName := "newInstance"
16+
newTokenName := "newTokenName"
17+
description := "description"
18+
ctx := context.Background()
19+
20+
modelexperimentsClient, err := modelexperiments.NewAPIClient()
21+
if err != nil {
22+
log.Fatalf("[Model Experiments] Creating API client: %v\n", err)
23+
}
24+
25+
// Create a Model Experiments Instance
26+
log.Printf("[Model Experiments] Creating Model Experiments Instance.\n")
27+
createInstancePayload := modelexperiments.CreateInstancePayload{
28+
Name: instanceName,
29+
Description: &description,
30+
}
31+
createInstanceResp, err := modelexperimentsClient.DefaultAPI.CreateInstance(ctx, projectId, region).CreateInstancePayload(createInstancePayload).Execute()
32+
if err != nil {
33+
log.Fatalf("[Model Experiments] Error when calling `CreateInstance`: %v\n", err)
34+
}
35+
log.Printf("[Model Experiments] Triggered creation of Model Experiments Instance with ID: %q.\n", createInstanceResp.Instance.Id)
36+
37+
// Wait for the Model Experiments Instance to be ready
38+
log.Printf("[Model Experiments] Waiting for Model Experiments Instance to be created.\n")
39+
_, err = wait.CreateInstanceWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, createInstanceResp.Instance.Id).WaitWithContext(ctx)
40+
if err != nil {
41+
log.Fatalf("[Model Experiments] Error when waiting for creation: %v\n", err)
42+
}
43+
log.Printf("[Model Experiments] Model Experiments Instance %q has been successfully created.\n", createInstanceResp.Instance.Id)
44+
45+
// Get the created Model Experiments Instance
46+
log.Printf("[Model Experiments] Retrieving Model Experiments Instance.\n")
47+
getInstanceResp, err := modelexperimentsClient.DefaultAPI.GetInstance(ctx, projectId, region, createInstanceResp.Instance.Id).Execute()
48+
if err != nil {
49+
log.Fatalf("[Model Experiments] Error when calling `GetInstance`: %v\n", err)
50+
}
51+
log.Printf("[Model Experiments] Retrieved Model Experiments Instance with ID: %q and display name: %q\n", getInstanceResp.Instance.Id, getInstanceResp.Instance.Name)
52+
53+
// List Model Experiments Instances
54+
log.Printf("[Model Experiments] Listing Model Experiments Instances.\n")
55+
listInstanceResp, err := modelexperimentsClient.DefaultAPI.ListInstances(ctx, projectId, region).Execute()
56+
if err != nil {
57+
log.Fatalf("[Model Experiments] Error when calling `ListInstances`: %v\n", err)
58+
}
59+
log.Printf("[Model Experiments] Retrieved %d instances\n", len(listInstanceResp.Instances))
60+
61+
// Update a Model Experiments Instance
62+
log.Printf("[Model Experiments] Updating Model Experiments Instance.\n")
63+
partialUpdateInstancePayload := modelexperiments.PartialUpdateInstancePayload{
64+
Name: &newInstanceName,
65+
}
66+
partialUpdateInstanceResp, err := modelexperimentsClient.DefaultAPI.PartialUpdateInstance(ctx, projectId, region, getInstanceResp.Instance.Id).PartialUpdateInstancePayload(partialUpdateInstancePayload).Execute()
67+
if err != nil {
68+
log.Fatalf("[Model Experiments] Error when calling `PartialUpdateInstance`: %v\n", err)
69+
}
70+
log.Printf("[Model Experiments] Updated Model Experiments Instance with ID: %q and display name: %q\n", partialUpdateInstanceResp.Instance.Id, partialUpdateInstanceResp.Instance.Name)
71+
72+
// Create a Model Experiments Instance Token
73+
log.Printf("[Model Experiments] Creating Model Experiments Instance Token.\n")
74+
createTokenPayload := modelexperiments.CreateInstanceTokenPayload{
75+
Name: "token-name",
76+
}
77+
createTokenResp, err := modelexperimentsClient.DefaultAPI.CreateInstanceToken(ctx, projectId, region, createInstanceResp.Instance.Id).CreateInstanceTokenPayload(createTokenPayload).Execute()
78+
if err != nil {
79+
log.Fatalf("[Model Experiments] Error when calling `CreateToken`: %v\n", err)
80+
}
81+
log.Printf("[Model Experiments] Triggered creation of Model Experiments Instance Token: %+v\n", createTokenResp.Token)
82+
83+
// Wait for the Model Experiments Instance Token to be ready
84+
log.Printf("[Model Experiments] Waiting for Model Experiments Instance Token to be created.\n")
85+
_, err = wait.CreateInstanceTokenWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, getInstanceResp.Instance.Id, createTokenResp.Token.Id).WaitWithContext(ctx)
86+
if err != nil {
87+
log.Fatalf("[Model Experiments] Error when waiting for creation: %v\n", err)
88+
}
89+
log.Printf("[Model Experiments] Model Experiments Instance Token %q has been successfully created.\n", createTokenResp.Token.Id)
90+
91+
// Get the created Model Experiments Instance Token
92+
log.Printf("[Model Experiments] Retrieving Model Experiments Instance Token.\n")
93+
getTokenResp, err := modelexperimentsClient.DefaultAPI.GetInstanceToken(ctx, projectId, region, createTokenResp.Token.Id, getInstanceResp.Instance.Id).Execute()
94+
if err != nil {
95+
log.Fatalf("[Model Experiments] Error when calling `GetInstanceToken`: %v\n", err)
96+
}
97+
log.Printf("[Model Experiments] Retrieved Model Experiments Instance Token with ID: %q and display name: %q\n", getTokenResp.Token.Id, getTokenResp.Token.Name)
98+
99+
// List Model Experiments Instance Tokens
100+
log.Printf("[Model Experiments] Listing Model Experiments Instance Tokens.\n")
101+
listTokenResp, err := modelexperimentsClient.DefaultAPI.ListInstanceTokens(ctx, projectId, region, getInstanceResp.Instance.Id).Execute()
102+
if err != nil {
103+
log.Fatalf("[Model Experiments] Error when calling `ListInstanceTokens`: %v\n", err)
104+
}
105+
log.Printf("[Model Experiments] Retrieved %d Instance tokens\n", len(listTokenResp.Tokens))
106+
107+
// Update a Model Experiments Instance Token
108+
log.Printf("[Model Experiments] Updating Model Experiments Instance Token.\n")
109+
partialUpdateInstanceTokenPayload := modelexperiments.PartialUpdateInstanceTokenPayload{
110+
Name: &newTokenName,
111+
}
112+
partialUpdateTokenResp, err := modelexperimentsClient.DefaultAPI.PartialUpdateInstanceToken(ctx, projectId, region, getTokenResp.Token.Id, getInstanceResp.Instance.Id).PartialUpdateInstanceTokenPayload(partialUpdateInstanceTokenPayload).Execute()
113+
if err != nil {
114+
log.Fatalf("[Model Experiments] Error when calling `PartialUpdateInstanceToken`: %v\n", err)
115+
}
116+
log.Printf("[Model Experiments] Updated Model Experiments Instance Token with ID: %q and display name: %q\n", partialUpdateTokenResp.Token.Id, partialUpdateTokenResp.Token.Name)
117+
118+
// Delete a Model Experiments Instance Token
119+
log.Printf("[Model Experiments] Deleting Model Experiments Instance Token.\n")
120+
deleteTokenResp, err := modelexperimentsClient.DefaultAPI.DeleteInstanceToken(ctx, projectId, region, getTokenResp.Token.Id, getInstanceResp.Instance.Id).Execute()
121+
if err != nil {
122+
log.Fatalf("[Model Experiments] Error when calling `DeleteInstanceToken`: %v\n", err)
123+
}
124+
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)
125+
126+
// Wait for the Model Experiments Instance Token to be deleted
127+
log.Printf("[Model Experiments] Waiting for Model Experiments Instance Token to be deleted.\n")
128+
_, err = wait.DeleteInstanceTokenWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, getInstanceResp.Instance.Id, deleteTokenResp.Token.Id).WaitWithContext(ctx)
129+
if err != nil {
130+
log.Fatalf("[Model Experiments] Error when waiting for deletion: %v\n", err)
131+
}
132+
log.Printf("[Model Experiments] Model Experiments Instance Token %q has been successfully deleted.\n", deleteTokenResp.Token.Id)
133+
134+
// Delete a Model Experiments Instance
135+
log.Printf("[Model Experiments] Deleting Model Experiments Instance.\n")
136+
deleteInstanceResp, err := modelexperimentsClient.DefaultAPI.DeleteInstance(ctx, projectId, region, getInstanceResp.Instance.Id).Execute()
137+
if err != nil {
138+
log.Fatalf("[Model Experiments] Error when calling `DeleteInstance`: %v\n", err)
139+
}
140+
log.Printf("[Model Experiments] Triggered deletion of Model Experiments Instance with ID: %q and display name: %q\n", deleteInstanceResp.Instance.Id, deleteInstanceResp.Instance.Name)
141+
142+
// Wait for the Model Experiments Instance to be deleted
143+
log.Printf("[Model Experiments] Waiting for Model Experiments Instance to be deleted.\n")
144+
_, err = wait.DeleteInstanceWaitHandler(ctx, modelexperimentsClient.DefaultAPI, region, projectId, getInstanceResp.Instance.Id).WaitWithContext(ctx)
145+
if err != nil {
146+
log.Fatalf("[Model Experiments] Error when waiting for deletion: %v\n", err)
147+
}
148+
log.Printf("[Model Experiments] Model Experiments Instance %q has been successfully deleted.\n", deleteInstanceResp.Instance.Id)
149+
}

go.work

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use (
2020
./examples/logs
2121
./examples/mariadb
2222
./examples/middleware
23+
./examples/modelexperiments
2324
./examples/mongodbflex
2425
./examples/objectstorage
2526
./examples/observability
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
1+
## v0.2.0
2+
- **New**: STACKIT Model Experiments module wait handler added.
3+
14
## v0.1.0
25
- **New**: API for STACKIT modelexperiments
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
STACKIT modelexperiments SDK for Go
1+
STACKIT Model Experiments SDK for Go
22
Copyright 2026 Schwarz IT KG

services/modelexperiments/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v0.1.0
1+
v0.2.0

services/modelexperiments/go.mod

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ module github.com/stackitcloud/stackit-sdk-go/services/modelexperiments
22

33
go 1.25
44

5-
require github.com/stackitcloud/stackit-sdk-go/core v0.26.0
5+
require (
6+
github.com/google/go-cmp v0.7.0
7+
github.com/stackitcloud/stackit-sdk-go/core v0.26.0
8+
)
69

710
require (
811
github.com/golang-jwt/jwt/v5 v5.3.1 // indirect
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package wait
2+
3+
import (
4+
"context"
5+
"errors"
6+
"net/http"
7+
"time"
8+
9+
"github.com/stackitcloud/stackit-sdk-go/core/wait"
10+
modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api"
11+
)
12+
13+
// CreateInstanceWaitHandler will wait for creation of Model Experiments instance
14+
func CreateInstanceWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceResponse] {
15+
waitConfig := wait.WaiterHelper[modelexperiments.GetInstanceResponse, modelexperiments.InstanceState]{
16+
FetchInstance: a.GetInstance(ctx, projectId, region, instanceId).Execute,
17+
GetState: func(response *modelexperiments.GetInstanceResponse) (modelexperiments.InstanceState, error) {
18+
if response == nil {
19+
return "", errors.New("empty response")
20+
}
21+
return response.Instance.State, nil
22+
},
23+
ActiveState: []modelexperiments.InstanceState{modelexperiments.INSTANCESTATE_ACTIVE},
24+
ErrorState: []modelexperiments.InstanceState{modelexperiments.INSTANCESTATE_IMPAIRED},
25+
}
26+
27+
handler := wait.New(waitConfig.Wait())
28+
handler.SetTimeout(45 * time.Minute)
29+
return handler
30+
}
31+
32+
// DeleteInstanceWaitHandler will wait for deletion of Model Experiments instance
33+
func DeleteInstanceWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceResponse] {
34+
waitConfig := wait.WaiterHelper[modelexperiments.GetInstanceResponse, modelexperiments.InstanceState]{
35+
FetchInstance: a.GetInstance(ctx, projectId, region, instanceId).Execute,
36+
GetState: func(response *modelexperiments.GetInstanceResponse) (modelexperiments.InstanceState, error) {
37+
if response == nil {
38+
return "", errors.New("empty response")
39+
}
40+
return response.Instance.State, nil
41+
},
42+
ErrorState: []modelexperiments.InstanceState{modelexperiments.INSTANCESTATE_IMPAIRED},
43+
DeleteHttpErrorStatusCodes: []int{http.StatusNotFound},
44+
}
45+
46+
handler := wait.New(waitConfig.Wait())
47+
handler.SetTimeout(45 * time.Minute)
48+
return handler
49+
}
50+
51+
// CreateInstanceTokenWaitHandler will wait for creation of Model Experiments instance token
52+
func CreateInstanceTokenWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId, tokenId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceTokenResponse] {
53+
waitConfig := wait.WaiterHelper[modelexperiments.GetInstanceTokenResponse, modelexperiments.TokenState]{
54+
FetchInstance: a.GetInstanceToken(ctx, projectId, region, tokenId, instanceId).Execute,
55+
GetState: func(response *modelexperiments.GetInstanceTokenResponse) (modelexperiments.TokenState, error) {
56+
if response == nil {
57+
return "", errors.New("empty response")
58+
}
59+
return response.Token.State, nil
60+
},
61+
ActiveState: []modelexperiments.TokenState{modelexperiments.TOKENSTATE_ACTIVE},
62+
ErrorState: []modelexperiments.TokenState{},
63+
}
64+
65+
handler := wait.New(waitConfig.Wait())
66+
handler.SetTimeout(45 * time.Minute)
67+
return handler
68+
}
69+
70+
// DeleteInstanceTokenWaitHandler will wait for deletion of Model Experiments instance token
71+
func DeleteInstanceTokenWaitHandler(ctx context.Context, a modelexperiments.DefaultAPI, region, projectId, instanceId, tokenId string) *wait.AsyncActionHandler[modelexperiments.GetInstanceTokenResponse] {
72+
waitConfig := wait.WaiterHelper[modelexperiments.GetInstanceTokenResponse, modelexperiments.TokenState]{
73+
FetchInstance: a.GetInstanceToken(ctx, projectId, region, tokenId, instanceId).Execute,
74+
GetState: func(response *modelexperiments.GetInstanceTokenResponse) (modelexperiments.TokenState, error) {
75+
if response == nil {
76+
return "", errors.New("empty response")
77+
}
78+
return response.Token.State, nil
79+
},
80+
DeleteHttpErrorStatusCodes: []int{http.StatusNotFound},
81+
}
82+
83+
handler := wait.New(waitConfig.Wait())
84+
handler.SetTimeout(45 * time.Minute)
85+
return handler
86+
}

0 commit comments

Comments
 (0)