providers/gcp/bigquery.go (102 lines of code) (raw):
// Copyright 2018 The Terraformer Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package gcp
import (
"context"
"log"
"strings"
"github.com/GoogleCloudPlatform/terraformer/terraformutils"
"google.golang.org/api/bigquery/v2"
)
var bigQueryAllowEmptyValues = []string{""}
type BigQueryGenerator struct {
GCPService
}
// Run on datasetsList and create for each TerraformResource
func (g BigQueryGenerator) createDatasets(ctx context.Context, dataSetsList *bigquery.DatasetsListCall, bigQueryService *bigquery.Service) []terraformutils.Resource {
resources := []terraformutils.Resource{}
if err := dataSetsList.Pages(ctx, func(page *bigquery.DatasetList) error {
for _, dataset := range page.Datasets {
name := dataset.FriendlyName
if name == "" {
name = dataset.Id
}
ID := strings.Split(dataset.Id, ":")[1]
resources = append(resources, terraformutils.NewResource(
dataset.Id,
name,
"google_bigquery_dataset",
g.ProviderName,
map[string]string{
"project": g.GetArgs()["project"].(string),
"dataset_id": ID,
},
bigQueryAllowEmptyValues,
map[string]interface{}{},
))
resources = append(resources, g.createResourcesTables(ctx, ID, bigQueryService)...)
}
return nil
}); err != nil {
log.Println(err)
}
return resources
}
func (g *BigQueryGenerator) createResourcesTables(ctx context.Context, datasetID string, bigQueryService *bigquery.Service) []terraformutils.Resource {
resources := []terraformutils.Resource{}
tableList := bigQueryService.Tables.List(g.Args["project"].(string), datasetID)
if err := tableList.Pages(ctx, func(page *bigquery.TableList) error {
for _, table := range page.Tables {
name := table.FriendlyName
if name == "" {
name = table.Id
}
ID := strings.Split(table.Id, ".")[1]
resources = append(resources, terraformutils.NewResource(
table.Id,
name,
"google_bigquery_table",
g.ProviderName,
map[string]string{
"project": g.GetArgs()["project"].(string),
"table_id": ID,
"dataset_id": datasetID,
},
bigQueryAllowEmptyValues,
map[string]interface{}{},
))
}
return nil
}); err != nil {
log.Println(err)
}
return resources
}
// Generate TerraformResources from GCP API,
func (g *BigQueryGenerator) InitResources() error {
ctx := context.Background()
bigQueryService, err := bigquery.NewService(ctx)
if err != nil {
return err
}
datasetsList := bigQueryService.Datasets.List(g.GetArgs()["project"].(string))
g.Resources = g.createDatasets(ctx, datasetsList, bigQueryService)
return nil
}
// PostGenerateHook for convert schema json as heredoc
func (g *BigQueryGenerator) PostConvertHook() error {
for i, dataset := range g.Resources {
if dataset.InstanceInfo.Type != "google_bigquery_dataset" {
continue
}
if val, ok := dataset.Item["default_table_expiration_ms"].(string); ok { // TODO zero int issue
if val == "0" {
delete(g.Resources[i].Item, "default_table_expiration_ms")
}
}
for j, table := range g.Resources {
if table.InstanceInfo.Type != "google_bigquery_table" {
continue
}
if table.InstanceState.Attributes["dataset_id"] == dataset.InstanceState.Attributes["dataset_id"] {
g.Resources[j].Item["dataset_id"] = "${google_bigquery_dataset." + dataset.ResourceName + ".dataset_id}"
}
}
}
return nil
}