Skip to content

Commit cc4f335

Browse files
otherchenAndrew Chen
and
Andrew Chen
authored
Handle TF drift more gracefully for ti_resource_group and ti_resource_group_assignment (#5)
[This article](https://www.hashicorp.com/blog/writing-custom-terraform-providers) provides a good initial explanation of the expected behaviors of the different CRUD methods for a resource. In it, it mentions that the `Read` method should be able to gracefully handle when the resource no longer exists (probably due to manual deletion). I also fixed a bug where `resourceGroup` was supposed to be `resource_group` and also modified `petoju` --> `zph` in certain places. This makes error logs a bit more clear. --------- Co-authored-by: Andrew Chen <andrewchen@plaid.com>
1 parent 9534065 commit cc4f335

File tree

4 files changed

+32
-14
lines changed

4 files changed

+32
-14
lines changed

Diff for: go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module github.com/petoju/terraform-provider-mysql/v3
1+
module github.com/zph/terraform-provider-mysql/v3
22

33
require (
44
cloud.google.com/go/cloudsqlconn v1.11.0

Diff for: main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package main
22

33
import (
44
"github.com/hashicorp/terraform-plugin-sdk/v2/plugin"
5-
"github.com/petoju/terraform-provider-mysql/v3/mysql"
5+
"github.com/zph/terraform-provider-mysql/v3/mysql"
66
)
77

88
func main() {

Diff for: mysql/resource_ti_resource_group.go

+12-8
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"database/sql"
66
"errors"
77
"fmt"
8+
"log"
89
"strings"
910

1011
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
@@ -172,12 +173,14 @@ func ReadResourceGroup(ctx context.Context, d *schema.ResourceData, meta interfa
172173
return diag.Errorf("error during get resource group (%s): %s", d.Id(), err)
173174
}
174175

175-
if err != nil {
176+
// If we're not able to find the resource group, assume that there's terraform
177+
// diff and allow terraform to recreate it instead of throwing an error.
178+
if rg == nil {
176179
d.SetId("")
177-
return diag.Errorf(`error converting burstable value from tidb %e`, err)
180+
return nil
178181
}
179182

180-
setResourceGroupOnResourceData(rg, d)
183+
setResourceGroupOnResourceData(*rg, d)
181184
return nil
182185
}
183186

@@ -188,7 +191,7 @@ func DeleteResourceGroup(ctx context.Context, d *schema.ResourceData, meta inter
188191
if err != nil {
189192
return diag.FromErr(err)
190193
}
191-
// TODO: check for users assigned as safety? and assert zero?
194+
192195
deleteQuery := fmt.Sprintf("DROP RESOURCE GROUP IF EXISTS %s", name)
193196
_, err = db.Exec(deleteQuery)
194197
if err != nil && !errors.Is(err, sql.ErrNoRows) {
@@ -199,7 +202,7 @@ func DeleteResourceGroup(ctx context.Context, d *schema.ResourceData, meta inter
199202
return nil
200203
}
201204

202-
func getResourceGroupFromDB(db *sql.DB, name string) (ResourceGroup, error) {
205+
func getResourceGroupFromDB(db *sql.DB, name string) (*ResourceGroup, error) {
203206
rg := ResourceGroup{Name: name}
204207

205208
/*
@@ -216,12 +219,13 @@ func getResourceGroupFromDB(db *sql.DB, name string) (ResourceGroup, error) {
216219

217220
err := db.QueryRow(query, name).Scan(&rg.Name, &rg.ResourceUnits, &rg.Priority, &rg.Burstable, &rg.QueryLimit)
218221
if errors.Is(err, sql.ErrNoRows) {
219-
return ResourceGroup{}, fmt.Errorf("resource group doesn't exist (%s): %s", name, err)
222+
log.Printf("[DEBUG] resource group doesn't exist (%s): %s", name, err)
223+
return nil, nil
220224
} else if err != nil {
221-
return ResourceGroup{}, fmt.Errorf("error during get resource group (%s): %s", name, err)
225+
return nil, fmt.Errorf("error during get resource group (%s): %s", name, err)
222226
}
223227

224-
return rg, nil
228+
return &rg, nil
225229
}
226230

227231
func NewResourceGroupFromResourceData(d *schema.ResourceData) ResourceGroup {

Diff for: mysql/resource_ti_resource_group_user_assignment.go

+18-4
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,15 @@ func CreateOrUpdateResourceGroupUser(ctx context.Context, d *schema.ResourceData
4848
var warnLevel, warnMessage string
4949
var warnCode int = 0
5050

51-
_, _, err = readUserFromDB(db, user)
51+
currentUser, _, err := readUserFromDB(db, user)
5252
if err != nil {
5353
d.SetId("")
54-
return diag.Errorf(`must create user first before assigning to resource group | getting user %s | error %s`, user, err)
54+
return diag.Errorf(`error during get user (%s): %s`, user, err)
55+
}
56+
57+
if currentUser == "" {
58+
d.SetId("")
59+
return diag.Errorf(`must create user first before assigning to resource group | getting user %s | error %s`, currentUser, err)
5560
}
5661

5762
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
8893
return diag.Errorf(`error getting user %s`, err)
8994
}
9095

96+
// If the user doesn't exist, instead of erroring, recognize that there's
97+
// terraform drift and attempt to create the assignment again.
98+
if user == "" {
99+
d.SetId("")
100+
return nil
101+
}
102+
91103
d.Set("user", user)
92-
d.Set("resourceGroup", resourceGroup)
104+
d.Set("resource_group", resourceGroup)
93105

94106
return nil
95107
}
@@ -102,6 +114,7 @@ func DeleteResourceGroupUser(ctx context.Context, d *schema.ResourceData, meta i
102114
if err != nil {
103115
return diag.FromErr(err)
104116
}
117+
105118
deleteQuery := fmt.Sprintf("ALTER USER `%s` RESOURCE GROUP `default`", user)
106119
_, err = db.Exec(deleteQuery)
107120
if err != nil && !errors.Is(err, sql.ErrNoRows) {
@@ -120,7 +133,8 @@ func readUserFromDB(db *sql.DB, name string) (string, string, error) {
120133

121134
err := row.Scan(&user, &resourceGroup)
122135
if errors.Is(err, sql.ErrNoRows) {
123-
return "", "", sql.ErrNoRows
136+
log.Printf("[DEBUG] resource group doesn't exist (%s): %s", name, err)
137+
return "", "", nil
124138
} else if err != nil {
125139
return "", "", fmt.Errorf(`error fetching user %e`, err)
126140
}

0 commit comments

Comments
 (0)