mirror of
https://github.com/letic/terraform-provider-google.git
synced 2024-10-01 16:21:06 +00:00
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:
parent
665a3c19ae
commit
f0c5b34a1d
@ -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)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user