fix: sqlserver beta fixes
Some checks failed
CI Workflow / Check GoReleaser config (pull_request) Successful in 5s
CI Workflow / CI (pull_request) Failing after 20m46s
CI Workflow / Code coverage report (pull_request) Has been skipped
CI Workflow / Test readiness for publishing provider (pull_request) Successful in 45m27s

This commit is contained in:
Marcel S. Henselin 2026-02-12 12:41:11 +01:00
parent 131e1700bb
commit 2a1b047de6
9 changed files with 291 additions and 35 deletions

View file

@ -45,6 +45,22 @@ type APIClientInterface interface {
instanceId string,
userId int64,
) (*sqlserverflex.GetUserResponse, error)
ListRolesRequestExecute(
ctx context.Context,
projectId string,
region string,
instanceId string,
) (*sqlserverflex.ListRolesResponse, error)
ListUsersRequest(ctx context.Context, projectId string, region string, instanceId string) sqlserverflex.ApiListUsersRequestRequest
ListUsersRequestExecute(
ctx context.Context,
projectId string,
region string,
instanceId string,
) (*sqlserverflex.ListUserResponse, error)
}
// APIClientUserInterface Interface needed for tests
@ -85,6 +101,54 @@ func CreateInstanceWaitHandler(
return false, nil, nil
}
}
tflog.Info(ctx, "trying to get roles")
time.Sleep(10 * time.Second)
_, rolesErr := a.ListRolesRequestExecute(ctx, projectId, region, instanceId)
if rolesErr != nil {
var oapiErr *oapierror.GenericOpenAPIError
ok := errors.As(rolesErr, &oapiErr)
if !ok {
return false, nil, fmt.Errorf("could not convert error to oapierror.GenericOpenAPIError")
}
if oapiErr.StatusCode != http.StatusInternalServerError {
tflog.Info(
ctx, "got error from api", map[string]interface{}{
"error": rolesErr.Error(),
},
)
return false, nil, rolesErr
}
tflog.Info(
ctx, "wait for get-roles to work hack", map[string]interface{}{},
)
time.Sleep(10 * time.Second)
return false, nil, nil
}
tflog.Info(ctx, "trying to get users")
time.Sleep(10 * time.Second)
_, usersErr := a.ListUsersRequestExecute(ctx, projectId, region, instanceId)
if usersErr != nil {
var oapiErr *oapierror.GenericOpenAPIError
ok := errors.As(usersErr, &oapiErr)
if !ok {
return false, nil, fmt.Errorf("could not convert error to oapierror.GenericOpenAPIError")
}
if oapiErr.StatusCode != http.StatusInternalServerError {
tflog.Info(
ctx, "got error from api", map[string]interface{}{
"error": rolesErr.Error(),
},
)
return false, nil, usersErr
}
tflog.Info(
ctx, "wait for get-users to work hack", map[string]interface{}{},
)
time.Sleep(10 * time.Second)
return false, nil, nil
}
return true, s, nil
case strings.ToLower(InstanceStateUnknown), strings.ToLower(InstanceStateFailed):
return true, s, fmt.Errorf("create failed for instance with id %s", instanceId)
@ -94,6 +158,7 @@ func CreateInstanceWaitHandler(
"status": *s.Status,
},
)
time.Sleep(10 * time.Second)
return false, nil, nil
default:
tflog.Info(
@ -187,20 +252,96 @@ func CreateDatabaseWaitHandler(
func() (waitFinished bool, response *sqlserverflex.GetDatabaseResponse, err error) {
s, err := a.GetDatabaseRequestExecute(ctx, projectId, region, instanceId, databaseName)
if err != nil {
return false, nil, err
}
if s == nil || s.Name == nil || *s.Name != databaseName {
var oapiErr *oapierror.GenericOpenAPIError
ok := errors.As(err, &oapiErr)
if !ok {
return false, nil, fmt.Errorf("get database - could not convert error to oapierror.GenericOpenAPIError: %s", err.Error())
}
if oapiErr.StatusCode != http.StatusNotFound {
return false, nil, err
}
return false, nil, nil
}
var oapiErr *oapierror.GenericOpenAPIError
ok := errors.As(err, &oapiErr)
if s == nil || s.Name == nil || *s.Name != databaseName {
return false, nil, errors.New("response did return different result")
}
return true, s, nil
},
)
return handler
}
// CreateUserWaitHandler will wait for instance creation
func CreateUserWaitHandler(
ctx context.Context,
a APIClientInterface,
projectId, instanceId, region string,
userId int64,
) *wait.AsyncActionHandler[sqlserverflex.GetUserResponse] {
handler := wait.New(
func() (waitFinished bool, response *sqlserverflex.GetUserResponse, err error) {
s, err := a.GetUserRequestExecute(ctx, projectId, region, instanceId, userId)
if err != nil {
var oapiErr *oapierror.GenericOpenAPIError
ok := errors.As(err, &oapiErr)
if !ok {
return false, nil, fmt.Errorf("could not convert error to oapierror.GenericOpenAPIError")
}
if oapiErr.StatusCode != http.StatusNotFound {
return false, nil, err
}
return false, nil, nil
}
return true, s, nil
},
)
return handler
}
// WaitForUserWaitHandler will wait for instance creation
func WaitForUserWaitHandler(
ctx context.Context,
a APIClientInterface,
projectId, instanceId, region, userName string,
) *wait.AsyncActionHandler[sqlserverflex.ListUserResponse] {
startTime := time.Now()
timeOut := 2 * time.Minute
handler := wait.New(
func() (waitFinished bool, response *sqlserverflex.ListUserResponse, err error) {
if time.Since(startTime) > timeOut {
return false, nil, errors.New("ran into timeout")
}
s, err := a.ListUsersRequest(ctx, projectId, region, instanceId).Size(100).Execute()
if err != nil {
var oapiErr *oapierror.GenericOpenAPIError
ok := errors.As(err, &oapiErr)
if !ok {
return false, nil, fmt.Errorf("Wait (list users) could not convert error to oapierror.GenericOpenAPIError: %s", err.Error())
}
if oapiErr.StatusCode != http.StatusNotFound {
return false, nil, err
}
tflog.Info(
ctx, "Wait (list users) still waiting", map[string]interface{}{},
)
return false, nil, nil
}
users, ok := s.GetUsersOk()
if !ok {
return false, nil, fmt.Errorf("could not convert error to oapierror.GenericOpenAPIError")
return false, nil, errors.New("no users found")
}
if oapiErr.StatusCode != http.StatusNotFound {
return false, nil, err
for _, u := range users {
if u.GetUsername() == userName {
return true, s, nil
}
}
return true, nil, nil
tflog.Info(
ctx, "Wait (list users) user still not present", map[string]interface{}{},
)
return false, nil, nil
},
)
return handler
@ -209,13 +350,13 @@ func CreateDatabaseWaitHandler(
// DeleteUserWaitHandler will wait for instance deletion
func DeleteUserWaitHandler(
ctx context.Context,
a APIClientUserInterface,
projectId, instanceId, region string,
a APIClientInterface,
projectId, region, instanceId string,
userId int64,
) *wait.AsyncActionHandler[struct{}] {
handler := wait.New(
func() (waitFinished bool, response *struct{}, err error) {
err = a.DeleteUserRequestExecute(ctx, projectId, region, instanceId, userId)
_, err = a.GetUserRequestExecute(ctx, projectId, region, instanceId, userId)
if err == nil {
return false, nil, nil
}
@ -228,9 +369,6 @@ func DeleteUserWaitHandler(
switch oapiErr.StatusCode {
case http.StatusNotFound:
return true, nil, nil
case http.StatusInternalServerError:
tflog.Warn(ctx, "Wait handler got error 500")
return false, nil, nil
default:
return false, nil, err
}