diff --git a/google/resource_bigquery_dataset.go b/google/resource_bigquery_dataset.go index 73eb6c06..f21a3f55 100644 --- a/google/resource_bigquery_dataset.go +++ b/google/resource_bigquery_dataset.go @@ -4,13 +4,14 @@ import ( "fmt" "log" "regexp" - "strings" "github.com/hashicorp/terraform/helper/schema" "github.com/hashicorp/terraform/helper/validation" "google.golang.org/api/bigquery/v2" ) +const datasetIdRegexp = `[0-9A-Za-z_]+` + func resourceBigQueryDataset() *schema.Resource { return &schema.Resource{ Create: resourceBigQueryDatasetCreate, @@ -30,7 +31,7 @@ func resourceBigQueryDataset() *schema.Resource { ForceNew: true, ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { value := v.(string) - if !regexp.MustCompile(`^[0-9A-Za-z_]+$`).MatchString(value) { + if !regexp.MustCompile(datasetIdRegexp).MatchString(value) { errors = append(errors, fmt.Errorf( "%q must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_)", k)) } @@ -209,25 +210,22 @@ func resourceBigQueryDatasetCreate(d *schema.ResourceData, meta interface{}) err return resourceBigQueryDatasetRead(d, meta) } -func resourceBigQueryDatasetParseID(id string) (string, string) { - // projectID, datasetID - parts := strings.Split(id, ":") - return parts[0], parts[1] -} - func resourceBigQueryDatasetRead(d *schema.ResourceData, meta interface{}) error { config := meta.(*Config) log.Printf("[INFO] Reading BigQuery dataset: %s", d.Id()) - projectID, datasetID := resourceBigQueryDatasetParseID(d.Id()) - - res, err := config.clientBigQuery.Datasets.Get(projectID, datasetID).Do() + id, err := parseBigQueryDatasetId(d.Id()) if err != nil { - return handleNotFoundError(err, d, fmt.Sprintf("BigQuery dataset %q", datasetID)) + return err } - d.Set("project", projectID) + res, err := config.clientBigQuery.Datasets.Get(id.Project, id.DatasetId).Do() + if err != nil { + return handleNotFoundError(err, d, fmt.Sprintf("BigQuery dataset %q", id.DatasetId)) + } + + d.Set("project", id.Project) d.Set("etag", res.Etag) d.Set("labels", res.Labels) d.Set("self_link", res.SelfLink) @@ -260,9 +258,12 @@ func resourceBigQueryDatasetUpdate(d *schema.ResourceData, meta interface{}) err log.Printf("[INFO] Updating BigQuery dataset: %s", d.Id()) - projectID, datasetID := resourceBigQueryDatasetParseID(d.Id()) + id, err := parseBigQueryDatasetId(d.Id()) + if err != nil { + return err + } - if _, err = config.clientBigQuery.Datasets.Update(projectID, datasetID, dataset).Do(); err != nil { + if _, err = config.clientBigQuery.Datasets.Update(id.Project, id.DatasetId, dataset).Do(); err != nil { return err } @@ -274,12 +275,32 @@ func resourceBigQueryDatasetDelete(d *schema.ResourceData, meta interface{}) err log.Printf("[INFO] Deleting BigQuery dataset: %s", d.Id()) - projectID, datasetID := resourceBigQueryDatasetParseID(d.Id()) + id, err := parseBigQueryDatasetId(d.Id()) + if err != nil { + return err + } - if err := config.clientBigQuery.Datasets.Delete(projectID, datasetID).Do(); err != nil { + if err := config.clientBigQuery.Datasets.Delete(id.Project, id.DatasetId).Do(); err != nil { return err } d.SetId("") return nil } + +type bigQueryDatasetId struct { + Project, DatasetId string +} + +func parseBigQueryDatasetId(id string) (*bigQueryDatasetId, error) { + pd := fmt.Sprintf("(%s):(%s)", ProjectRegex, datasetIdRegexp) + re := regexp.MustCompile(pd) + if parts := re.FindStringSubmatch(id); parts != nil { + return &bigQueryDatasetId{ + Project: parts[1], + DatasetId: parts[2], + }, nil + } + + return nil, fmt.Errorf("Invalid BigQuery dataset specifier. Expecting {project}:{dataset-id}, got %s", id) +}