github.com/GoogleCloudPlatform/terraformer@v0.8.18/providers/gcp/bigquery.go (about)

     1  // Copyright 2018 The Terraformer Authors.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package gcp
    16  
    17  import (
    18  	"context"
    19  	"log"
    20  	"strings"
    21  
    22  	"github.com/GoogleCloudPlatform/terraformer/terraformutils"
    23  	"google.golang.org/api/bigquery/v2"
    24  )
    25  
    26  var bigQueryAllowEmptyValues = []string{""}
    27  
    28  type BigQueryGenerator struct {
    29  	GCPService
    30  }
    31  
    32  // Run on datasetsList and create for each TerraformResource
    33  func (g BigQueryGenerator) createDatasets(ctx context.Context, dataSetsList *bigquery.DatasetsListCall, bigQueryService *bigquery.Service) []terraformutils.Resource {
    34  	resources := []terraformutils.Resource{}
    35  	if err := dataSetsList.Pages(ctx, func(page *bigquery.DatasetList) error {
    36  		for _, dataset := range page.Datasets {
    37  			name := dataset.FriendlyName
    38  			if name == "" {
    39  				name = dataset.Id
    40  			}
    41  			ID := strings.Split(dataset.Id, ":")[1]
    42  			resources = append(resources, terraformutils.NewResource(
    43  				dataset.Id,
    44  				name,
    45  				"google_bigquery_dataset",
    46  				g.ProviderName,
    47  				map[string]string{
    48  					"project":    g.GetArgs()["project"].(string),
    49  					"dataset_id": ID,
    50  				},
    51  				bigQueryAllowEmptyValues,
    52  				map[string]interface{}{},
    53  			))
    54  			resources = append(resources, g.createResourcesTables(ctx, ID, bigQueryService)...)
    55  		}
    56  		return nil
    57  	}); err != nil {
    58  		log.Println(err)
    59  	}
    60  	return resources
    61  }
    62  
    63  func (g *BigQueryGenerator) createResourcesTables(ctx context.Context, datasetID string, bigQueryService *bigquery.Service) []terraformutils.Resource {
    64  	resources := []terraformutils.Resource{}
    65  	tableList := bigQueryService.Tables.List(g.Args["project"].(string), datasetID)
    66  	if err := tableList.Pages(ctx, func(page *bigquery.TableList) error {
    67  		for _, table := range page.Tables {
    68  			name := table.FriendlyName
    69  			if name == "" {
    70  				name = table.Id
    71  			}
    72  			ID := strings.Split(table.Id, ".")[1]
    73  			resources = append(resources, terraformutils.NewResource(
    74  				table.Id,
    75  				name,
    76  				"google_bigquery_table",
    77  				g.ProviderName,
    78  				map[string]string{
    79  					"project":    g.GetArgs()["project"].(string),
    80  					"table_id":   ID,
    81  					"dataset_id": datasetID,
    82  				},
    83  				bigQueryAllowEmptyValues,
    84  				map[string]interface{}{},
    85  			))
    86  		}
    87  		return nil
    88  	}); err != nil {
    89  		log.Println(err)
    90  	}
    91  	return resources
    92  }
    93  
    94  // Generate TerraformResources from GCP API,
    95  func (g *BigQueryGenerator) InitResources() error {
    96  	ctx := context.Background()
    97  	bigQueryService, err := bigquery.NewService(ctx)
    98  	if err != nil {
    99  		return err
   100  	}
   101  
   102  	datasetsList := bigQueryService.Datasets.List(g.GetArgs()["project"].(string))
   103  
   104  	g.Resources = g.createDatasets(ctx, datasetsList, bigQueryService)
   105  	return nil
   106  }
   107  
   108  // PostGenerateHook for convert schema json as heredoc
   109  func (g *BigQueryGenerator) PostConvertHook() error {
   110  	for i, dataset := range g.Resources {
   111  		if dataset.InstanceInfo.Type != "google_bigquery_dataset" {
   112  			continue
   113  		}
   114  		if val, ok := dataset.Item["default_table_expiration_ms"].(string); ok { // TODO zero int issue
   115  			if val == "0" {
   116  				delete(g.Resources[i].Item, "default_table_expiration_ms")
   117  			}
   118  		}
   119  		for j, table := range g.Resources {
   120  			if table.InstanceInfo.Type != "google_bigquery_table" {
   121  				continue
   122  			}
   123  			if table.InstanceState.Attributes["dataset_id"] == dataset.InstanceState.Attributes["dataset_id"] {
   124  				g.Resources[j].Item["dataset_id"] = "${google_bigquery_dataset." + dataset.ResourceName + ".dataset_id}"
   125  			}
   126  		}
   127  	}
   128  
   129  	return nil
   130  }