Fixes for importing sql database instances (#1956)

* fix importing for sql resources

* fmt

* fix id for sql db import, tests

* change test names to be more specific
This commit is contained in:
emily 2018-08-28 16:51:37 -07:00 committed by GitHub
parent 2afafa0573
commit 27ade47e5a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 119 additions and 120 deletions

View File

@ -1,61 +0,0 @@
package google
import (
"fmt"
"testing"
"github.com/hashicorp/terraform/helper/acctest"
"github.com/hashicorp/terraform/helper/resource"
)
// Test importing a first generation database
func TestAccSqlDatabaseInstance_importBasic(t *testing.T) {
t.Parallel()
resourceName := "google_sql_database_instance.instance"
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, databaseID),
},
resource.TestStep{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}
// Test importing a second generation database
func TestAccSqlDatabaseInstance_importBasic3(t *testing.T) {
t.Parallel()
resourceName := "google_sql_database_instance.instance"
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_basic3, databaseID),
},
resource.TestStep{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}

View File

@ -1,33 +0,0 @@
package google
import (
"fmt"
"testing"
"github.com/hashicorp/terraform/helper/acctest"
"github.com/hashicorp/terraform/helper/resource"
)
func TestAccSqlDatabase_importBasic(t *testing.T) {
t.Parallel()
resourceName := "google_sql_database.database"
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccSqlDatabaseInstanceDestroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: fmt.Sprintf(
testGoogleSqlDatabase_basic, acctest.RandString(10), acctest.RandString(10)),
},
resource.TestStep{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}

View File

@ -17,7 +17,7 @@ func resourceSqlDatabase() *schema.Resource {
Update: resourceSqlDatabaseUpdate,
Delete: resourceSqlDatabaseDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
State: resourceSqlDatabaseImport,
},
Schema: map[string]*schema.Schema{
@ -211,3 +211,23 @@ func resourceSqlDatabaseDelete(d *schema.ResourceData, meta interface{}) error {
return nil
}
func resourceSqlDatabaseImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
config := meta.(*Config)
parseImportId([]string{
"projects/(?P<project>[^/]+)/instances/(?P<instance>[^/]+)/databases/(?P<name>[^/]+)",
"instances/(?P<instance>[^/]+)/databases/(?P<name>[^/]+)",
"(?P<project>[^/]+)/(?P<instance>[^/]+)/(?P<name>[^/]+)",
"(?P<instance>[^/]+)/(?P<name>[^/]+)",
"(?P<instance>[^/]+):(?P<name>[^/]+)",
}, d, config)
// Replace import id for the resource id
id, err := replaceVars(d, config, "{{instance}}:{{name}}")
if err != nil {
return nil, fmt.Errorf("Error constructing id: %s", err)
}
d.SetId(id)
return []*schema.ResourceData{d}, nil
}

View File

