From 4dad9ff8eea58ba89cf93883ba5a35042fa78e0a Mon Sep 17 00:00:00 2001 From: Scott Suarez Date: Tue, 22 Jun 2021 14:43:18 -0700 Subject: [PATCH 1/3] support binary_logging for replica instances --- .../resource_sql_database_instance.go.erb | 28 +++++++++++++++++++ ...resource_sql_database_instance_test.go.erb | 3 ++ 2 files changed, 31 insertions(+) diff --git a/mmv1/third_party/terraform/resources/resource_sql_database_instance.go.erb b/mmv1/third_party/terraform/resources/resource_sql_database_instance.go.erb index 12e8299572cf..9e87b65eaf29 100644 --- a/mmv1/third_party/terraform/resources/resource_sql_database_instance.go.erb +++ b/mmv1/third_party/terraform/resources/resource_sql_database_instance.go.erb @@ -857,6 +857,19 @@ func resourceSqlDatabaseInstanceCreate(d *schema.ResourceData, meta interface{}) } <% end -%> + patchCalls := []func(opts ...googleapi.CallOption) (*sqladmin.Operation, error){} + + // BinaryLogging can be enabled on replica instances but only after creation. + if instance.MasterInstanceName != "" && instance.Settings != nil && instance.Settings.BackupConfiguration != nil { + bc := instance.Settings.BackupConfiguration + instance.Settings.BackupConfiguration = nil + if bc.BinaryLogEnabled { + bcPatchData := &sqladmin.DatabaseInstance{Settings: &sqladmin.Settings{BackupConfiguration: bc}} + bcPatch := config.NewSqlAdminClient(userAgent).Instances.Patch(project, instance.Name, bcPatchData).Do + patchCalls = append(patchCalls, bcPatch) + } + } + var op *sqladmin.Operation err = retryTimeDuration(func() (operr error) { if cloneContext != nil { @@ -884,6 +897,21 @@ func resourceSqlDatabaseInstanceCreate(d *schema.ResourceData, meta interface{}) return err } + // patch any fields that need to be sent postcreation + for _, call := range patchCalls { + err = retryTimeDuration(func() (rerr error) { + op, rerr = call() + return rerr + }, d.Timeout(schema.TimeoutUpdate), isSqlOperationInProgressError) + if err != nil { + return fmt.Errorf("Error, failed to update instance settings for %s: %s", instance.Name, err) + } + err = sqlAdminOperationWaitTime(config, op, project, "Patch Instance", userAgent, d.Timeout(schema.TimeoutUpdate)) + if err != nil { + return err + } + } + err = resourceSqlDatabaseInstanceRead(d, meta) if err != nil { return err diff --git a/mmv1/third_party/terraform/tests/resource_sql_database_instance_test.go.erb b/mmv1/third_party/terraform/tests/resource_sql_database_instance_test.go.erb index 08ad48a2f9a7..44aac8b2e823 100644 --- a/mmv1/third_party/terraform/tests/resource_sql_database_instance_test.go.erb +++ b/mmv1/third_party/terraform/tests/resource_sql_database_instance_test.go.erb @@ -1165,6 +1165,9 @@ resource "google_sql_database_instance" "replica1" { settings { tier = "db-n1-standard-1" + backup_configuration { + binary_log_enabled = true + } } master_instance_name = google_sql_database_instance.instance_master.name From e85068136de18146fd19a3a0750ea0ccbe41f347 Mon Sep 17 00:00:00 2001 From: Scott Suarez Date: Tue, 22 Jun 2021 14:52:25 -0700 Subject: [PATCH 2/3] only works for 5_7 + --- .../tests/resource_sql_database_instance_test.go.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mmv1/third_party/terraform/tests/resource_sql_database_instance_test.go.erb b/mmv1/third_party/terraform/tests/resource_sql_database_instance_test.go.erb index 44aac8b2e823..6da8bf7545f5 100644 --- a/mmv1/third_party/terraform/tests/resource_sql_database_instance_test.go.erb +++ b/mmv1/third_party/terraform/tests/resource_sql_database_instance_test.go.erb @@ -1142,7 +1142,7 @@ resource "google_sql_database_instance" "instance" { var testGoogleSqlDatabaseInstance_replica = ` resource "google_sql_database_instance" "instance_master" { name = "tf-lw-%d" - database_version = "MYSQL_5_6" + database_version = "MYSQL_5_7" region = "us-central1" deletion_protection = false @@ -1159,7 +1159,7 @@ resource "google_sql_database_instance" "instance_master" { resource "google_sql_database_instance" "replica1" { name = "tf-lw-%d-1" - database_version = "MYSQL_5_6" + database_version = "MYSQL_5_7" region = "us-central1" deletion_protection = false @@ -1184,7 +1184,7 @@ resource "google_sql_database_instance" "replica1" { resource "google_sql_database_instance" "replica2" { name = "tf-lw-%d-2" - database_version = "MYSQL_5_6" + database_version = "MYSQL_5_7" region = "us-central1" deletion_protection = false From ecfc6f0214837b49f2cd0216366b425e6670944d Mon Sep 17 00:00:00 2001 From: Scott Suarez Date: Wed, 23 Jun 2021 16:12:10 -0700 Subject: [PATCH 3/3] only use one call instead of expecting multiple --- .../resources/resource_sql_database_instance.go.erb | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/mmv1/third_party/terraform/resources/resource_sql_database_instance.go.erb b/mmv1/third_party/terraform/resources/resource_sql_database_instance.go.erb index 9e87b65eaf29..1f9a000dfb5e 100644 --- a/mmv1/third_party/terraform/resources/resource_sql_database_instance.go.erb +++ b/mmv1/third_party/terraform/resources/resource_sql_database_instance.go.erb @@ -857,16 +857,14 @@ func resourceSqlDatabaseInstanceCreate(d *schema.ResourceData, meta interface{}) } <% end -%> - patchCalls := []func(opts ...googleapi.CallOption) (*sqladmin.Operation, error){} + var patchData *sqladmin.DatabaseInstance // BinaryLogging can be enabled on replica instances but only after creation. if instance.MasterInstanceName != "" && instance.Settings != nil && instance.Settings.BackupConfiguration != nil { bc := instance.Settings.BackupConfiguration instance.Settings.BackupConfiguration = nil if bc.BinaryLogEnabled { - bcPatchData := &sqladmin.DatabaseInstance{Settings: &sqladmin.Settings{BackupConfiguration: bc}} - bcPatch := config.NewSqlAdminClient(userAgent).Instances.Patch(project, instance.Name, bcPatchData).Do - patchCalls = append(patchCalls, bcPatch) + patchData = &sqladmin.DatabaseInstance{Settings: &sqladmin.Settings{BackupConfiguration: bc}} } } @@ -898,9 +896,9 @@ func resourceSqlDatabaseInstanceCreate(d *schema.ResourceData, meta interface{}) } // patch any fields that need to be sent postcreation - for _, call := range patchCalls { + if patchData != nil { err = retryTimeDuration(func() (rerr error) { - op, rerr = call() + op, rerr = config.NewSqlAdminClient(userAgent).Instances.Patch(project, instance.Name, patchData).Do() return rerr }, d.Timeout(schema.TimeoutUpdate), isSqlOperationInProgressError) if err != nil {