From cc88f6971565889ba80511e668d028fc8a802561 Mon Sep 17 00:00:00 2001 From: Aris van Ommeren Date: Thu, 18 Mar 2021 21:07:20 +0100 Subject: [PATCH 1/9] First stab at the problem --- azurerm/internal/services/mssql/mssql_database_resource.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/azurerm/internal/services/mssql/mssql_database_resource.go b/azurerm/internal/services/mssql/mssql_database_resource.go index d15a0678c7fa..0123670a5056 100644 --- a/azurerm/internal/services/mssql/mssql_database_resource.go +++ b/azurerm/internal/services/mssql/mssql_database_resource.go @@ -598,6 +598,9 @@ func resourceMsSqlDatabaseRead(d *schema.ResourceData, meta interface{}) error { d.Set("sku_name", props.CurrentServiceObjectiveName) d.Set("storage_account_type", props.StorageAccountType) d.Set("zone_redundant", props.ZoneRedundant) + if props.CreateMode != "" { + d.Set("create_mode", props.CreateMode) + } } threat, err := threatClient.Get(ctx, id.ResourceGroup, id.ServerName, id.Name) From b4e8e290b65e616feb95bd2316d44cb23b6b814e Mon Sep 17 00:00:00 2001 From: Aris van Ommeren Date: Thu, 18 Mar 2021 23:10:25 +0100 Subject: [PATCH 2/9] Update importsteps --- .../services/mssql/mssql_database_resource_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/azurerm/internal/services/mssql/mssql_database_resource_test.go b/azurerm/internal/services/mssql/mssql_database_resource_test.go index 8f9507dd9be5..a52a7f0fd88e 100644 --- a/azurerm/internal/services/mssql/mssql_database_resource_test.go +++ b/azurerm/internal/services/mssql/mssql_database_resource_test.go @@ -225,7 +225,7 @@ func TestAccMsSqlDatabase_createCopyMode(t *testing.T) { check.That(data.ResourceName).Key("sku_name").HasValue("GP_Gen5_2"), ), }, - data.ImportStep("create_mode", "creation_source_database_id"), + data.ImportStep("creation_source_database_id"), }) } @@ -250,7 +250,7 @@ func TestAccMsSqlDatabase_createPITRMode(t *testing.T) { ), }, - data.ImportStep("create_mode", "creation_source_database_id", "restore_point_in_time"), + data.ImportStep("creation_source_database_id", "restore_point_in_time"), }) } @@ -268,7 +268,7 @@ func TestAccMsSqlDatabase_createSecondaryMode(t *testing.T) { check.That(data.ResourceName).Key("sku_name").HasValue("GP_Gen5_2"), ), }, - data.ImportStep("create_mode", "creation_source_database_id", "sample_name"), + data.ImportStep("creation_source_database_id", "sample_name"), }) } @@ -318,7 +318,7 @@ func TestAccMsSqlDatabase_createRestoreMode(t *testing.T) { check.That(data.ResourceName).ExistsInAzure(r), ), }, - data.ImportStep("create_mode", "creation_source_database_id"), + data.ImportStep("creation_source_database_id"), { PreConfig: func() { time.Sleep(8 * time.Minute) }, @@ -339,7 +339,7 @@ func TestAccMsSqlDatabase_createRestoreMode(t *testing.T) { ), }, - data.ImportStep("create_mode", "restore_dropped_database_id"), + data.ImportStep("restore_dropped_database_id"), }) } From 6e5dc52451fa4ef607e2d0096b38b39be9e83c5b Mon Sep 17 00:00:00 2001 From: Aris van Ommeren Date: Fri, 19 Mar 2021 13:23:55 +0100 Subject: [PATCH 3/9] Implemented requested changes --- .../services/mssql/mssql_database_resource.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/azurerm/internal/services/mssql/mssql_database_resource.go b/azurerm/internal/services/mssql/mssql_database_resource.go index 0123670a5056..409cd232edcd 100644 --- a/azurerm/internal/services/mssql/mssql_database_resource.go +++ b/azurerm/internal/services/mssql/mssql_database_resource.go @@ -32,9 +32,16 @@ func resourceMsSqlDatabase() *schema.Resource { Update: resourceMsSqlDatabaseCreateUpdate, Delete: resourceMsSqlDatabaseDelete, - Importer: pluginsdk.ImporterValidatingResourceId(func(id string) error { + Importer: pluginsdk.ImporterValidatingResourceIdThen(func(id string) error { _, err := parse.DatabaseID(id) return err + }, func(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { + d.Set("create_mode", "Default") + if v, ok := d.GetOk("create_mode"); ok && v.(string) != "" { + d.Set("create_mode", v) + } + + return []*schema.ResourceData{d}, nil }), Timeouts: &schema.ResourceTimeout{ @@ -598,9 +605,6 @@ func resourceMsSqlDatabaseRead(d *schema.ResourceData, meta interface{}) error { d.Set("sku_name", props.CurrentServiceObjectiveName) d.Set("storage_account_type", props.StorageAccountType) d.Set("zone_redundant", props.ZoneRedundant) - if props.CreateMode != "" { - d.Set("create_mode", props.CreateMode) - } } threat, err := threatClient.Get(ctx, id.ResourceGroup, id.ServerName, id.Name) From 756176d9a6734cd98ebff2a1444d2fd17dd2206b Mon Sep 17 00:00:00 2001 From: tombuildsstuff Date: Fri, 19 Mar 2021 14:57:36 +0100 Subject: [PATCH 4/9] r/mssql_database: changing the default for `create_mode` from Computed to `Default` This mirrors the API behaviour, although it doesn't return it --- azurerm/internal/services/mssql/mssql_database_resource.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azurerm/internal/services/mssql/mssql_database_resource.go b/azurerm/internal/services/mssql/mssql_database_resource.go index 409cd232edcd..5c4752b0bae4 100644 --- a/azurerm/internal/services/mssql/mssql_database_resource.go +++ b/azurerm/internal/services/mssql/mssql_database_resource.go @@ -77,7 +77,7 @@ func resourceMsSqlDatabase() *schema.Resource { Type: schema.TypeString, Optional: true, ForceNew: true, - Computed: true, + Default: string(sql.CreateModeDefault), ValidateFunc: validation.StringInSlice([]string{ string(sql.CreateModeCopy), string(sql.CreateModeDefault), From c8edc0c11054317fd16040901a1eba1acef5a64e Mon Sep 17 00:00:00 2001 From: tombuildsstuff Date: Fri, 19 Mar 2021 14:58:21 +0100 Subject: [PATCH 5/9] mssql: adding a state migration to set the default value for `create_mode` --- .../mssql/migration/database_v0_to_v1.go | 316 ++++++++++++++++++ .../services/mssql/mssql_database_resource.go | 7 + 2 files changed, 323 insertions(+) create mode 100644 azurerm/internal/services/mssql/migration/database_v0_to_v1.go diff --git a/azurerm/internal/services/mssql/migration/database_v0_to_v1.go b/azurerm/internal/services/mssql/migration/database_v0_to_v1.go new file mode 100644 index 000000000000..a90b5c521612 --- /dev/null +++ b/azurerm/internal/services/mssql/migration/database_v0_to_v1.go @@ -0,0 +1,316 @@ +package migration + +import ( + "log" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/helper/validation" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tags" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tf/suppress" +) + +// Default: string(sql.CreateModeDefault), + +func DatabaseV0ToV1() schema.StateUpgrader { + return schema.StateUpgrader{ + Version: 0, + Type: databaseV0V1Schema().CoreConfigSchema().ImpliedType(), + Upgrade: databaseUpgradeV0ToV1, + } +} + +func databaseV0V1Schema() *schema.Resource { + return &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + + "server_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + + "auto_pause_delay_in_minutes": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + + "create_mode": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Computed: true, + }, + + "collation": { + Type: schema.TypeString, + Optional: true, + Computed: true, + ForceNew: true, + }, + + "elastic_pool_id": { + Type: schema.TypeString, + Optional: true, + }, + + "extended_auditing_policy": { + Type: schema.TypeList, + Optional: true, + Computed: true, + Deprecated: "the `extended_auditing_policy` block has been moved to `azurerm_mssql_server_extended_auditing_policy` and `azurerm_mssql_database_extended_auditing_policy`. This block will be removed in version 3.0 of the provider.", + ConfigMode: schema.SchemaConfigModeAttr, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "storage_account_access_key": { + Type: schema.TypeString, + Optional: true, + Sensitive: true, + }, + + "storage_endpoint": { + Type: schema.TypeString, + Optional: true, + }, + + "storage_account_access_key_is_secondary": { + Type: schema.TypeBool, + Optional: true, + }, + + "retention_in_days": { + Type: schema.TypeInt, + Optional: true, + }, + + "log_monitoring_enabled": { + Type: schema.TypeBool, + Optional: true, + Default: true, + }, + }, + }, + }, + + "license_type": { + Type: schema.TypeString, + Optional: true, + Computed: true, + }, + + "long_term_retention_policy": { + Type: schema.TypeList, + Optional: true, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + // WeeklyRetention - The weekly retention policy for an LTR backup in an ISO 8601 format. + "weekly_retention": { + Type: schema.TypeString, + Optional: true, + Computed: true, + }, + // MonthlyRetention - The monthly retention policy for an LTR backup in an ISO 8601 format. + "monthly_retention": { + Type: schema.TypeString, + Optional: true, + Computed: true, + }, + // YearlyRetention - The yearly retention policy for an LTR backup in an ISO 8601 format. + "yearly_retention": { + Type: schema.TypeString, + Optional: true, + Computed: true, + }, + // WeekOfYear - The week of year to take the yearly backup in an ISO 8601 format. + "week_of_year": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + }, + }, + }, + + "short_term_retention_policy": { + Type: schema.TypeList, + Optional: true, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "retention_days": { + Type: schema.TypeInt, + Required: true, + }, + }, + }, + }, + + "max_size_gb": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + + "min_capacity": { + Type: schema.TypeFloat, + Optional: true, + Computed: true, + }, + + "restore_point_in_time": { + Type: schema.TypeString, + Optional: true, + Computed: true, + DiffSuppressFunc: suppress.RFC3339Time, + }, + + "recover_database_id": { + Type: schema.TypeString, + Optional: true, + }, + + "restore_dropped_database_id": { + Type: schema.TypeString, + Optional: true, + }, + + "read_replica_count": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + + "read_scale": { + Type: schema.TypeBool, + Optional: true, + Computed: true, + }, + + "sample_name": { + Type: schema.TypeString, + Optional: true, + Computed: true, + }, + + "sku_name": { + Type: schema.TypeString, + Optional: true, + Computed: true, + DiffSuppressFunc: suppress.CaseDifference, + }, + + "creation_source_database_id": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Computed: true, + }, + + "storage_account_type": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Default: "GRS", + }, + + "zone_redundant": { + Type: schema.TypeBool, + Optional: true, + Computed: true, + }, + + "threat_detection_policy": { + Type: schema.TypeList, + Optional: true, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "disabled_alerts": { + Type: schema.TypeSet, + Optional: true, + Set: schema.HashString, + Elem: &schema.Schema{ + Type: schema.TypeString, + ValidateFunc: validation.StringInSlice([]string{ + "Sql_Injection", + "Sql_Injection_Vulnerability", + "Access_Anomaly", + }, true), + }, + }, + + "email_account_admins": { + Type: schema.TypeString, + Optional: true, + DiffSuppressFunc: suppress.CaseDifference, + Default: "Disabled", + }, + + "email_addresses": { + Type: schema.TypeSet, + Optional: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + Set: schema.HashString, + }, + + "retention_days": { + Type: schema.TypeInt, + Optional: true, + }, + + "state": { + Type: schema.TypeString, + Optional: true, + DiffSuppressFunc: suppress.CaseDifference, + Default: "Disabled", + }, + + "storage_account_access_key": { + Type: schema.TypeString, + Optional: true, + Sensitive: true, + }, + + "storage_endpoint": { + Type: schema.TypeString, + Optional: true, + }, + + "use_server_default": { + Type: schema.TypeString, + Optional: true, + DiffSuppressFunc: suppress.CaseDifference, + Default: "Disabled", + }, + }, + }, + }, + + "tags": tags.Schema(), + }, + } +} + +func databaseUpgradeV0ToV1(rawState map[string]interface{}, meta interface{}) (map[string]interface{}, error) { + log.Printf("[DEBUG] Upgrading from Database V0 to V1..") + existing := rawState["create_mode"] + if existing == nil { + log.Printf("[DEBUG] Setting `create_mode` to `Default`") + rawState["create_mode"] = "Default" + } + + log.Printf("[DEBUG] Upgraded from Database V0 to V1..") + return rawState, nil +} diff --git a/azurerm/internal/services/mssql/mssql_database_resource.go b/azurerm/internal/services/mssql/mssql_database_resource.go index 5c4752b0bae4..eb21f544a84c 100644 --- a/azurerm/internal/services/mssql/mssql_database_resource.go +++ b/azurerm/internal/services/mssql/mssql_database_resource.go @@ -7,6 +7,8 @@ import ( "strings" "time" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/mssql/migration" + "github.com/Azure/azure-sdk-for-go/services/preview/sql/mgmt/v3.0/sql" "github.com/Azure/go-autorest/autorest/date" "github.com/hashicorp/go-azure-helpers/response" @@ -51,6 +53,11 @@ func resourceMsSqlDatabase() *schema.Resource { Delete: schema.DefaultTimeout(60 * time.Minute), }, + SchemaVersion: 1, + StateUpgraders: []schema.StateUpgrader{ + migration.DatabaseV0ToV1(), + }, + Schema: map[string]*schema.Schema{ "name": { Type: schema.TypeString, From d50493dae1c04e8b54dbd27874ec755b9b47f33c Mon Sep 17 00:00:00 2001 From: Aris van Ommeren Date: Tue, 27 Apr 2021 15:28:34 +0200 Subject: [PATCH 6/9] Import create_mode for Secondary based on replication link --- .../internal/services/mssql/client/client.go | 5 ++++ .../services/mssql/mssql_database_resource.go | 25 ++++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/azurerm/internal/services/mssql/client/client.go b/azurerm/internal/services/mssql/client/client.go index bddfb877ee4f..678706031c95 100644 --- a/azurerm/internal/services/mssql/client/client.go +++ b/azurerm/internal/services/mssql/client/client.go @@ -18,6 +18,7 @@ type Client struct { FirewallRulesClient *sql.FirewallRulesClient JobAgentsClient *sql.JobAgentsClient JobCredentialsClient *sql.JobCredentialsClient + ReplicationLinksClient *sql.ReplicationLinksClient RestorableDroppedDatabasesClient *sql.RestorableDroppedDatabasesClient ServerAzureADAdministratorsClient *sql.ServerAzureADAdministratorsClient ServerConnectionPoliciesClient *sql.ServerConnectionPoliciesClient @@ -63,6 +64,9 @@ func NewClient(o *common.ClientOptions) *Client { firewallRulesClient := sql.NewFirewallRulesClientWithBaseURI(o.ResourceManagerEndpoint, o.SubscriptionId) o.ConfigureClient(&firewallRulesClient.Client, o.ResourceManagerAuthorizer) + replicationLinksClient := sql.NewReplicationLinksClientWithBaseURI(o.ResourceManagerEndpoint, o.SubscriptionId) + o.ConfigureClient(&replicationLinksClient.Client, o.ResourceManagerAuthorizer) + restorableDroppedDatabasesClient := sql.NewRestorableDroppedDatabasesClientWithBaseURI(o.ResourceManagerEndpoint, o.SubscriptionId) o.ConfigureClient(&restorableDroppedDatabasesClient.Client, o.ResourceManagerAuthorizer) @@ -111,6 +115,7 @@ func NewClient(o *common.ClientOptions) *Client { JobAgentsClient: &jobAgentsClient, JobCredentialsClient: &jobCredentialsClient, FirewallRulesClient: &firewallRulesClient, + ReplicationLinksClient: &replicationLinksClient, RestorableDroppedDatabasesClient: &restorableDroppedDatabasesClient, ServerAzureADAdministratorsClient: &serverAzureADAdministratorsClient, ServersClient: &serversClient, diff --git a/azurerm/internal/services/mssql/mssql_database_resource.go b/azurerm/internal/services/mssql/mssql_database_resource.go index eb21f544a84c..0308de31113c 100644 --- a/azurerm/internal/services/mssql/mssql_database_resource.go +++ b/azurerm/internal/services/mssql/mssql_database_resource.go @@ -37,11 +37,28 @@ func resourceMsSqlDatabase() *schema.Resource { Importer: pluginsdk.ImporterValidatingResourceIdThen(func(id string) error { _, err := parse.DatabaseID(id) return err - }, func(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { - d.Set("create_mode", "Default") - if v, ok := d.GetOk("create_mode"); ok && v.(string) != "" { - d.Set("create_mode", v) + }, func(ctx context.Context, d *pluginsdk.ResourceData, meta interface{}) ([]*pluginsdk.ResourceData, error) { + replicationLinksClient := meta.(*clients.Client).MSSQL.ReplicationLinksClient + ctx, cancel := timeouts.ForCreateUpdate(meta.(*clients.Client).StopContext, d) + defer cancel() + + id, err := parse.DatabaseID(d.Id()) + if err != nil { + return nil, err + } + resp, err := replicationLinksClient.ListByDatabase(ctx, id.ResourceGroup, id.ServerName, id.Name) + if err != nil { + return nil, fmt.Errorf("reading Replication Links for MsSql Database %s (MsSql Server Name %q / Resource Group %q): %s", id.Name, id.ServerName, id.ResourceGroup, err) + } + + for _, link := range *resp.Value { + props := *link.ReplicationLinkProperties + if props.Role == sql.ReplicationRoleSecondary || props.Role == sql.ReplicationRoleNonReadableSecondary { + d.Set("create_mode", string(sql.CreateModeSecondary)) + return []*schema.ResourceData{d}, nil + } } + d.Set("create_mode", "Default") return []*schema.ResourceData{d}, nil }), From 1ac68d4e707f8e4b535b1467b7893625f3965192 Mon Sep 17 00:00:00 2001 From: Aris van Ommeren Date: Tue, 27 Apr 2021 15:52:05 +0200 Subject: [PATCH 7/9] fixup for pluginsdk wrapper --- azurerm/internal/services/mssql/mssql_database_resource.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/azurerm/internal/services/mssql/mssql_database_resource.go b/azurerm/internal/services/mssql/mssql_database_resource.go index 0308de31113c..5df0d30dfb35 100644 --- a/azurerm/internal/services/mssql/mssql_database_resource.go +++ b/azurerm/internal/services/mssql/mssql_database_resource.go @@ -39,8 +39,6 @@ func resourceMsSqlDatabase() *schema.Resource { return err }, func(ctx context.Context, d *pluginsdk.ResourceData, meta interface{}) ([]*pluginsdk.ResourceData, error) { replicationLinksClient := meta.(*clients.Client).MSSQL.ReplicationLinksClient - ctx, cancel := timeouts.ForCreateUpdate(meta.(*clients.Client).StopContext, d) - defer cancel() id, err := parse.DatabaseID(d.Id()) if err != nil { @@ -55,12 +53,12 @@ func resourceMsSqlDatabase() *schema.Resource { props := *link.ReplicationLinkProperties if props.Role == sql.ReplicationRoleSecondary || props.Role == sql.ReplicationRoleNonReadableSecondary { d.Set("create_mode", string(sql.CreateModeSecondary)) - return []*schema.ResourceData{d}, nil + return []*pluginsdk.ResourceData{d}, nil } } d.Set("create_mode", "Default") - return []*schema.ResourceData{d}, nil + return []*pluginsdk.ResourceData{d}, nil }), Timeouts: &schema.ResourceTimeout{ From 3bdc06d754c0db5fece0bf8e7de712ead0511d44 Mon Sep 17 00:00:00 2001 From: Aris van Ommeren Date: Wed, 28 Apr 2021 14:26:28 +0200 Subject: [PATCH 8/9] Extra import steps to test import --- .../internal/services/mssql/mssql_database_resource_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/azurerm/internal/services/mssql/mssql_database_resource_test.go b/azurerm/internal/services/mssql/mssql_database_resource_test.go index a52a7f0fd88e..ae4c3bf2b3e2 100644 --- a/azurerm/internal/services/mssql/mssql_database_resource_test.go +++ b/azurerm/internal/services/mssql/mssql_database_resource_test.go @@ -286,6 +286,7 @@ func TestAccMsSqlDatabase_scaleReplicaSetWithFailovergroup(t *testing.T) { check.That(data.ResourceName).Key("sku_name").HasValue("GP_Gen5_2"), ), }, + data.ImportStep("creation_source_database_id"), { Config: r.scaleReplicaSetWithFailovergroup(data, "GP_Gen5_8", 25), Check: resource.ComposeTestCheckFunc( @@ -295,6 +296,7 @@ func TestAccMsSqlDatabase_scaleReplicaSetWithFailovergroup(t *testing.T) { check.That(data.ResourceName).Key("sku_name").HasValue("GP_Gen5_8"), ), }, + data.ImportStep("creation_source_database_id"), { Config: r.scaleReplicaSetWithFailovergroup(data, "GP_Gen5_2", 5), Check: resource.ComposeTestCheckFunc( @@ -304,6 +306,7 @@ func TestAccMsSqlDatabase_scaleReplicaSetWithFailovergroup(t *testing.T) { check.That(data.ResourceName).Key("sku_name").HasValue("GP_Gen5_2"), ), }, + data.ImportStep("creation_source_database_id"), }) } From 2f0d6adf942396d412e46bf4e7b09afb9a6177b0 Mon Sep 17 00:00:00 2001 From: Aris van Ommeren Date: Wed, 28 Apr 2021 18:27:48 +0200 Subject: [PATCH 9/9] Revert importstep on createCopyMode --- azurerm/internal/services/mssql/mssql_database_resource_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azurerm/internal/services/mssql/mssql_database_resource_test.go b/azurerm/internal/services/mssql/mssql_database_resource_test.go index ae4c3bf2b3e2..a11f72d2ff04 100644 --- a/azurerm/internal/services/mssql/mssql_database_resource_test.go +++ b/azurerm/internal/services/mssql/mssql_database_resource_test.go @@ -225,7 +225,7 @@ func TestAccMsSqlDatabase_createCopyMode(t *testing.T) { check.That(data.ResourceName).Key("sku_name").HasValue("GP_Gen5_2"), ), }, - data.ImportStep("creation_source_database_id"), + data.ImportStep("create_mode", "creation_source_database_id"), }) }