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 }