@ -40,7 +40,7 @@ func resourceSqlDatabaseInstance() *schema.Resource {
Update: resourceSqlDatabaseInstanceUpdate,
Delete: resourceSqlDatabaseInstanceDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
State: resourceSqlDatabaseInstanceImport,
},
Timeouts: &schema.ResourceTimeout{
@ -1105,6 +1105,23 @@ func resourceSqlDatabaseInstanceDelete(d *schema.ResourceData, meta interface{})
return nil
}
func resourceSqlDatabaseInstanceImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
config := meta.(*Config)
parseImportId([]string{
"projects/(?P<project>[^/]+)/instances/(?P<name>[^/]+)",
"(?P<project>[^/]+)/(?P<name>[^/]+)",
"(?P<name>[^/]+)"}, d, config)
// Replace import id for the resource id
id, err := replaceVars(d, config, "{{name}}")
if err != nil {
return nil, fmt.Errorf("Error constructing id: %s", err)
}
d.SetId(id)
return []*schema.ResourceData{d}, nil
}
func flattenSettings(settings *sqladmin.Settings) []map[string]interface{} {
data := map[string]interface{}{
"version": settings.SettingsVersion,

View File

@ -154,11 +154,13 @@ func testSweepDatabases(region string) error {
return nil
}
func TestAccSqlDatabaseInstance_basic(t *testing.T) {
func TestAccSqlDatabaseInstance_basicFirstGen(t *testing.T) {
t.Parallel()
var instance sqladmin.DatabaseInstance
databaseID := acctest.RandInt()
instanceID := acctest.RandInt()
instanceName := fmt.Sprintf("tf-lw-%d", instanceID)
resourceName := "google_sql_database_instance.instance"
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
@ -167,19 +169,34 @@ func TestAccSqlDatabaseInstance_basic(t *testing.T) {
Steps: []resource.TestStep{
resource.TestStep{
Config: fmt.Sprintf(
testGoogleSqlDatabaseInstance_basic, databaseID),
testGoogleSqlDatabaseInstance_basic, instanceID),
Check: resource.ComposeTestCheckFunc(
testAccCheckGoogleSqlDatabaseInstanceExists(
"google_sql_database_instance.instance", &instance),
testAccCheckGoogleSqlDatabaseInstanceEquals(
"google_sql_database_instance.instance", &instance),
testAccCheckGoogleSqlDatabaseInstanceExists(resourceName, &instance),
testAccCheckGoogleSqlDatabaseInstanceEquals(resourceName, &instance),
),
},
resource.TestStep{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
resource.TestStep{
ResourceName: resourceName,
ImportStateId: fmt.Sprintf("projects/%s/instances/%s", getTestProjectFromEnv(), instanceName),
ImportState: true,
ImportStateVerify: true,
},
resource.TestStep{
ResourceName: resourceName,
ImportStateId: fmt.Sprintf("%s/%s", getTestProjectFromEnv(), instanceName),
ImportState: true,
ImportStateVerify: true,
},
},
})
}
func TestAccSqlDatabaseInstance_basic2(t *testing.T) {
func TestAccSqlDatabaseInstance_basicInferredName(t *testing.T) {
t.Parallel()
var instance sqladmin.DatabaseInstance
@ -202,7 +219,7 @@ func TestAccSqlDatabaseInstance_basic2(t *testing.T) {
})
}
func TestAccSqlDatabaseInstance_basic3(t *testing.T) {
func TestAccSqlDatabaseInstance_basicSecondGen(t *testing.T) {
t.Parallel()
var instance sqladmin.DatabaseInstance

View File

@ -16,21 +16,52 @@ func TestAccSqlDatabase_basic(t *testing.T) {
var database sqladmin.Database
resourceName := "google_sql_database.database"
instanceName := fmt.Sprintf("sqldatabasetest%s", acctest.RandString(10))
dbName := fmt.Sprintf("sqldatabasetest%s", acctest.RandString(10))
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccSqlDatabaseDestroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: fmt.Sprintf(
testGoogleSqlDatabase_basic, acctest.RandString(10), acctest.RandString(10)),
Config: fmt.Sprintf(testGoogleSqlDatabase_basic, instanceName, dbName),
Check: resource.ComposeTestCheckFunc(
testAccCheckGoogleSqlDatabaseExists(
"google_sql_database.database", &database),
testAccCheckGoogleSqlDatabaseEquals(
"google_sql_database.database", &database),
testAccCheckGoogleSqlDatabaseExists(resourceName, &database),
testAccCheckGoogleSqlDatabaseEquals(resourceName, &database),
),
},
resource.TestStep{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
resource.TestStep{
ResourceName: resourceName,
ImportStateId: fmt.Sprintf("%s/%s", instanceName, dbName),
ImportState: true,
ImportStateVerify: true,
},
resource.TestStep{
ResourceName: resourceName,
ImportStateId: fmt.Sprintf("instances/%s/databases/%s", instanceName, dbName),
ImportState: true,
ImportStateVerify: true,
},
resource.TestStep{
ResourceName: resourceName,
ImportStateId: fmt.Sprintf("%s/%s/%s", getTestProjectFromEnv(), instanceName, dbName),
ImportState: true,
ImportStateVerify: true,
},
resource.TestStep{
ResourceName: resourceName,
ImportStateId: fmt.Sprintf("projects/%s/instances/%s/databases/%s", getTestProjectFromEnv(), instanceName, dbName),
ImportState: true,
ImportStateVerify: true,
},
},
})
}
@ -151,7 +182,7 @@ func testAccSqlDatabaseDestroy(s *terraform.State) error {
var testGoogleSqlDatabase_basic = `
resource "google_sql_database_instance" "instance" {
name = "sqldatabasetest%s"
name = "%s"
region = "us-central"
settings {
tier = "D0"
@ -159,13 +190,13 @@ resource "google_sql_database_instance" "instance" {
}
resource "google_sql_database" "database" {
name = "sqldatabasetest%s"
name = "%s"
instance = "${google_sql_database_instance.instance.name}"
}
`
var testGoogleSqlDatabase_latin1 = `
resource "google_sql_database_instance" "instance" {
name = "sqldatabasetest%s"
name = "%s"
region = "us-central"
settings {
tier = "D0"
@ -173,7 +204,7 @@ resource "google_sql_database_instance" "instance" {
}
resource "google_sql_database" "database" {
name = "sqldatabasetest%s"
name = "%s"
instance = "${google_sql_database_instance.instance.name}"
charset = "latin1"
collation = "latin1_swedish_ci"

View File

@ -67,8 +67,13 @@ exported:
## Import
SQL databases can be imported using the `instance` and `name`, e.g.
SQL databases can be imported using one of any of these accepted formats:
```
$ terraform import google_sql_database.database master-instance:users-db
$ terraform import google_sql_database.database projects/{{project}}/instances/{{instance}}/databases/{{name}}
$ terraform import google_sql_database.database {{project}}/{{instance}}/{{name}}
$ terraform import google_sql_database.database instances/{{name}}/databases/{{name}}
$ terraform import google_sql_database.database {{instance}}/{{name}}
$ terraform import google_sql_database.database {{name}}
```

View File

@ -313,8 +313,11 @@ when the resource is configured with a `count`.
## Import
Database instances can be imported using the `name`, e.g.
Database instances can be imported using one of any of these accepted formats:
```
$ terraform import google_sql_database_instance.master master-instance
```
$ terraform import google_sql_database_instance.master projects/{{project}}/instances/{{name}}
$ terraform import google_sql_database_instance.master {{project}}/{{name}}
$ terraform import google_sql_database_instance.master {{name}}
```