From bfeaa9bd5c45917de84d843b2ff22fff810ad63e Mon Sep 17 00:00:00 2001 From: pat Date: Tue, 3 Nov 2015 22:21:07 -0800 Subject: [PATCH] Clean commit of adding bigquery resources BigQuery is a managed database-like service. It supports SQL as a query language and nearly infinite scale. This PR adds support to manage tables and datasets. first cut, need to finish tests fully functional and the tests are looking good. this is a really thin wrapper around the create/delete portion of the API removed optional parameters, there is no update defined add docs for bigquery resources --- builtin/providers/google/config.go | 9 +++ builtin/providers/google/provider.go | 2 + .../google/resource_bigquery_dataset.go | 73 ++++++++++++++++++ .../google/resource_bigquery_dataset_test.go | 68 ++++++++++++++++ .../google/resource_bigquery_table.go | 77 +++++++++++++++++++ .../google/resource_bigquery_table_test.go | 74 ++++++++++++++++++ .../google/r/bigquery_dataset.html.markdown | 32 ++++++++ .../google/r/bigquery_table.html.markdown | 37 +++++++++ website/source/layouts/google.erb | 13 ++++ 9 files changed, 385 insertions(+) create mode 100644 builtin/providers/google/resource_bigquery_dataset.go create mode 100644 builtin/providers/google/resource_bigquery_dataset_test.go create mode 100644 builtin/providers/google/resource_bigquery_table.go create mode 100644 builtin/providers/google/resource_bigquery_table_test.go create mode 100644 website/source/docs/providers/google/r/bigquery_dataset.html.markdown create mode 100644 website/source/docs/providers/google/r/bigquery_table.html.markdown diff --git a/builtin/providers/google/config.go b/builtin/providers/google/config.go index 3edb68ef0f1d..e1794d05a4eb 100644 --- a/builtin/providers/google/config.go +++ b/builtin/providers/google/config.go @@ -19,6 +19,7 @@ import ( "google.golang.org/api/dns/v1" "google.golang.org/api/sqladmin/v1beta4" "google.golang.org/api/storage/v1" + "google.golang.org/api/bigquery/v2" ) // Config is the configuration structure used to instantiate the Google @@ -33,6 +34,7 @@ type Config struct { clientDns *dns.Service clientStorage *storage.Service clientSqlAdmin *sqladmin.Service + clientBigQuery *bigquery.Service } func (c *Config) loadAndValidate() error { @@ -158,6 +160,13 @@ func (c *Config) loadAndValidate() error { } c.clientSqlAdmin.UserAgent = userAgent + log.Printf("[INFO] Instantiating Google BigQuery Client...") + c.clientBigQuery, err = bigquery.New(client) + if err != nil { + return err + } + c.clientBigQuery.UserAgent = userAgent + return nil } diff --git a/builtin/providers/google/provider.go b/builtin/providers/google/provider.go index b63aa389c427..fe4fed6e8cb3 100644 --- a/builtin/providers/google/provider.go +++ b/builtin/providers/google/provider.go @@ -34,6 +34,8 @@ func Provider() terraform.ResourceProvider { }, ResourcesMap: map[string]*schema.Resource{ + "google_bigquery_dataset": resourceBigQueryDataset(), + "google_bigquery_table": resourceBigQueryTable(), "google_compute_autoscaler": resourceComputeAutoscaler(), "google_compute_address": resourceComputeAddress(), "google_compute_backend_service": resourceComputeBackendService(), diff --git a/builtin/providers/google/resource_bigquery_dataset.go b/builtin/providers/google/resource_bigquery_dataset.go new file mode 100644 index 000000000000..e0d0fba9b694 --- /dev/null +++ b/builtin/providers/google/resource_bigquery_dataset.go @@ -0,0 +1,73 @@ +package google + +import ( + "google.golang.org/api/bigquery/v2" + "github.com/hashicorp/terraform/helper/schema" +) + +func resourceBigQueryDataset() *schema.Resource { + return &schema.Resource{ + Create: resourceBigQueryDatasetCreate, + Read: resourceBigQueryDatasetRead, + Delete: resourceBigQueryDatasetDelete, + + Schema: map[string]*schema.Schema{ + "name": &schema.Schema{ + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + }, + } +} + +func resourceBigQueryDatasetCreate(d *schema.ResourceData, meta interface{}) error { + config := meta.(*Config) + + datasetName := d.Get("name").(string) + dRef := &bigquery.DatasetReference{DatasetId: datasetName, ProjectId: config.Project} + dataset := &bigquery.Dataset{DatasetReference: dRef} + if d.Get("FriendlyName") != nil { + dataset.FriendlyName = d.Get("FriendlyName").(string) + } + + call := config.clientBigQuery.Datasets.Insert(config.Project, dataset) + _, err := call.Do() + if err != nil { + return err + } + + err = resourceBigQueryDatasetRead(d, meta) + if err != nil { + return err + } + + return nil +} + +func resourceBigQueryDatasetRead(d *schema.ResourceData, meta interface{}) error { + config := meta.(*Config) + + call := config.clientBigQuery.Datasets.Get(config.Project, d.Get("name").(string)) + res, err := call.Do() + if err != nil { + return err + } + + d.SetId(res.Id) + return nil +} + + +func resourceBigQueryDatasetDelete(d *schema.ResourceData, meta interface{}) error { + config := meta.(*Config) + + call := config.clientBigQuery.Datasets.Delete(config.Project, d.Get("name").(string)) + err := call.Do() + if err != nil { + return err + } + + d.SetId("") + return nil +} diff --git a/builtin/providers/google/resource_bigquery_dataset_test.go b/builtin/providers/google/resource_bigquery_dataset_test.go new file mode 100644 index 000000000000..9b58be5e294e --- /dev/null +++ b/builtin/providers/google/resource_bigquery_dataset_test.go @@ -0,0 +1,68 @@ +package google + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/terraform" +) + +func TestAccBigqueryDatasetCreate(t *testing.T) { + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckBigQueryDatasetDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccBigQueryDataset, + Check: resource.ComposeTestCheckFunc( + testAccBigQueryDatasetExists( + "google_bigquery_dataset.foobar"), + ), + }, + }, + }) +} + +func testAccCheckBigQueryDatasetDestroy(s *terraform.State) error { + for _, rs := range s.RootModule().Resources { + if rs.Type != "google_bigquery_dataset" { + continue + } + + config := testAccProvider.Meta().(*Config) + _, err := config.clientBigQuery.Datasets.Get(config.Project, rs.Primary.Attributes["name"]).Do() + if err != nil { + fmt.Errorf("Dataset still present") + } + } + + return nil +} + +func testAccBigQueryDatasetExists(n string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("Not found: %s", n) + } + + if rs.Primary.ID == "" { + return fmt.Errorf("No ID is set") + } + config := testAccProvider.Meta().(*Config) + _, err := config.clientBigQuery.Datasets.Get(config.Project, rs.Primary.Attributes["name"]).Do() + if err != nil { + fmt.Errorf("BigQuery Dataset not present") + } + + return nil + } +} + +const testAccBigQueryDataset = ` +resource "google_bigquery_dataset" "foobar" { + name = "foobar" +}` diff --git a/builtin/providers/google/resource_bigquery_table.go b/builtin/providers/google/resource_bigquery_table.go new file mode 100644 index 000000000000..1856f3fba485 --- /dev/null +++ b/builtin/providers/google/resource_bigquery_table.go @@ -0,0 +1,77 @@ +package google + +import ( + "google.golang.org/api/bigquery/v2" + "github.com/hashicorp/terraform/helper/schema" +) + +func resourceBigQueryTable() *schema.Resource { + return &schema.Resource{ + Create: resourceBigQueryTableCreate, + Read: resourceBigQueryTableRead, + Delete: resourceBigQueryTableDelete, + + Schema: map[string]*schema.Schema{ + "name": &schema.Schema{ + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + + "datasetId": &schema.Schema{ + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + }, + } +} + +func resourceBigQueryTableCreate(d *schema.ResourceData, meta interface{}) error { + config := meta.(*Config) + + datasetId := d.Get("datasetId").(string) + tableName := d.Get("name").(string) + tRef := &bigquery.TableReference{DatasetId: datasetId, ProjectId: config.Project, TableId: tableName} + table := &bigquery.Table{TableReference: tRef} + + call := config.clientBigQuery.Tables.Insert(config.Project, datasetId, table) + _, err := call.Do() + if err != nil { + return err + } + + err = resourceBigQueryTableRead(d, meta) + if err != nil { + return err + } + + return nil +} + +func resourceBigQueryTableRead(d *schema.ResourceData, meta interface{}) error { + config := meta.(*Config) + + call := config.clientBigQuery.Tables.Get(config.Project, d.Get("datasetId").(string), d.Get("name").(string)) + res, err := call.Do() + if err != nil { + return err + } + + d.SetId(res.Id) + return nil +} + + +func resourceBigQueryTableDelete(d *schema.ResourceData, meta interface{}) error { + config := meta.(*Config) + + call := config.clientBigQuery.Tables.Delete(config.Project, d.Get("datasetId").(string), d.Get("name").(string)) + err := call.Do() + if err != nil { + return err + } + + d.SetId("") + return nil +} diff --git a/builtin/providers/google/resource_bigquery_table_test.go b/builtin/providers/google/resource_bigquery_table_test.go new file mode 100644 index 000000000000..0802ba402e89 --- /dev/null +++ b/builtin/providers/google/resource_bigquery_table_test.go @@ -0,0 +1,74 @@ +package google + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/terraform" +) + +func TestAccBigqueryTableCreate(t *testing.T) { + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckBigQueryTableDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccBigQueryTable, + Check: resource.ComposeTestCheckFunc( + testAccBigQueryTableExists( + "google_bigquery_table.foobar"), + ), + }, + }, + }) +} + +func testAccCheckBigQueryTableDestroy(s *terraform.State) error { + for _, rs := range s.RootModule().Resources { + if rs.Type != "google_bigquery_table" { + continue + } + + config := testAccProvider.Meta().(*Config) + _, err := config.clientBigQuery.Tables.Get(config.Project, rs.Primary.Attributes["datasetId"], rs.Primary.Attributes["name"]).Do() + if err != nil { + fmt.Errorf("Table still present") + } + } + + return nil +} + +func testAccBigQueryTableExists(n string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("Not found: %s", n) + } + + if rs.Primary.ID == "" { + return fmt.Errorf("No ID is set") + } + config := testAccProvider.Meta().(*Config) + _, err := config.clientBigQuery.Tables.Get(config.Project, rs.Primary.Attributes["datasetId"], rs.Primary.Attributes["name"]).Do() + if err != nil { + fmt.Errorf("BigQuery Table not present") + } + + return nil + } +} + +const testAccBigQueryTable = ` +resource "google_bigquery_dataset" "foobar" { + name = "foobar" +} + +resource "google_bigquery_table" "foobar" { + name = "foobar" + datasetId = "${google_bigquery_dataset.foobar.name}" +}` + diff --git a/website/source/docs/providers/google/r/bigquery_dataset.html.markdown b/website/source/docs/providers/google/r/bigquery_dataset.html.markdown new file mode 100644 index 000000000000..459c3e5d2ec2 --- /dev/null +++ b/website/source/docs/providers/google/r/bigquery_dataset.html.markdown @@ -0,0 +1,32 @@ +--- +layout: "google" +page_title: "Google: google_bigquery_dataset" +sidebar_current: "docs-google-bigquery-dataset" +description: |- + Manages a bigquery dataset +--- + +# google\_bigquery\_dataset + +Manages a bigquery dataset + +## Example Usage + +``` +resource "google_bigquery_dataset" "default" { + name = "test" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `name` - (Required) A unique name for the resource, required by GCE. + Changing this forces a new resource to be created. + +## Attributes Reference + +The following attributes are exported: + +* `name` - The name of the resource. diff --git a/website/source/docs/providers/google/r/bigquery_table.html.markdown b/website/source/docs/providers/google/r/bigquery_table.html.markdown new file mode 100644 index 000000000000..3b3604c488f8 --- /dev/null +++ b/website/source/docs/providers/google/r/bigquery_table.html.markdown @@ -0,0 +1,37 @@ +--- +layout: "google" +page_title: "Google: google_bigquery_table" +sidebar_current: "docs-google-bigquery-table" +description: |- + Manages a bigquery table +--- + +# google\_bigquery\_table + +Manages a bigquery table + +## Example Usage + +``` +resource "google_bigquery_table" "default" { + name = "test" + datasetId = "dataset_test" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `name` - (Required) A unique name for the resource, required by GCE. + Changing this forces a new resource to be created. + +* `datasetId` - (Required) The name of a dataset that this table will + be created in. Changing this forces a new resource to be created. + +## Attributes Reference + +The following attributes are exported: + +* `name` - The name of the resource. +* `datasetId` - The name of the containing dataset. diff --git a/website/source/layouts/google.erb b/website/source/layouts/google.erb index ed69df65c500..55b59399427e 100644 --- a/website/source/layouts/google.erb +++ b/website/source/layouts/google.erb @@ -10,6 +10,19 @@ Google Provider + > + Google BigQuery Resources + + + > Google Compute Engine Resources