diff --git a/go.mod b/go.mod index ee426e4c..03090884 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/petoju/terraform-provider-mysql/v3 +module github.com/zph/terraform-provider-mysql/v3 require ( cloud.google.com/go/cloudsqlconn v1.11.0 diff --git a/main.go b/main.go index ec777fb3..505f71e6 100644 --- a/main.go +++ b/main.go @@ -2,7 +2,7 @@ package main import ( "github.com/hashicorp/terraform-plugin-sdk/v2/plugin" - "github.com/petoju/terraform-provider-mysql/v3/mysql" + "github.com/zph/terraform-provider-mysql/v3/mysql" ) func main() { diff --git a/mysql/resource_ti_resource_group.go b/mysql/resource_ti_resource_group.go index b7783b98..8234f64a 100644 --- a/mysql/resource_ti_resource_group.go +++ b/mysql/resource_ti_resource_group.go @@ -5,6 +5,7 @@ import ( "database/sql" "errors" "fmt" + "log" "strings" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" @@ -172,12 +173,14 @@ func ReadResourceGroup(ctx context.Context, d *schema.ResourceData, meta interfa return diag.Errorf("error during get resource group (%s): %s", d.Id(), err) } - if err != nil { + // If we're not able to find the resource group, assume that there's terraform + // diff and allow terraform to recreate it instead of throwing an error. + if rg == nil { d.SetId("") - return diag.Errorf(`error converting burstable value from tidb %e`, err) + return nil } - setResourceGroupOnResourceData(rg, d) + setResourceGroupOnResourceData(*rg, d) return nil } @@ -188,7 +191,7 @@ func DeleteResourceGroup(ctx context.Context, d *schema.ResourceData, meta inter if err != nil { return diag.FromErr(err) } - // TODO: check for users assigned as safety? and assert zero? + deleteQuery := fmt.Sprintf("DROP RESOURCE GROUP IF EXISTS %s", name) _, err = db.Exec(deleteQuery) if err != nil && !errors.Is(err, sql.ErrNoRows) { @@ -199,7 +202,7 @@ func DeleteResourceGroup(ctx context.Context, d *schema.ResourceData, meta inter return nil } -func getResourceGroupFromDB(db *sql.DB, name string) (ResourceGroup, error) { +func getResourceGroupFromDB(db *sql.DB, name string) (*ResourceGroup, error) { rg := ResourceGroup{Name: name} /* @@ -216,12 +219,13 @@ func getResourceGroupFromDB(db *sql.DB, name string) (ResourceGroup, error) { err := db.QueryRow(query, name).Scan(&rg.Name, &rg.ResourceUnits, &rg.Priority, &rg.Burstable, &rg.QueryLimit) if errors.Is(err, sql.ErrNoRows) { - return ResourceGroup{}, fmt.Errorf("resource group doesn't exist (%s): %s", name, err) + log.Printf("[DEBUG] resource group doesn't exist (%s): %s", name, err) + return nil, nil } else if err != nil { - return ResourceGroup{}, fmt.Errorf("error during get resource group (%s): %s", name, err) + return nil, fmt.Errorf("error during get resource group (%s): %s", name, err) } - return rg, nil + return &rg, nil } func NewResourceGroupFromResourceData(d *schema.ResourceData) ResourceGroup { diff --git a/mysql/resource_ti_resource_group_user_assignment.go b/mysql/resource_ti_resource_group_user_assignment.go index df703b28..03c3f4ac 100644 --- a/mysql/resource_ti_resource_group_user_assignment.go +++ b/mysql/resource_ti_resource_group_user_assignment.go @@ -48,10 +48,15 @@ func CreateOrUpdateResourceGroupUser(ctx context.Context, d *schema.ResourceData var warnLevel, warnMessage string var warnCode int = 0 - _, _, err = readUserFromDB(db, user) + currentUser, _, err := readUserFromDB(db, user) if err != nil { d.SetId("") - return diag.Errorf(`must create user first before assigning to resource group | getting user %s | error %s`, user, err) + return diag.Errorf(`error during get user (%s): %s`, user, err) + } + + if currentUser == "" { + d.SetId("") + return diag.Errorf(`must create user first before assigning to resource group | getting user %s | error %s`, currentUser, err) } sql := fmt.Sprintf("ALTER USER `%s` RESOURCE GROUP `%s`", user, resourceGroup) @@ -88,8 +93,15 @@ func ReadResourceGroupUser(ctx context.Context, d *schema.ResourceData, meta int return diag.Errorf(`error getting user %s`, err) } + // If the user doesn't exist, instead of erroring, recognize that there's + // terraform drift and attempt to create the assignment again. + if user == "" { + d.SetId("") + return nil + } + d.Set("user", user) - d.Set("resourceGroup", resourceGroup) + d.Set("resource_group", resourceGroup) return nil } @@ -102,6 +114,7 @@ func DeleteResourceGroupUser(ctx context.Context, d *schema.ResourceData, meta i if err != nil { return diag.FromErr(err) } + deleteQuery := fmt.Sprintf("ALTER USER `%s` RESOURCE GROUP `default`", user) _, err = db.Exec(deleteQuery) if err != nil && !errors.Is(err, sql.ErrNoRows) { @@ -120,7 +133,8 @@ func readUserFromDB(db *sql.DB, name string) (string, string, error) { err := row.Scan(&user, &resourceGroup) if errors.Is(err, sql.ErrNoRows) { - return "", "", sql.ErrNoRows + log.Printf("[DEBUG] resource group doesn't exist (%s): %s", name, err) + return "", "", nil } else if err != nil { return "", "", fmt.Errorf(`error fetching user %e`, err) }