Fix spanner database iam binding import (#2603)

This commit is contained in:
The Magician 2018-12-07 11:30:50 -08:00 committed by Nathan McKinley
parent 8838720309
commit a348e35263
2 changed files with 32 additions and 48 deletions

View File

@ -6,7 +6,7 @@ import (
"github.com/hashicorp/errwrap" "github.com/hashicorp/errwrap"
"github.com/hashicorp/terraform/helper/schema" "github.com/hashicorp/terraform/helper/schema"
"google.golang.org/api/cloudresourcemanager/v1" "google.golang.org/api/cloudresourcemanager/v1"
spanner "google.golang.org/api/spanner/v1" "google.golang.org/api/spanner/v1"
) )
var IamSpannerDatabaseSchema = map[string]*schema.Schema{ var IamSpannerDatabaseSchema = map[string]*schema.Schema{
@ -51,17 +51,8 @@ func NewSpannerDatabaseIamUpdater(d *schema.ResourceData, config *Config) (Resou
} }
func SpannerDatabaseIdParseFunc(d *schema.ResourceData, config *Config) error { func SpannerDatabaseIdParseFunc(d *schema.ResourceData, config *Config) error {
id, err := extractSpannerDatabaseId(d.Id()) _, err := resourceSpannerDatabaseImport("database")(d, config)
if err != nil { return err
return err
}
d.Set("instance", id.Instance)
d.Set("project", id.Project)
d.Set("database", id.Database)
// Explicitly set the id so imported resources have the same ID format as non-imported ones.
d.SetId(id.terraformId())
return nil
} }
func (u *SpannerDatabaseIamUpdater) GetResourceIamPolicy() (*cloudresourcemanager.Policy, error) { func (u *SpannerDatabaseIamUpdater) GetResourceIamPolicy() (*cloudresourcemanager.Policy, error) {

View File

@ -2,12 +2,10 @@ package google
import ( import (
"fmt" "fmt"
"github.com/hashicorp/terraform/helper/schema"
"log" "log"
"net/http" "net/http"
"regexp" "regexp"
"strings"
"github.com/hashicorp/terraform/helper/schema"
"google.golang.org/api/googleapi" "google.golang.org/api/googleapi"
"google.golang.org/api/spanner/v1" "google.golang.org/api/spanner/v1"
@ -23,7 +21,7 @@ func resourceSpannerDatabase() *schema.Resource {
Read: resourceSpannerDatabaseRead, Read: resourceSpannerDatabaseRead,
Delete: resourceSpannerDatabaseDelete, Delete: resourceSpannerDatabaseDelete,
Importer: &schema.ResourceImporter{ Importer: &schema.ResourceImporter{
State: resourceSpannerDatabaseImport, State: resourceSpannerDatabaseImport("name"),
}, },
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{
@ -137,26 +135,28 @@ func resourceSpannerDatabaseDelete(d *schema.ResourceData, meta interface{}) err
return nil return nil
} }
func resourceSpannerDatabaseImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { func resourceSpannerDatabaseImport(databaseField string) schema.StateFunc {
config := meta.(*Config) return func(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
err := parseImportId([]string{ config := meta.(*Config)
"projects/(?P<project>[^/]+)/instances/(?P<instance>[^/]+)/databases/(?P<name>[^/]+)", err := parseImportId([]string{
"instances/(?P<instance>[^/]+)/databases/(?P<name>[^/]+)", fmt.Sprintf("projects/(?P<project>[^/]+)/instances/(?P<instance>[^/]+)/databases/(?P<%s>[^/]+)", databaseField),
"(?P<project>[^/]+)/(?P<instance>[^/]+)/(?P<name>[^/]+)", fmt.Sprintf("instances/(?P<instance>[^/]+)/databases/(?P<%s>[^/]+)", databaseField),
"(?P<instance>[^/]+)/(?P<name>[^/]+)", fmt.Sprintf("(?P<project>[^/]+)/(?P<instance>[^/]+)/(?P<%s>[^/]+)", databaseField),
}, d, config) fmt.Sprintf("(?P<instance>[^/]+)/(?P<%s>[^/]+)", databaseField),
if err != nil { }, d, config)
return nil, fmt.Errorf("Error constructing id: %s", err) if err != nil {
return nil, fmt.Errorf("Error constructing id: %s", err)
}
id, err := buildSpannerDatabaseId(d, config)
if err != nil {
return nil, fmt.Errorf("Error constructing id: %s", err)
}
d.SetId(id.terraformId())
return []*schema.ResourceData{d}, nil
} }
id, err := buildSpannerDatabaseId(d, config)
if err != nil {
return nil, fmt.Errorf("Error constructing id: %s", err)
}
d.SetId(id.terraformId())
return []*schema.ResourceData{d}, nil
} }
func buildSpannerDatabaseId(d *schema.ResourceData, config *Config) (*spannerDatabaseId, error) { func buildSpannerDatabaseId(d *schema.ResourceData, config *Config) (*spannerDatabaseId, error) {
@ -164,7 +164,12 @@ func buildSpannerDatabaseId(d *schema.ResourceData, config *Config) (*spannerDat
if err != nil { if err != nil {
return nil, err return nil, err
} }
dbName := d.Get("name").(string) database, ok := d.GetOk("name")
if !ok {
database = d.Get("database")
}
dbName := database.(string)
instanceName := d.Get("instance").(string) instanceName := d.Get("instance").(string)
return &spannerDatabaseId{ return &spannerDatabaseId{
@ -196,18 +201,6 @@ func (s spannerDatabaseId) databaseUri() string {
return fmt.Sprintf("%s/databases/%s", s.parentInstanceUri(), s.Database) return fmt.Sprintf("%s/databases/%s", s.parentInstanceUri(), s.Database)
} }
func extractSpannerDatabaseId(id string) (*spannerDatabaseId, error) {
if !regexp.MustCompile(fmt.Sprintf("^%s/[a-z0-9-]+/%s$", ProjectRegex, spannerDatabaseNameFormat)).Match([]byte(id)) {
return nil, fmt.Errorf("Invalid spanner id format, expecting {projectId}/{instanceId}/{databaseId}")
}
parts := strings.Split(id, "/")
return &spannerDatabaseId{
Project: parts[0],
Instance: parts[1],
Database: parts[2],
}, nil
}
func validateResourceSpannerDatabaseName(v interface{}, k string) (ws []string, errors []error) { func validateResourceSpannerDatabaseName(v interface{}, k string) (ws []string, errors []error) {
value := v.(string) value := v.(string)