Skip to content

Commit

Permalink
Clean commit of adding bigquery resources
Browse files Browse the repository at this point in the history
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
  • Loading branch information
coffeepac committed Nov 5, 2015
1 parent 9e9d4b2 commit bfeaa9b
Show file tree
Hide file tree
Showing 9 changed files with 385 additions and 0 deletions.
9 changes: 9 additions & 0 deletions builtin/providers/google/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -33,6 +34,7 @@ type Config struct {
clientDns *dns.Service
clientStorage *storage.Service
clientSqlAdmin *sqladmin.Service
clientBigQuery *bigquery.Service
}

func (c *Config) loadAndValidate() error {
Expand Down Expand Up @@ -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
}

Expand Down
2 changes: 2 additions & 0 deletions builtin/providers/google/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down
73 changes: 73 additions & 0 deletions builtin/providers/google/resource_bigquery_dataset.go
Original file line number Diff line number Diff line change
@@ -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
}
68 changes: 68 additions & 0 deletions builtin/providers/google/resource_bigquery_dataset_test.go
Original file line number Diff line number Diff line change
@@ -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"
}`
77 changes: 77 additions & 0 deletions builtin/providers/google/resource_bigquery_table.go
Original file line number Diff line number Diff line change
@@ -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
}
74 changes: 74 additions & 0 deletions builtin/providers/google/resource_bigquery_table_test.go
Original file line number Diff line number Diff line change
@@ -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}"
}`

Original file line number Diff line number Diff line change
@@ -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.
Loading

0 comments on commit bfeaa9b

Please sign in to comment.