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  }