add error checking for bigquery dataset id (#1638)

* add error checking for bigquery dataset id

* use existing regexes for import validation
This commit is contained in:
Dana Hoffman 2018-06-11 14:20:11 -07:00 committed by GitHub
parent 665a3c19ae
commit f0c5b34a1d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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)
}