providers/aws/glue.go (133 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 aws import ( "context" "github.com/GoogleCloudPlatform/terraformer/terraformutils" "github.com/aws/aws-sdk-go-v2/service/glue" ) type GlueGenerator struct { AWSService } func (g *GlueGenerator) loadGlueCrawlers(svc *glue.Client) error { var GlueCrawlerAllowEmptyValues = []string{"tags."} p := glue.NewGetCrawlersPaginator(svc, &glue.GetCrawlersInput{}) for p.HasMorePages() { page, err := p.NextPage(context.TODO()) if err != nil { return err } for _, crawler := range page.Crawlers { resource := terraformutils.NewSimpleResource(*crawler.Name, *crawler.Name, "aws_glue_crawler", "aws", GlueCrawlerAllowEmptyValues) g.Resources = append(g.Resources, resource) } } return nil } func (g *GlueGenerator) loadGlueCatalogDatabase(svc *glue.Client, account *string) (databaseNames []*string, error error) { var GlueCatalogDatabaseAllowEmptyValues = []string{"tags."} p := glue.NewGetDatabasesPaginator(svc, &glue.GetDatabasesInput{}) for p.HasMorePages() { page, error := p.NextPage(context.TODO()) if error != nil { return databaseNames, error } for _, catalogDatabase := range page.DatabaseList { // format of ID is "CATALOG-ID:DATABASE-NAME". // CATALOG-ID is AWS Account ID // https://docs.aws.amazon.com/cli/latest/reference/glue/create-database.html#options id := *account + ":" + *catalogDatabase.Name resource := terraformutils.NewSimpleResource(id, *catalogDatabase.Name, "aws_glue_catalog_database", "aws", GlueCatalogDatabaseAllowEmptyValues) g.Resources = append(g.Resources, resource) databaseNames = append(databaseNames, catalogDatabase.Name) } } return databaseNames, nil } func (g *GlueGenerator) loadGlueCatalogTable(svc *glue.Client, account *string, databaseName *string) error { // format of ID is "CATALOG-ID:DATABASE-NAME:TABLE-NAME". // CATALOG-ID is AWS Account ID // https://docs.aws.amazon.com/cli/latest/reference/glue/create-database.html#options var GlueCatalogTableAllowEmptyValues = []string{"tags."} p := glue.NewGetTablesPaginator(svc, &glue.GetTablesInput{DatabaseName: databaseName}) for p.HasMorePages() { page, err := p.NextPage(context.TODO()) if err != nil { return err } for _, catalogTable := range page.TableList { databaseTable := *databaseName + ":" + *catalogTable.Name id := *account + ":" + databaseTable resource := terraformutils.NewSimpleResource(id, databaseTable, "aws_glue_catalog_table", "aws", GlueCatalogTableAllowEmptyValues) g.Resources = append(g.Resources, resource) } } return nil } func (g *GlueGenerator) loadGlueJobs(svc *glue.Client) error { var GlueJobAllowEmptyValues = []string{"tags."} p := glue.NewGetJobsPaginator(svc, &glue.GetJobsInput{}) for p.HasMorePages() { page, err := p.NextPage(context.TODO()) if err != nil { return err } for _, job := range page.Jobs { resource := terraformutils.NewSimpleResource(*job.Name, *job.Name, "aws_glue_job", "aws", GlueJobAllowEmptyValues) g.Resources = append(g.Resources, resource) } } return nil } func (g *GlueGenerator) loadGlueTriggers(svc *glue.Client) error { var GlueTriggerAllowEmptyValues = []string{"tags."} p := glue.NewGetTriggersPaginator(svc, &glue.GetTriggersInput{}) for p.HasMorePages() { page, err := p.NextPage(context.TODO()) if err != nil { return err } for _, trigger := range page.Triggers { resource := terraformutils.NewSimpleResource(*trigger.Name, *trigger.Name, "aws_glue_trigger", "aws", GlueTriggerAllowEmptyValues) g.Resources = append(g.Resources, resource) } } return nil } // Generate TerraformResources from AWS API, // from each database create 1 TerraformResource. // Need only database name as ID for terraform resource // AWS api support paging func (g *GlueGenerator) InitResources() error { config, e := g.generateConfig() if e != nil { return e } svc := glue.NewFromConfig(config) account, err := g.getAccountNumber(config) if err != nil { return err } if err := g.loadGlueCrawlers(svc); err != nil { return err } var DatabaseNames []*string if DatabaseNames, err = g.loadGlueCatalogDatabase(svc, account); err != nil { return err } for _, DatabaseName := range DatabaseNames { if err := g.loadGlueCatalogTable(svc, account, DatabaseName); err != nil { return err } } if err := g.loadGlueJobs(svc); err != nil { return err } if err := g.loadGlueTriggers(svc); err != nil { return err } return nil }