github.com/GoogleCloudPlatform/terraformer@v0.8.18/providers/aws/glue.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 aws 16 17 import ( 18 "context" 19 20 "github.com/GoogleCloudPlatform/terraformer/terraformutils" 21 "github.com/aws/aws-sdk-go-v2/service/glue" 22 ) 23 24 type GlueGenerator struct { 25 AWSService 26 } 27 28 func (g *GlueGenerator) loadGlueCrawlers(svc *glue.Client) error { 29 var GlueCrawlerAllowEmptyValues = []string{"tags."} 30 p := glue.NewGetCrawlersPaginator(svc, &glue.GetCrawlersInput{}) 31 for p.HasMorePages() { 32 page, err := p.NextPage(context.TODO()) 33 if err != nil { 34 return err 35 } 36 for _, crawler := range page.Crawlers { 37 resource := terraformutils.NewSimpleResource(*crawler.Name, *crawler.Name, 38 "aws_glue_crawler", 39 "aws", 40 GlueCrawlerAllowEmptyValues) 41 g.Resources = append(g.Resources, resource) 42 } 43 } 44 return nil 45 } 46 47 func (g *GlueGenerator) loadGlueCatalogDatabase(svc *glue.Client, account *string) (databaseNames []*string, error error) { 48 var GlueCatalogDatabaseAllowEmptyValues = []string{"tags."} 49 p := glue.NewGetDatabasesPaginator(svc, &glue.GetDatabasesInput{}) 50 for p.HasMorePages() { 51 page, error := p.NextPage(context.TODO()) 52 if error != nil { 53 return databaseNames, error 54 } 55 for _, catalogDatabase := range page.DatabaseList { 56 // format of ID is "CATALOG-ID:DATABASE-NAME". 57 // CATALOG-ID is AWS Account ID 58 // https://docs.aws.amazon.com/cli/latest/reference/glue/create-database.html#options 59 id := *account + ":" + *catalogDatabase.Name 60 resource := terraformutils.NewSimpleResource(id, *catalogDatabase.Name, 61 "aws_glue_catalog_database", 62 "aws", 63 GlueCatalogDatabaseAllowEmptyValues) 64 g.Resources = append(g.Resources, resource) 65 databaseNames = append(databaseNames, catalogDatabase.Name) 66 } 67 } 68 return databaseNames, nil 69 } 70 71 func (g *GlueGenerator) loadGlueCatalogTable(svc *glue.Client, account *string, databaseName *string) error { 72 // format of ID is "CATALOG-ID:DATABASE-NAME:TABLE-NAME". 73 // CATALOG-ID is AWS Account ID 74 // https://docs.aws.amazon.com/cli/latest/reference/glue/create-database.html#options 75 var GlueCatalogTableAllowEmptyValues = []string{"tags."} 76 p := glue.NewGetTablesPaginator(svc, &glue.GetTablesInput{DatabaseName: databaseName}) 77 for p.HasMorePages() { 78 page, err := p.NextPage(context.TODO()) 79 if err != nil { 80 return err 81 } 82 for _, catalogTable := range page.TableList { 83 databaseTable := *databaseName + ":" + *catalogTable.Name 84 id := *account + ":" + databaseTable 85 resource := terraformutils.NewSimpleResource(id, databaseTable, 86 "aws_glue_catalog_table", 87 "aws", 88 GlueCatalogTableAllowEmptyValues) 89 g.Resources = append(g.Resources, resource) 90 } 91 } 92 return nil 93 } 94 95 func (g *GlueGenerator) loadGlueJobs(svc *glue.Client) error { 96 var GlueJobAllowEmptyValues = []string{"tags."} 97 p := glue.NewGetJobsPaginator(svc, &glue.GetJobsInput{}) 98 for p.HasMorePages() { 99 page, err := p.NextPage(context.TODO()) 100 if err != nil { 101 return err 102 } 103 for _, job := range page.Jobs { 104 resource := terraformutils.NewSimpleResource(*job.Name, *job.Name, 105 "aws_glue_job", 106 "aws", 107 GlueJobAllowEmptyValues) 108 g.Resources = append(g.Resources, resource) 109 } 110 } 111 return nil 112 } 113 114 func (g *GlueGenerator) loadGlueTriggers(svc *glue.Client) error { 115 var GlueTriggerAllowEmptyValues = []string{"tags."} 116 p := glue.NewGetTriggersPaginator(svc, &glue.GetTriggersInput{}) 117 for p.HasMorePages() { 118 page, err := p.NextPage(context.TODO()) 119 if err != nil { 120 return err 121 } 122 for _, trigger := range page.Triggers { 123 resource := terraformutils.NewSimpleResource(*trigger.Name, *trigger.Name, 124 "aws_glue_trigger", 125 "aws", 126 GlueTriggerAllowEmptyValues) 127 g.Resources = append(g.Resources, resource) 128 } 129 } 130 return nil 131 } 132 133 // Generate TerraformResources from AWS API, 134 // from each database create 1 TerraformResource. 135 // Need only database name as ID for terraform resource 136 // AWS api support paging 137 func (g *GlueGenerator) InitResources() error { 138 config, e := g.generateConfig() 139 if e != nil { 140 return e 141 } 142 svc := glue.NewFromConfig(config) 143 144 account, err := g.getAccountNumber(config) 145 if err != nil { 146 return err 147 } 148 149 if err := g.loadGlueCrawlers(svc); err != nil { 150 return err 151 } 152 var DatabaseNames []*string 153 if DatabaseNames, err = g.loadGlueCatalogDatabase(svc, account); err != nil { 154 return err 155 } 156 for _, DatabaseName := range DatabaseNames { 157 if err := g.loadGlueCatalogTable(svc, account, DatabaseName); err != nil { 158 return err 159 } 160 } 161 162 if err := g.loadGlueJobs(svc); err != nil { 163 return err 164 } 165 166 if err := g.loadGlueTriggers(svc); err != nil { 167 return err 168 } 169 170 return nil 171 }