From 243b2f6b54701c2766dd58e0b061b6c453265407 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 3 Jan 2023 12:50:55 -0500 Subject: [PATCH] r/aws_lightsail_database: Add 'waitDatabasePubliclyAccessibleModified'. --- internal/service/lightsail/database.go | 6 ++++++ internal/service/lightsail/status.go | 26 ++++++++++++++++++++++++-- internal/service/lightsail/wait.go | 25 ++++++++++++++++++++++--- 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/internal/service/lightsail/database.go b/internal/service/lightsail/database.go index f49054d3e9f8..5e7df959da6f 100644 --- a/internal/service/lightsail/database.go +++ b/internal/service/lightsail/database.go @@ -375,6 +375,12 @@ func resourceDatabaseUpdate(ctx context.Context, d *schema.ResourceData, meta in } } + if d.HasChange("publicly_accessible") { + if err := waitDatabasePubliclyAccessibleModified(ctx, conn, aws.String(d.Id()), d.Get("publicly_accessible").(bool)); err != nil { + return diag.Errorf("waiting for Lightsail Relational Database (%s) publicly accessible update: %s", d.Id(), err) + } + } + // Some Operations can complete before the Database enters the Available state. Added a waiter to make sure the Database is available before continuing. if _, err = waitDatabaseModified(ctx, conn, aws.String(d.Id())); err != nil { return diag.Errorf("waiting for Lightsail Relational Database (%s) to become available: %s", d.Id(), err) diff --git a/internal/service/lightsail/status.go b/internal/service/lightsail/status.go index 7d4ae66447d3..82d6c7ff0f59 100644 --- a/internal/service/lightsail/status.go +++ b/internal/service/lightsail/status.go @@ -114,8 +114,30 @@ func statusDatabaseBackupRetention(conn *lightsail.Lightsail, db *string) resour return nil, "Failed", fmt.Errorf("Error retrieving Database info for (%s)", dbValue) } - log.Printf("[DEBUG] Lightsail Database (%s) Backup Retention setting is currently %t", dbValue, *output.RelationalDatabase.BackupRetentionEnabled) - return output, strconv.FormatBool(*output.RelationalDatabase.BackupRetentionEnabled), nil + return output, strconv.FormatBool(aws.BoolValue(output.RelationalDatabase.BackupRetentionEnabled)), nil + } +} + +func statusDatabasePubliclyAccessible(conn *lightsail.Lightsail, db *string) resource.StateRefreshFunc { + return func() (interface{}, string, error) { + input := &lightsail.GetRelationalDatabaseInput{ + RelationalDatabaseName: db, + } + + dbValue := aws.StringValue(db) + log.Printf("[DEBUG] Checking if Lightsail Database (%s) Backup Retention setting has been updated.", dbValue) + + output, err := conn.GetRelationalDatabase(input) + + if err != nil { + return output, "FAILED", err + } + + if output.RelationalDatabase == nil { + return nil, "Failed", fmt.Errorf("Error retrieving Database info for (%s)", dbValue) + } + + return output, strconv.FormatBool(aws.BoolValue(output.RelationalDatabase.PubliclyAccessible)), nil } } diff --git a/internal/service/lightsail/wait.go b/internal/service/lightsail/wait.go index d13f4b5e9e0e..fb3c0d26e801 100644 --- a/internal/service/lightsail/wait.go +++ b/internal/service/lightsail/wait.go @@ -76,10 +76,10 @@ func waitDatabaseModified(ctx context.Context, conn *lightsail.Lightsail, db *st // waitDatabaseBackupRetentionModified waits for a Modified BackupRetention on Database return available -func waitDatabaseBackupRetentionModified(ctx context.Context, conn *lightsail.Lightsail, db *string, status *bool) error { +func waitDatabaseBackupRetentionModified(ctx context.Context, conn *lightsail.Lightsail, db *string, target bool) error { stateConf := &resource.StateChangeConf{ - Pending: []string{strconv.FormatBool(!aws.BoolValue(status))}, - Target: []string{strconv.FormatBool(aws.BoolValue(status))}, + Pending: []string{strconv.FormatBool(!target)}, + Target: []string{strconv.FormatBool(target)}, Refresh: statusDatabaseBackupRetention(conn, db), Timeout: DatabaseTimeout, Delay: DatabaseDelay, @@ -95,6 +95,25 @@ func waitDatabaseBackupRetentionModified(ctx context.Context, conn *lightsail.Li return err } +func waitDatabasePubliclyAccessibleModified(ctx context.Context, conn *lightsail.Lightsail, db *string, target bool) error { + stateConf := &resource.StateChangeConf{ + Pending: []string{strconv.FormatBool(!target)}, + Target: []string{strconv.FormatBool(target)}, + Refresh: statusDatabasePubliclyAccessible(conn, db), + Timeout: DatabaseTimeout, + Delay: DatabaseDelay, + MinTimeout: DatabaseMinTimeout, + } + + outputRaw, err := stateConf.WaitForStateContext(ctx) + + if _, ok := outputRaw.(*lightsail.GetRelationalDatabaseOutput); ok { + return err + } + + return err +} + func waitContainerServiceCreated(ctx context.Context, conn *lightsail.Lightsail, serviceName string, timeout time.Duration) error { stateConf := &resource.StateChangeConf{ Pending: []string{lightsail.ContainerServiceStatePending},