mirror of
https://github.com/opentofu/opentofu.git
synced 2025-02-20 11:48:24 -06:00
To aid in tracking down the error that's causing TestAccGoogleSqlDatabaseInstance_basic to fail (it's claiming an op can't be found?) I've added the op name (which is unique) to the error output for op errors.
81 lines
1.8 KiB
Go
81 lines
1.8 KiB
Go
package google
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"log"
|
|
"time"
|
|
|
|
"github.com/hashicorp/terraform/helper/resource"
|
|
"google.golang.org/api/sqladmin/v1beta4"
|
|
)
|
|
|
|
type SqlAdminOperationWaiter struct {
|
|
Service *sqladmin.Service
|
|
Op *sqladmin.Operation
|
|
Project string
|
|
}
|
|
|
|
func (w *SqlAdminOperationWaiter) RefreshFunc() resource.StateRefreshFunc {
|
|
return func() (interface{}, string, error) {
|
|
var op *sqladmin.Operation
|
|
var err error
|
|
|
|
log.Printf("[DEBUG] self_link: %s", w.Op.SelfLink)
|
|
op, err = w.Service.Operations.Get(w.Project, w.Op.Name).Do()
|
|
|
|
if err != nil {
|
|
return nil, "", err
|
|
}
|
|
|
|
log.Printf("[DEBUG] Got %q when asking for operation %q", op.Status, w.Op.Name)
|
|
|
|
return op, op.Status, nil
|
|
}
|
|
}
|
|
|
|
func (w *SqlAdminOperationWaiter) Conf() *resource.StateChangeConf {
|
|
return &resource.StateChangeConf{
|
|
Pending: []string{"PENDING", "RUNNING"},
|
|
Target: []string{"DONE"},
|
|
Refresh: w.RefreshFunc(),
|
|
}
|
|
}
|
|
|
|
// SqlAdminOperationError wraps sqladmin.OperationError and implements the
|
|
// error interface so it can be returned.
|
|
type SqlAdminOperationError sqladmin.OperationErrors
|
|
|
|
func (e SqlAdminOperationError) Error() string {
|
|
var buf bytes.Buffer
|
|
|
|
for _, err := range e.Errors {
|
|
buf.WriteString(err.Message + "\n")
|
|
}
|
|
|
|
return buf.String()
|
|
}
|
|
|
|
func sqladminOperationWait(config *Config, op *sqladmin.Operation, activity string) error {
|
|
w := &SqlAdminOperationWaiter{
|
|
Service: config.clientSqlAdmin,
|
|
Op: op,
|
|
Project: config.Project,
|
|
}
|
|
|
|
state := w.Conf()
|
|
state.Timeout = 10 * time.Minute
|
|
state.MinTimeout = 2 * time.Second
|
|
opRaw, err := state.WaitForState()
|
|
if err != nil {
|
|
return fmt.Errorf("Error waiting for %s (op %s): %s", activity, op.Name, err)
|
|
}
|
|
|
|
op = opRaw.(*sqladmin.Operation)
|
|
if op.Error != nil {
|
|
return SqlAdminOperationError(*op.Error)
|
|
}
|
|
|
|
return nil
|
|
}
|