diff --git a/google/resource_sql_database_instance.go b/google/resource_sql_database_instance.go index 2b4bb5b9..f92e3a8c 100644 --- a/google/resource_sql_database_instance.go +++ b/google/resource_sql_database_instance.go @@ -230,6 +230,12 @@ func resourceSqlDatabaseInstance() *schema.Resource { Optional: true, Default: "SYNCHRONOUS", }, + "user_labels": &schema.Schema{ + Type: schema.TypeMap, + Optional: true, + Elem: &schema.Schema{Type: schema.TypeString}, + Set: schema.HashString, + }, }, }, }, @@ -599,6 +605,10 @@ func resourceSqlDatabaseInstanceCreate(d *schema.ResourceData, meta interface{}) settings.ReplicationType = v.(string) } + if v, ok := _settings["user_labels"]; ok { + settings.UserLabels = convertStringMap(v.(map[string]interface{})) + } + instance := &sqladmin.DatabaseInstance{ Region: region, Settings: settings, @@ -1031,6 +1041,10 @@ func resourceSqlDatabaseInstanceUpdate(d *schema.ResourceData, meta interface{}) settings.ReplicationType = v.(string) } + if v, ok := _settings["user_labels"]; ok { + settings.UserLabels = convertStringMap(v.(map[string]interface{})) + } + instance.Settings = settings } @@ -1083,6 +1097,7 @@ func flattenSettings(settings *sqladmin.Settings) []map[string]interface{} { "disk_size": settings.DataDiskSizeGb, "pricing_plan": settings.PricingPlan, "replication_type": settings.ReplicationType, + "user_labels": settings.UserLabels, } if settings.BackupConfiguration != nil { @@ -1109,6 +1124,10 @@ func flattenSettings(settings *sqladmin.Settings) []map[string]interface{} { data["disk_autoresize"] = *settings.StorageAutoResize } + if settings.UserLabels != nil { + data["user_labels"] = settings.UserLabels + } + return []map[string]interface{}{data} } diff --git a/google/resource_sql_database_instance_test.go b/google/resource_sql_database_instance_test.go index b1e3ae06..a15e2b13 100644 --- a/google/resource_sql_database_instance_test.go +++ b/google/resource_sql_database_instance_test.go @@ -521,6 +521,43 @@ func TestAccSqlDatabaseInstance_multipleOperations(t *testing.T) { }) } +func TestAccSqlDatabaseInstance_basic_with_user_labels(t *testing.T) { + t.Parallel() + + var instance sqladmin.DatabaseInstance + databaseID := acctest.RandInt() + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccSqlDatabaseInstanceDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: fmt.Sprintf( + testGoogleSqlDatabaseInstance_basic_with_user_labels, databaseID), + Check: resource.ComposeTestCheckFunc( + testAccCheckGoogleSqlDatabaseInstanceExists( + "google_sql_database_instance.instance", &instance), + testAccCheckGoogleSqlDatabaseInstanceEquals( + "google_sql_database_instance.instance", &instance), + testAccCheckGoogleSqlDatabaseRootUserDoesNotExist( + &instance), + ), + }, + resource.TestStep{ + Config: fmt.Sprintf( + testGoogleSqlDatabaseInstance_basic_with_user_labels_update, databaseID), + Check: resource.ComposeTestCheckFunc( + testAccCheckGoogleSqlDatabaseInstanceExists( + "google_sql_database_instance.instance", &instance), + testAccCheckGoogleSqlDatabaseInstanceEquals( + "google_sql_database_instance.instance", &instance), + ), + }, + }, + }) +} + func testAccCheckGoogleSqlDatabaseInstanceEquals(n string, instance *sqladmin.DatabaseInstance) resource.TestCheckFunc { return func(s *terraform.State) error { @@ -693,6 +730,22 @@ func testAccCheckGoogleSqlDatabaseInstanceEquals(n string, return fmt.Errorf("Error settings.pricing_plan mismatch, (%s, %s)", server, local) } + if instance.Settings.UserLabels != nil { + server := instance.Settings.UserLabels["location"] + local = attributes["settings.0.user_labels.location"] + + if server != local { + return fmt.Errorf("Error settings.user_labels.location mismatch, (%s, %s)", server, local) + } + + server = instance.Settings.UserLabels["track"] + local = attributes["settings.0.user_labels.track"] + + if server != local { + return fmt.Errorf("Error settings.user_labels.track mismatch, (%s, %s)", server, local) + } + } + if instance.ReplicaConfiguration != nil { server = strconv.FormatBool(instance.ReplicaConfiguration.FailoverTarget) local = attributes["replica_configuration.0.failover_target"] @@ -1064,3 +1117,29 @@ resource "google_sql_user" "user" { password = "hunter2" } ` + +var testGoogleSqlDatabaseInstance_basic_with_user_labels = ` +resource "google_sql_database_instance" "instance" { + name = "tf-lw-%d" + region = "us-central1" + settings { + tier = "db-f1-micro" + user_labels { + track = "production" + location = "western-division" + } + } +} +` +var testGoogleSqlDatabaseInstance_basic_with_user_labels_update = ` +resource "google_sql_database_instance" "instance" { + name = "tf-lw-%d" + region = "us-central1" + settings { + tier = "db-f1-micro" + user_labels { + track = "production" + } + } +} +` diff --git a/website/docs/r/sql_database_instance.html.markdown b/website/docs/r/sql_database_instance.html.markdown index 6c9c18b9..b18f9dbc 100644 --- a/website/docs/r/sql_database_instance.html.markdown +++ b/website/docs/r/sql_database_instance.html.markdown @@ -124,6 +124,8 @@ The required `settings` block supports: * `replication_type` - (Optional) Replication type for this instance, can be one of `ASYNCHRONOUS` or `SYNCHRONOUS`. +* `user_labels` - (Optional) A set of key/value user label pairs to assign to the instance. + The optional `settings.database_flags` sublist supports: * `name` - (Optional) Name of the flag.