Skip to content

Commit b16ef83

Browse files
authored
Merge pull request hashicorp#11590 from evandbrown/google-cloud-sql-pw
providers/google: No default root user for SQL
2 parents 3884c86 + 8600190 commit b16ef83

3 files changed

Lines changed: 84 additions & 1 deletion

File tree

builtin/providers/google/resource_sql_database_instance.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,30 @@ func resourceSqlDatabaseInstanceCreate(d *schema.ResourceData, meta interface{})
526526
return err
527527
}
528528

529-
return resourceSqlDatabaseInstanceRead(d, meta)
529+
err = resourceSqlDatabaseInstanceRead(d, meta)
530+
if err != nil {
531+
return err
532+
}
533+
534+
// If a root user exists with a wildcard ('%') hostname, delete it.
535+
users, err := config.clientSqlAdmin.Users.List(project, instance.Name).Do()
536+
if err != nil {
537+
return fmt.Errorf("Error, attempting to list users associated with instance %s: %s", instance.Name, err)
538+
}
539+
for _, u := range users.Items {
540+
if u.Name == "root" && u.Host == "%" {
541+
op, err = config.clientSqlAdmin.Users.Delete(project, instance.Name, u.Host, u.Name).Do()
542+
if err != nil {
543+
return fmt.Errorf("Error, failed to delete default 'root'@'*' user, but the database was created successfully: %s", err)
544+
}
545+
err = sqladminOperationWait(config, op, "Delete default root User")
546+
if err != nil {
547+
return err
548+
}
549+
}
550+
}
551+
552+
return nil
530553
}
531554

532555
func resourceSqlDatabaseInstanceRead(d *schema.ResourceData, meta interface{}) error {

builtin/providers/google/resource_sql_database_instance_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,30 @@ func TestAccGoogleSqlDatabaseInstance_basic2(t *testing.T) {
6464
})
6565
}
6666

67+
func TestAccGoogleSqlDatabaseInstance_basic3(t *testing.T) {
68+
var instance sqladmin.DatabaseInstance
69+
databaseID := acctest.RandInt()
70+
71+
resource.Test(t, resource.TestCase{
72+
PreCheck: func() { testAccPreCheck(t) },
73+
Providers: testAccProviders,
74+
CheckDestroy: testAccGoogleSqlDatabaseInstanceDestroy,
75+
Steps: []resource.TestStep{
76+
resource.TestStep{
77+
Config: fmt.Sprintf(
78+
testGoogleSqlDatabaseInstance_basic3, databaseID),
79+
Check: resource.ComposeTestCheckFunc(
80+
testAccCheckGoogleSqlDatabaseInstanceExists(
81+
"google_sql_database_instance.instance", &instance),
82+
testAccCheckGoogleSqlDatabaseInstanceEquals(
83+
"google_sql_database_instance.instance", &instance),
84+
testAccCheckGoogleSqlDatabaseRootUserDoesNotExist(
85+
&instance),
86+
),
87+
},
88+
},
89+
})
90+
}
6791
func TestAccGoogleSqlDatabaseInstance_settings_basic(t *testing.T) {
6892
var instance sqladmin.DatabaseInstance
6993
databaseID := acctest.RandInt()
@@ -447,6 +471,27 @@ func testAccGoogleSqlDatabaseInstanceDestroy(s *terraform.State) error {
447471
return nil
448472
}
449473

474+
func testAccCheckGoogleSqlDatabaseRootUserDoesNotExist(
475+
instance *sqladmin.DatabaseInstance) resource.TestCheckFunc {
476+
return func(s *terraform.State) error {
477+
config := testAccProvider.Meta().(*Config)
478+
479+
users, err := config.clientSqlAdmin.Users.List(config.Project, instance.Name).Do()
480+
481+
if err != nil {
482+
return fmt.Errorf("Could not list database users for %q: %s", instance.Name, err)
483+
}
484+
485+
for _, u := range users.Items {
486+
if u.Name == "root" && u.Host == "%" {
487+
return fmt.Errorf("%v@%v user still exists", u.Name, u.Host)
488+
}
489+
}
490+
491+
return nil
492+
}
493+
}
494+
450495
var testGoogleSqlDatabaseInstance_basic = `
451496
resource "google_sql_database_instance" "instance" {
452497
name = "tf-lw-%d"
@@ -467,6 +512,15 @@ resource "google_sql_database_instance" "instance" {
467512
}
468513
}
469514
`
515+
var testGoogleSqlDatabaseInstance_basic3 = `
516+
resource "google_sql_database_instance" "instance" {
517+
name = "tf-lw-%d"
518+
region = "us-central"
519+
settings {
520+
tier = "db-f1-micro"
521+
}
522+
}
523+
`
470524

471525
var testGoogleSqlDatabaseInstance_settings = `
472526
resource "google_sql_database_instance" "instance" {

website/source/docs/providers/google/r/sql_database_instance.html.markdown

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ description: |-
1010

1111
Creates a new Google SQL Database Instance. For more information, see the [official documentation](https://cloud.google.com/sql/), or the [JSON API](https://cloud.google.com/sql/docs/admin-api/v1beta4/instances).
1212

13+
~> **NOTE on `google_sql_database_instance`:** - Second-generation instances include a
14+
default 'root'@'%' user with no password. This user will be deleted by Terraform on
15+
instance creation. You should use a `google_sql_user` to define a customer user with
16+
a restricted host and strong password.
17+
18+
1319
## Example Usage
1420

1521
Example creating a SQL Database.

0 commit comments

Comments
 (0)