providers/aws/api_gatewayv2.go (322 lines of code) (raw):

// Copyright 2020 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 ( "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/apigatewayv2" ) var apiGatewayV2AllowEmptyValues = []string{"tags.", "parent_id", "path_part"} type APIGatewayV2Generator struct { AWSService } func (g *APIGatewayV2Generator) InitResources() error { svc := apigatewayv2.New(session.Must(session.NewSession())) if err := g.loadRestApis(svc); err != nil { return err } if err := g.loadVpcLinks(svc); err != nil { return err } return nil } func (g *APIGatewayV2Generator) loadRestApis(svc *apigatewayv2.ApiGatewayV2) error { output, err := svc.GetApis(&apigatewayv2.GetApisInput{}) if err != nil { fmt.Println("Failed to list APIs:", err) return err } err = g.processRestApis(svc, output.Items) if err != nil { fmt.Println("Failed to list APIs:", err) return err } for output.NextToken != nil { output, err = svc.GetApis(&apigatewayv2.GetApisInput{ NextToken: output.NextToken, }) if err != nil { fmt.Println("Failed to list APIs:", err) return err } if err = g.processRestApis(svc, output.Items); err != nil { fmt.Println("Failed to list APIs:", err) return err } } return nil } func (g *APIGatewayV2Generator) processRestApis(svc *apigatewayv2.ApiGatewayV2, output []*apigatewayv2.Api) error { for _, restAPI := range output { g.Resources = append(g.Resources, terraformutils.NewSimpleResource( *restAPI.ApiId, *restAPI.ApiId+"_"+*restAPI.Name, "aws_apigatewayv2_api", "aws", apiGatewayV2AllowEmptyValues, )) if err := g.loadStages(svc, restAPI.ApiId); err != nil { return err } if err := g.loadModels(svc, restAPI.ApiId); err != nil { return err } if err := g.loadRoutes(svc, restAPI.ApiId); err != nil { return err } if err := g.loadAuthorizers(svc, restAPI.ApiId); err != nil { return err } } return nil } func (g *APIGatewayV2Generator) loadStages(svc *apigatewayv2.ApiGatewayV2, restAPIID *string) error { output, err := svc.GetStages(&apigatewayv2.GetStagesInput{ ApiId: restAPIID, }) if err != nil { return err } err = g.processStages(output.Items, restAPIID) if err != nil { return err } for output.NextToken != nil { output, err = svc.GetStages(&apigatewayv2.GetStagesInput{ NextToken: output.NextToken, }) if err != nil { return err } err = g.processStages(output.Items, restAPIID) if err != nil { return err } } return nil } func (g *APIGatewayV2Generator) processStages(output []*apigatewayv2.Stage, restAPIID *string) error { for _, stage := range output { stageID := *restAPIID + "/" + StringValue(stage.StageName) g.Resources = append(g.Resources, terraformutils.NewResource( stageID, stageID, "aws_api_gateway_stage", "aws", map[string]string{ "rest_api_id": *restAPIID, "stage_name": *stage.StageName, }, apiGatewayAllowEmptyValues, map[string]interface{}{}, )) } return nil } func (g *APIGatewayV2Generator) loadModels(svc *apigatewayv2.ApiGatewayV2, restAPIID *string) error { output, err := svc.GetModels( &apigatewayv2.GetModelsInput{ ApiId: restAPIID, }) if err != nil { return err } err = g.processModels(output.Items, restAPIID) if err != nil { return err } for output.NextToken != nil { output, err = svc.GetModels( &apigatewayv2.GetModelsInput{ NextToken: output.NextToken, }) if err != nil { return err } err = g.processModels(output.Items, restAPIID) if err != nil { return err } } return nil } func (g *APIGatewayV2Generator) processModels(output []*apigatewayv2.Model, restAPIID *string) error { for _, model := range output { g.Resources = append(g.Resources, terraformutils.NewResource( *model.ModelId, *model.ModelId, "aws_apigatewayv2_model", "aws", map[string]string{ "name": StringValue(model.Name), "content_type": StringValue(model.ContentType), "schema": StringValue(model.Schema), "api_id": StringValue(restAPIID), }, apiGatewayAllowEmptyValues, map[string]interface{}{}, )) } return nil } func (g *APIGatewayV2Generator) loadRoutes(svc *apigatewayv2.ApiGatewayV2, restAPIID *string) error { output, err := svc.GetRoutes( &apigatewayv2.GetRoutesInput{ ApiId: restAPIID, }) if err != nil { return err } err = g.processRoutes(svc, output.Items, restAPIID) if err != nil { return err } for output.NextToken != nil { output, err := svc.GetRoutes( &apigatewayv2.GetRoutesInput{ NextToken: output.NextToken, }) if err != nil { return err } err = g.processRoutes(svc, output.Items, restAPIID) if err != nil { return err } } return nil } func (g *APIGatewayV2Generator) processRoutes(svc *apigatewayv2.ApiGatewayV2, output []*apigatewayv2.Route, restAPIID *string) error { for _, route := range output { g.Resources = append(g.Resources, terraformutils.NewResource( *route.RouteId, *route.RouteId, "aws_apigatewayv2_route", "aws", map[string]string{ "api_id": *restAPIID, "route_key": *route.RouteKey, }, apiGatewayAllowEmptyValues, map[string]interface{}{}, )) if err := g.loadResponses(svc, restAPIID, route.RouteId); err != nil { return err } } return nil } func (g *APIGatewayV2Generator) loadResponses(svc *apigatewayv2.ApiGatewayV2, restAPIID *string, routeID *string) error { output, err := svc.GetRouteResponses( &apigatewayv2.GetRouteResponsesInput{ ApiId: restAPIID, RouteId: routeID, }) if err != nil { return err } err = g.processResponses(output.Items, restAPIID, routeID) if err != nil { return err } for output.NextToken != nil { output, err = svc.GetRouteResponses( &apigatewayv2.GetRouteResponsesInput{ NextToken: output.NextToken, }) if err != nil { return err } err = g.processResponses(output.Items, restAPIID, routeID) if err != nil { return err } } return nil } func (g *APIGatewayV2Generator) processResponses(output []*apigatewayv2.RouteResponse, restAPIID *string, routeID *string) error { for _, response := range output { g.Resources = append(g.Resources, terraformutils.NewResource( *response.RouteResponseId, *response.RouteResponseId, "aws_apigatewayv2_route_response", "aws", map[string]string{ "api_id": *restAPIID, "route_id": *routeID, "route_response_key": "$default", }, apiGatewayAllowEmptyValues, map[string]interface{}{}, )) } return nil } func (g *APIGatewayV2Generator) loadAuthorizers(svc *apigatewayv2.ApiGatewayV2, restAPIID *string) error { output, err := svc.GetAuthorizers( &apigatewayv2.GetAuthorizersInput{ ApiId: restAPIID, }) if err != nil { return err } g.processAuthorizers(output.Items, restAPIID) for output.NextToken != nil { output, err = svc.GetAuthorizers( &apigatewayv2.GetAuthorizersInput{ NextToken: output.NextToken, }) if err != nil { return err } g.processAuthorizers(output.Items, restAPIID) } return nil } func (g *APIGatewayV2Generator) processAuthorizers(output []*apigatewayv2.Authorizer, restAPIID *string) error { for _, authoriser := range output { g.Resources = append(g.Resources, terraformutils.NewResource( *authoriser.AuthorizerId, *authoriser.AuthorizerId, "aws_apigatewayv2_authorizer", "aws", map[string]string{ "api_id": *restAPIID, "name": StringValue(authoriser.Name), "authorizer_type": *authoriser.AuthorizerType, }, apiGatewayAllowEmptyValues, map[string]interface{}{}, )) } return nil } func (g *APIGatewayV2Generator) loadVpcLinks(svc *apigatewayv2.ApiGatewayV2) error { output, err := svc.GetVpcLinks( &apigatewayv2.GetVpcLinksInput{}) if err != nil { return err } g.processVpcLinks(output.Items) for output.NextToken != nil { output, err := svc.GetVpcLinks( &apigatewayv2.GetVpcLinksInput{ NextToken: output.NextToken, }) if err != nil { return err } g.processVpcLinks(output.Items) } return nil } func (g *APIGatewayV2Generator) processVpcLinks(output []*apigatewayv2.VpcLink) error { for _, vpcLink := range output { g.Resources = append(g.Resources, terraformutils.NewSimpleResource( *vpcLink.VpcLinkId, *vpcLink.VpcLinkId, "aws_apigatewayv2_vpc_link", "aws", apiGatewayAllowEmptyValues)) } return nil }