diff --git a/aws/plugin.go b/aws/plugin.go index dccce6615..0a6b6e3fb 100644 --- a/aws/plugin.go +++ b/aws/plugin.go @@ -7,6 +7,7 @@ package aws import ( "context" + "strings" "github.com/turbot/steampipe-plugin-sdk/v5/plugin" "github.com/turbot/steampipe-plugin-sdk/v5/plugin/transform" @@ -17,8 +18,9 @@ const pluginName = "steampipe-plugin-aws" // Plugin creates this (aws) plugin func Plugin(ctx context.Context) *plugin.Plugin { p := &plugin.Plugin{ - Name: pluginName, - DefaultTransform: transform.FromCamel(), + Name: pluginName, + DefaultTransform: transform.FromCamel(), + DefaultRetryConfig: pluginRetryConfig(), DefaultGetConfig: &plugin.GetConfig{ IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{ @@ -500,3 +502,27 @@ func Plugin(ctx context.Context) *plugin.Plugin { return p } + +func pluginRetryConfig() *plugin.RetryConfig { + return &plugin.RetryConfig{ + MaxAttempts: 20, + BackoffAlgorithm: "Exponential", + RetryInterval: 1000, + CappedDuration: 240000, + ShouldRetryErrorFunc: pluginRetryError, + } +} + +func pluginRetryError(ctx context.Context, d *plugin.QueryData, h *plugin.HydrateData, err error) bool { + if strings.Contains(err.Error(), "StatusCode: 408") { + plugin.Logger(ctx).Debug("pluginRetryError", "retrying 408", err.Error()) + return true + } + + if strings.Contains(err.Error(), "no such host") { + plugin.Logger(ctx).Debug("pluginRetryError", "no such host", err.Error()) + return true + } + + return false +} diff --git a/aws/table_aws_accessanalyzer_analyzer.go b/aws/table_aws_accessanalyzer_analyzer.go index 64a11a110..4e8ac237e 100644 --- a/aws/table_aws_accessanalyzer_analyzer.go +++ b/aws/table_aws_accessanalyzer_analyzer.go @@ -26,9 +26,11 @@ func tableAwsAccessAnalyzer(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "ValidationException", "InvalidParameter"}), }, Hydrate: getAccessAnalyzer, + Tags: map[string]string{"service": "access-analyzer", "action": "GetAnalyzer"}, }, List: &plugin.ListConfig{ Hydrate: listAccessAnalyzers, + Tags: map[string]string{"service": "access-analyzer", "action": "ListAnalyzers"}, KeyColumns: []*plugin.KeyColumn{ { Name: "type", @@ -36,6 +38,12 @@ func tableAwsAccessAnalyzer(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: listAccessAnalyzerFindings, + Tags: map[string]string{"service": "access-analyzer", "action": "ListFindings"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(accessanalyzerv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -150,6 +158,9 @@ func listAccessAnalyzers(ctx context.Context, d *plugin.QueryData, _ *plugin.Hyd }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_accessanalyzer_analyzer.listAccessAnalyzers", "api_error", err) @@ -218,6 +229,9 @@ func listAccessAnalyzerFindings(ctx context.Context, d *plugin.QueryData, h *plu }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_accessanalyzer_analyzer.listAccessAnalyzerFindings", "api_error", err) diff --git a/aws/table_aws_account.go b/aws/table_aws_account.go index fafb554fb..7d8678d1a 100644 --- a/aws/table_aws_account.go +++ b/aws/table_aws_account.go @@ -21,6 +21,13 @@ func tableAwsAccount(ctx context.Context) *plugin.Table { Description: "AWS Account", List: &plugin.ListConfig{ Hydrate: listAccountAlias, + Tags: map[string]string{"service": "iam", "action": "ListAccountAliases"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getOrganizationDetails, + Tags: map[string]string{"service": "organizations", "action": "DescribeOrganization"}, + }, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { diff --git a/aws/table_aws_account_alternate_contact.go b/aws/table_aws_account_alternate_contact.go index 6361addf8..5e8b54e8d 100644 --- a/aws/table_aws_account_alternate_contact.go +++ b/aws/table_aws_account_alternate_contact.go @@ -20,6 +20,7 @@ func tableAwsAccountAlternateContact(_ context.Context) *plugin.Table { Description: "AWS Account Alternate Contact", List: &plugin.ListConfig{ Hydrate: listAwsAccountAlternateContacts, + Tags: map[string]string{"service": "account", "action": "GetAlternateContact"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, diff --git a/aws/table_aws_account_contact.go b/aws/table_aws_account_contact.go index e02a80063..9f997cac5 100644 --- a/aws/table_aws_account_contact.go +++ b/aws/table_aws_account_contact.go @@ -20,6 +20,7 @@ func tableAwsAccountContact(_ context.Context) *plugin.Table { Description: "AWS Account Contact", List: &plugin.ListConfig{ Hydrate: listAwsAccountContacts, + Tags: map[string]string{"service": "account", "action": "GetContactInformation"}, KeyColumns: []*plugin.KeyColumn{ { Name: "linked_account_id", diff --git a/aws/table_aws_acm_certificate.go b/aws/table_aws_acm_certificate.go index 69bf4fd99..cb9859fd8 100644 --- a/aws/table_aws_acm_certificate.go +++ b/aws/table_aws_acm_certificate.go @@ -2,12 +2,14 @@ package aws import ( "context" + "errors" "fmt" "strings" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/acm" "github.com/aws/aws-sdk-go-v2/service/acm/types" + "github.com/aws/smithy-go" acmv1 "github.com/aws/aws-sdk-go/service/acm" @@ -25,9 +27,14 @@ func tableAwsAcmCertificate(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("certificate_arn"), Hydrate: getAwsAcmCertificateAttributes, + IgnoreConfig: &plugin.IgnoreConfig{ + ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), + }, + Tags: map[string]string{"service": "acm", "action": "DescribeCertificate"}, }, List: &plugin.ListConfig{ Hydrate: listAwsAcmCertificates, + Tags: map[string]string{"service": "acm", "action": "ListCertificates"}, KeyColumns: []*plugin.KeyColumn{ { Name: "status", @@ -39,6 +46,20 @@ func tableAwsAcmCertificate(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsAcmCertificateAttributes, + Tags: map[string]string{"service": "acm", "action": "DescribeCertificate"}, + }, + { + Func: getAwsAcmCertificateProperties, + Tags: map[string]string{"service": "acm", "action": "GetCertificate"}, + }, + { + Func: listTagsForAcmCertificate, + Tags: map[string]string{"service": "acm", "action": "ListTagsForCertificate"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(acmv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -280,6 +301,9 @@ func listAwsAcmCertificates(ctx context.Context, d *plugin.QueryData, _ *plugin. // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_acm_certificate.listAwsAcmCertificates", "api_error", err) @@ -322,6 +346,12 @@ func getAwsAcmCertificateAttributes(ctx context.Context, d *plugin.QueryData, h detail, err := svc.DescribeCertificate(ctx, params) if err != nil { + var ae smithy.APIError + if errors.As(err, &ae) { + if ae.ErrorCode() == "ResourceNotFoundException" { + return nil, nil + } + } plugin.Logger(ctx).Error("aws_acm_certificate.getAwsAcmCertificateAttributes", "api_error", err) return nil, err } @@ -368,6 +398,10 @@ func listTagsForAcmCertificate(ctx context.Context, d *plugin.QueryData, h *plug return nil, err } + if arn == nil { + return nil, nil + } + // Create session svc, err := ACMClient(ctx, d) if err != nil { @@ -389,11 +423,13 @@ func listTagsForAcmCertificate(ctx context.Context, d *plugin.QueryData, h *plug } func getCertificateArn(_ context.Context, d *plugin.QueryData, h *plugin.HydrateData) (*string, error) { - switch item := h.Item.(type) { - case *types.CertificateDetail: + if h.Item != nil { + switch item := h.Item.(type) { + case *types.CertificateDetail: return item.CertificateArn, nil - case types.CertificateSummary: + case types.CertificateSummary: return item.CertificateArn, nil + } } return nil, nil } diff --git a/aws/table_aws_amplify_app.go b/aws/table_aws_amplify_app.go index ff9bcc804..df002bd19 100644 --- a/aws/table_aws_amplify_app.go +++ b/aws/table_aws_amplify_app.go @@ -25,9 +25,11 @@ func tableAwsAmplifyApp(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationException", "NotFoundException"}), }, Hydrate: getAmplifyApp, + Tags: map[string]string{"service": "amplify", "action": "GetApp"}, }, List: &plugin.ListConfig{ Hydrate: listAmplifyApps, + Tags: map[string]string{"service": "amplify", "action": "ListApps"}, }, GetMatrixItemFunc: SupportedRegionMatrix(amplifyv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -205,6 +207,9 @@ func listAmplifyApps(ctx context.Context, d *plugin.QueryData, h *plugin.Hydrate pagesLeft := true for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.ListApps(ctx, input) if err != nil { plugin.Logger(ctx).Error("aws_amplify_app.listAmplifyApps", "api_error", err) diff --git a/aws/table_aws_api_gateway_api_authorizer.go b/aws/table_aws_api_gateway_api_authorizer.go index 0d37734a1..69beb2d63 100644 --- a/aws/table_aws_api_gateway_api_authorizer.go +++ b/aws/table_aws_api_gateway_api_authorizer.go @@ -27,10 +27,12 @@ func tableAwsAPIGatewayAuthorizer(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFoundException"}), }, Hydrate: getRestAPIAuthorizer, + Tags: map[string]string{"service": "apigateway", "action": "GetAuthorizer"}, }, List: &plugin.ListConfig{ ParentHydrate: listRestAPI, Hydrate: listRestAPIAuthorizers, + Tags: map[string]string{"service": "apigateway", "action": "GetAuthorizers"}, }, GetMatrixItemFunc: SupportedRegionMatrix(apigatewayv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ diff --git a/aws/table_aws_api_gateway_api_key.go b/aws/table_aws_api_gateway_api_key.go index 86909adae..3f73d7749 100644 --- a/aws/table_aws_api_gateway_api_key.go +++ b/aws/table_aws_api_gateway_api_key.go @@ -26,9 +26,11 @@ func tableAwsAPIGatewayAPIKey(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFoundException"}), }, Hydrate: getAPIKey, + Tags: map[string]string{"service": "apigateway", "action": "GetApiKey"}, }, List: &plugin.ListConfig{ Hydrate: listAPIKeys, + Tags: map[string]string{"service": "apigateway", "action": "GetApiKeys"}, KeyColumns: []*plugin.KeyColumn{ { Name: "customer_id", @@ -153,6 +155,9 @@ func listAPIKeys(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateData }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_api_gateway_rest_api.listAPIKeys", "api_error", err) diff --git a/aws/table_aws_api_gateway_domain_name.go b/aws/table_aws_api_gateway_domain_name.go index 3780c0e05..ba38f1eb1 100644 --- a/aws/table_aws_api_gateway_domain_name.go +++ b/aws/table_aws_api_gateway_domain_name.go @@ -26,9 +26,11 @@ func tableAwsAPIGatewayDomainName(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFoundException"}), }, Hydrate: getApiGatewayDomainName, + Tags: map[string]string{"service": "apigateway", "action": "GetDomainName"}, }, List: &plugin.ListConfig{ Hydrate: listApiGatewayDomainNames, + Tags: map[string]string{"service": "apigateway", "action": "GetDomainNames"}, }, GetMatrixItemFunc: SupportedRegionMatrix(apigatewayv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -170,6 +172,9 @@ func listApiGatewayDomainNames(ctx context.Context, d *plugin.QueryData, _ *plug // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_api_gateway_domain_name.listApiGatewayDomainNames", "api_error", err) diff --git a/aws/table_aws_api_gateway_rest_api.go b/aws/table_aws_api_gateway_rest_api.go index 050e2f4c8..902813bb2 100644 --- a/aws/table_aws_api_gateway_rest_api.go +++ b/aws/table_aws_api_gateway_rest_api.go @@ -31,9 +31,11 @@ func tableAwsAPIGatewayRestAPI(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFoundException"}), }, Hydrate: getRestAPI, + Tags: map[string]string{"service": "apigateway", "action": "GetRestApi"}, }, List: &plugin.ListConfig{ Hydrate: listRestAPI, + Tags: map[string]string{"service": "apigateway", "action": "GetRestApis"}, }, GetMatrixItemFunc: SupportedRegionMatrix(apigatewayv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -174,6 +176,9 @@ func listRestAPI(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateData // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_api_gateway_rest_api.listRestAPI", "api_error", err) diff --git a/aws/table_aws_api_gateway_stage.go b/aws/table_aws_api_gateway_stage.go index 155c0dd0b..dda258dd7 100644 --- a/aws/table_aws_api_gateway_stage.go +++ b/aws/table_aws_api_gateway_stage.go @@ -26,10 +26,12 @@ func tableAwsAPIGatewayStage(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFoundException"}), }, Hydrate: getAPIGatewayStage, + Tags: map[string]string{"service": "apigateway", "action": "GetStage"}, }, List: &plugin.ListConfig{ ParentHydrate: listRestAPI, Hydrate: listAPIGatewayStage, + Tags: map[string]string{"service": "apigateway", "action": "GetStages"}, }, GetMatrixItemFunc: SupportedRegionMatrix(apigatewayv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ diff --git a/aws/table_aws_api_gateway_usage_plan.go b/aws/table_aws_api_gateway_usage_plan.go index dccfe80d1..6ff9c2181 100644 --- a/aws/table_aws_api_gateway_usage_plan.go +++ b/aws/table_aws_api_gateway_usage_plan.go @@ -26,9 +26,11 @@ func tableAwsAPIGatewayUsagePlan(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFoundException"}), }, Hydrate: getUsagePlan, + Tags: map[string]string{"service": "apigateway", "action": "GetUsagePlan"}, }, List: &plugin.ListConfig{ Hydrate: listUsagePlans, + Tags: map[string]string{"service": "apigateway", "action": "GetUsagePlans"}, }, GetMatrixItemFunc: SupportedRegionMatrix(apigatewayv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -125,6 +127,9 @@ func listUsagePlans(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateD // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_api_gateway_rest_api.listUsagePlans", "api_error", err) diff --git a/aws/table_aws_api_gatewayv2_api.go b/aws/table_aws_api_gatewayv2_api.go index 71c04251c..2dccf7784 100644 --- a/aws/table_aws_api_gatewayv2_api.go +++ b/aws/table_aws_api_gatewayv2_api.go @@ -27,9 +27,11 @@ func tableAwsAPIGatewayV2Api(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFoundException"}), }, Hydrate: getAPIGatewayV2API, + Tags: map[string]string{"service": "apigateway", "action": "GetApi"}, }, List: &plugin.ListConfig{ Hydrate: listAPIGatewayV2API, + Tags: map[string]string{"service": "apigateway", "action": "GetApis"}, }, GetMatrixItemFunc: SupportedRegionMatrix(apigatewayv2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -135,6 +137,9 @@ func listAPIGatewayV2API(ctx context.Context, d *plugin.QueryData, _ *plugin.Hyd } for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.GetApis(ctx, params) if err != nil { logger.Error("aws_api_gatewayv2_api.listAPIGatewayV2API", "api_error", err) diff --git a/aws/table_aws_api_gatewayv2_domain_name.go b/aws/table_aws_api_gatewayv2_domain_name.go index 3794156cb..54156d38a 100644 --- a/aws/table_aws_api_gatewayv2_domain_name.go +++ b/aws/table_aws_api_gatewayv2_domain_name.go @@ -27,9 +27,11 @@ func tableAwsAPIGatewayV2DomainName(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFoundException"}), }, Hydrate: getDomainName, + Tags: map[string]string{"service": "apigateway", "action": "GetDomainName"}, }, List: &plugin.ListConfig{ Hydrate: listDomainNames, + Tags: map[string]string{"service": "apigateway", "action": "GetDomainNames"}, }, GetMatrixItemFunc: SupportedRegionMatrix(apigatewayv2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -111,6 +113,9 @@ func listDomainNames(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrate pagesLeft := true for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.GetDomainNames(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_api_gatewayv2_domain_name.listDomainNames", "api_error", err) diff --git a/aws/table_aws_api_gatewayv2_integration.go b/aws/table_aws_api_gatewayv2_integration.go index fb0b51f78..423e46e25 100644 --- a/aws/table_aws_api_gatewayv2_integration.go +++ b/aws/table_aws_api_gatewayv2_integration.go @@ -32,10 +32,12 @@ func tableAwsAPIGatewayV2Integration(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFoundException", "TooManyRequestsException"}), }, Hydrate: getAPIGatewayV2Integration, + Tags: map[string]string{"service": "apigateway", "action": "GetIntegration"}, }, List: &plugin.ListConfig{ ParentHydrate: listAPIGatewayV2API, Hydrate: listAPIGatewayV2Integrations, + Tags: map[string]string{"service": "apigateway", "action": "GetIntegrations"}, }, GetMatrixItemFunc: SupportedRegionMatrix(apigatewayv2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -207,6 +209,9 @@ func listAPIGatewayV2Integrations(ctx context.Context, d *plugin.QueryData, h *p } for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.GetIntegrations(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_api_gatewayv2_integration.listAPIGatewayV2Integrations", "api_error", err) diff --git a/aws/table_aws_api_gatewayv2_route.go b/aws/table_aws_api_gatewayv2_route.go index 2a02ba4c8..745e7f8ba 100644 --- a/aws/table_aws_api_gatewayv2_route.go +++ b/aws/table_aws_api_gatewayv2_route.go @@ -27,10 +27,12 @@ func tableAwsAPIGatewayV2Route(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFoundException"}), }, Hydrate: getAPIGatewayV2Route, + Tags: map[string]string{"service": "apigateway", "action": "GetRoute"}, }, List: &plugin.ListConfig{ ParentHydrate: listAPIGatewayV2API, Hydrate: listAPIGatewayV2Routes, + Tags: map[string]string{"service": "apigateway", "action": "GetRoutes"}, }, GetMatrixItemFunc: SupportedRegionMatrix(apigatewayv2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -173,6 +175,9 @@ func listAPIGatewayV2Routes(ctx context.Context, d *plugin.QueryData, h *plugin. } for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.GetRoutes(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_api_gatewayv2_route.listAPIGatewayV2Routes", "api_error", err) diff --git a/aws/table_aws_api_gatewayv2_stage.go b/aws/table_aws_api_gatewayv2_stage.go index 51e0a8fdf..5ff711b93 100644 --- a/aws/table_aws_api_gatewayv2_stage.go +++ b/aws/table_aws_api_gatewayv2_stage.go @@ -27,10 +27,12 @@ func tableAwsAPIGatewayV2Stage(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFoundException"}), }, Hydrate: getAPIGatewayV2Stage, + Tags: map[string]string{"service": "apigateway", "action": "GetStages"}, }, List: &plugin.ListConfig{ ParentHydrate: listAPIGatewayV2API, Hydrate: listAPIGatewayV2Stages, + Tags: map[string]string{"service": "apigateway", "action": "GetStages"}, }, GetMatrixItemFunc: SupportedRegionMatrix(apigatewayv2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -202,6 +204,9 @@ func listAPIGatewayV2Stages(ctx context.Context, d *plugin.QueryData, h *plugin. } for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.GetStages(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_api_gatewayv2_stage.listAPIGatewayV2Stages", "api_error", err) diff --git a/aws/table_aws_appautoscaling_policy.go b/aws/table_aws_appautoscaling_policy.go index e85904dc7..9e46cfae3 100644 --- a/aws/table_aws_appautoscaling_policy.go +++ b/aws/table_aws_appautoscaling_policy.go @@ -22,6 +22,7 @@ func tableAwsAppAutoScalingPolicy(_ context.Context) *plugin.Table { Description: "AWS Application Auto Scaling Policy", List: &plugin.ListConfig{ Hydrate: listAwsApplicationAutoScalingPolicies, + Tags: map[string]string{"service": "application-autoscaling", "action": "DescribeScalingPolicies"}, KeyColumns: []*plugin.KeyColumn{ { Name: "service_namespace", @@ -151,6 +152,9 @@ func listAwsApplicationAutoScalingPolicies(ctx context.Context, d *plugin.QueryD }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_appautoscaling_policy.listAwsApplicationAutoScalingPolicies", "api_error", err) diff --git a/aws/table_aws_appautoscaling_target.go b/aws/table_aws_appautoscaling_target.go index 90af59bb8..eafe4d4fc 100644 --- a/aws/table_aws_appautoscaling_target.go +++ b/aws/table_aws_appautoscaling_target.go @@ -23,6 +23,7 @@ func tableAwsAppAutoScalingTarget(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.AllColumns([]string{"service_namespace", "resource_id"}), Hydrate: getAwsApplicationAutoScalingTarget, + Tags: map[string]string{"service": "application-autoscaling", "action": "DescribeScalableTargets"}, }, List: &plugin.ListConfig{ Hydrate: listAwsApplicationAutoScalingTargets, @@ -141,6 +142,9 @@ func listAwsApplicationAutoScalingTargets(ctx context.Context, d *plugin.QueryDa }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_appautoscaling_target.listAwsApplicationAutoScalingTargets", "api_error", err) diff --git a/aws/table_aws_appconfig_application.go b/aws/table_aws_appconfig_application.go index f48e25334..ed9ee9f80 100644 --- a/aws/table_aws_appconfig_application.go +++ b/aws/table_aws_appconfig_application.go @@ -23,9 +23,17 @@ func tableAwsAppConfigApplication(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("id"), Hydrate: getAppConfigApplication, + Tags: map[string]string{"service": "appconfig", "action": "GetApplication"}, }, List: &plugin.ListConfig{ Hydrate: listAppConfigApplication, + Tags: map[string]string{"service": "appconfig", "action": "ListApplications"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAppConfigTags, + Tags: map[string]string{"service": "appconfig", "action": "ListTagsForResource"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(appconfigv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -111,6 +119,9 @@ func listAppConfigApplication(ctx context.Context, d *plugin.QueryData, _ *plugi }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_appconfig_application.listAppConfigApplication", "api_error", err) diff --git a/aws/table_aws_appstream_fleet.go b/aws/table_aws_appstream_fleet.go index c83629320..6530000ee 100644 --- a/aws/table_aws_appstream_fleet.go +++ b/aws/table_aws_appstream_fleet.go @@ -22,6 +22,7 @@ func tableAwsAppStreamFleet(_ context.Context) *plugin.Table { Description: "AWS AppStream Fleet", List: &plugin.ListConfig{ Hydrate: listAppStreamFleets, + Tags: map[string]string{"service": "appstream", "action": "DescribeFleets"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, @@ -32,6 +33,12 @@ func tableAwsAppStreamFleet(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAppStreamFleetTags, + Tags: map[string]string{"service": "appstream", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(appstreamv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -217,6 +224,9 @@ func listAppStreamFleets(ctx context.Context, d *plugin.QueryData, _ *plugin.Hyd pageLeft := true for pageLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + op, err := svc.DescribeFleets(ctx, params) if err != nil { diff --git a/aws/table_aws_appstream_image.go b/aws/table_aws_appstream_image.go index bab6d8f2b..1768616ec 100644 --- a/aws/table_aws_appstream_image.go +++ b/aws/table_aws_appstream_image.go @@ -23,6 +23,7 @@ func tableAwsAppStreamImage(_ context.Context) *plugin.Table { Description: "AWS AppStream Image", List: &plugin.ListConfig{ Hydrate: listAppStreamImages, + Tags: map[string]string{"service": "appstream", "action": "DescribeImages"}, KeyColumns: []*plugin.KeyColumn{ { Name: "name", @@ -34,6 +35,12 @@ func tableAwsAppStreamImage(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAppStreamTags, + Tags: map[string]string{"service": "appstream", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(appstreamv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -198,6 +205,9 @@ func listAppStreamImages(ctx context.Context, d *plugin.QueryData, _ *plugin.Hyd }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_appstream_image.listAppStreamImages", "api_error", err) @@ -250,4 +260,4 @@ func getAppStreamTags(ctx context.Context, d *plugin.QueryData, h *plugin.Hydrat } return tags.Tags, nil -} \ No newline at end of file +} diff --git a/aws/table_aws_athena_query_execution.go b/aws/table_aws_athena_query_execution.go index 8d8f93365..2fa75549f 100644 --- a/aws/table_aws_athena_query_execution.go +++ b/aws/table_aws_athena_query_execution.go @@ -22,10 +22,12 @@ func tableAwsAthenaQueryExecution(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("id"), Hydrate: getAwsAthenaQueryExecution, + Tags: map[string]string{"service": "athena", "action": "GetQueryExecution"}, }, List: &plugin.ListConfig{ ParentHydrate: listAwsAthenaWorkGroups, Hydrate: listAwsAthenaQueryExecutions, + Tags: map[string]string{"service": "athena", "action": "GetQueryExecutions"}, KeyColumns: plugin.KeyColumnSlice{ { Name: "workgroup", @@ -33,6 +35,12 @@ func tableAwsAthenaQueryExecution(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsAthenaQueryExecution, + Tags: map[string]string{"service": "athena", "action": "GetQueryExecution"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(athenav1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -311,6 +319,9 @@ func listAwsAthenaQueryExecutions(ctx context.Context, d *plugin.QueryData, h *p }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_athena_query_execution.listAwsAthenaQueryExecutions", "api_error", err) diff --git a/aws/table_aws_athena_workgroup.go b/aws/table_aws_athena_workgroup.go index 480a0bc32..8bbf8a0bc 100644 --- a/aws/table_aws_athena_workgroup.go +++ b/aws/table_aws_athena_workgroup.go @@ -21,9 +21,17 @@ func tableAwsAthenaWorkGroup(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("name"), Hydrate: getAwsAthenaWorkGroup, + Tags: map[string]string{"service": "athena", "action": "GetWorkGroup"}, }, List: &plugin.ListConfig{ Hydrate: listAwsAthenaWorkGroups, + Tags: map[string]string{"service": "athena", "action": "ListWorkGroups"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsAthenaWorkGroup, + Tags: map[string]string{"service": "athena", "action": "GetWorkGroup"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(athenav1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -178,6 +186,9 @@ func listAwsAthenaWorkGroups(ctx context.Context, d *plugin.QueryData, _ *plugin }) for workGroupsPaginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := workGroupsPaginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_athena_query_execution.listAwsAthenaWorkGroups", "api_error", err) diff --git a/aws/table_aws_auditmanager_assessment.go b/aws/table_aws_auditmanager_assessment.go index c846bc4df..00d0217f0 100644 --- a/aws/table_aws_auditmanager_assessment.go +++ b/aws/table_aws_auditmanager_assessment.go @@ -27,9 +27,17 @@ func tableAwsAuditManagerAssessment(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "ValidationException", "InvalidParameter"}), }, Hydrate: getAwsAuditManagerAssessment, + Tags: map[string]string{"service": "auditmanager", "action": "GetAssessment"}, }, List: &plugin.ListConfig{ Hydrate: listAwsAuditManagerAssessments, + Tags: map[string]string{"service": "auditmanager", "action": "ListAssessments"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsAuditManagerAssessment, + Tags: map[string]string{"service": "auditmanager", "action": "GetAssessment"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(auditmanagerv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -187,6 +195,9 @@ func listAwsAuditManagerAssessments(ctx context.Context, d *plugin.QueryData, _ }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { // User with Admin access gets the error as ‘AccessDeniedException: Please complete AWS Audit Manager setup from home page to enable this action in this account’ diff --git a/aws/table_aws_auditmanager_control.go b/aws/table_aws_auditmanager_control.go index 030f970c3..9a0077a20 100644 --- a/aws/table_aws_auditmanager_control.go +++ b/aws/table_aws_auditmanager_control.go @@ -23,12 +23,20 @@ func tableAwsAuditManagerControl(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("id"), Hydrate: getAuditManagerControl, + Tags: map[string]string{"service": "auditmanager", "action": "GetControl"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "ValidationException", "InvalidParameter"}), }, }, List: &plugin.ListConfig{ Hydrate: listAuditManagerControls, + Tags: map[string]string{"service": "auditmanager", "action": "ListControls"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAuditManagerControl, + Tags: map[string]string{"service": "auditmanager", "action": "GetControl"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(auditmanagerv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -175,6 +183,9 @@ func listAuditManagerControls(ctx context.Context, d *plugin.QueryData, _ *plugi // List standard controls for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { // User with Admin access gets the error as ‘AccessDeniedException: Please complete AWS Audit Manager setup from home page to enable this action in this account’ @@ -205,6 +216,9 @@ func listAuditManagerControls(ctx context.Context, d *plugin.QueryData, _ *plugi // List standard controls for paginatorCustom.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginatorCustom.NextPage(ctx) if err != nil { // User with Admin access gets the error as ‘AccessDeniedException: Please complete AWS Audit Manager setup from home page to enable this action in this account’ diff --git a/aws/table_aws_auditmanager_evidence.go b/aws/table_aws_auditmanager_evidence.go index a19e9aa9c..1ba48c8fc 100644 --- a/aws/table_aws_auditmanager_evidence.go +++ b/aws/table_aws_auditmanager_evidence.go @@ -34,10 +34,12 @@ func tableAwsAuditManagerEvidence(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "InvalidParameter"}), }, Hydrate: getAuditManagerEvidence, + Tags: map[string]string{"service": "auditmanager", "action": "GetEvidence"}, }, List: &plugin.ListConfig{ ParentHydrate: listAwsAuditManagerAssessments, Hydrate: listAuditManagerEvidences, + Tags: map[string]string{"service": "auditmanager", "action": "GetEvidenceByEvidenceFolder"}, }, GetMatrixItemFunc: SupportedRegionMatrix(auditmanagerv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -215,6 +217,9 @@ func listAuditManagerEvidences(ctx context.Context, d *plugin.QueryData, h *plug }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { // User with Admin access gets the error as ‘AccessDeniedException: Please complete AWS Audit Manager setup from home page to enable this action in this account’ diff --git a/aws/table_aws_auditmanager_evidence_folder.go b/aws/table_aws_auditmanager_evidence_folder.go index 9988e1d09..3be166880 100644 --- a/aws/table_aws_auditmanager_evidence_folder.go +++ b/aws/table_aws_auditmanager_evidence_folder.go @@ -27,10 +27,12 @@ func tableAwsAuditManagerEvidenceFolder(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "InvalidParameter"}), }, Hydrate: getAuditManagerEvidenceFolder, + Tags: map[string]string{"service": "auditmanager", "action": "GetEvidenceFolder"}, }, List: &plugin.ListConfig{ ParentHydrate: listAwsAuditManagerAssessments, Hydrate: listAuditManagerEvidenceFolders, + Tags: map[string]string{"service": "auditmanager", "action": "GetEvidenceFoldersByAssessment"}, }, GetMatrixItemFunc: SupportedRegionMatrix(auditmanagerv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -190,6 +192,9 @@ func listAuditManagerEvidenceFolders(ctx context.Context, d *plugin.QueryData, h }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { // User with Admin access gets the error as ‘AccessDeniedException: Please complete AWS Audit Manager setup from home page to enable this action in this account’ diff --git a/aws/table_aws_auditmanager_framework.go b/aws/table_aws_auditmanager_framework.go index ebbe5acb6..14b1c84a2 100644 --- a/aws/table_aws_auditmanager_framework.go +++ b/aws/table_aws_auditmanager_framework.go @@ -27,9 +27,17 @@ func tableAwsAuditManagerFramework(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "ValidationException", "InternalServerException"}), }, Hydrate: getAuditManagerFramework, + Tags: map[string]string{"service": "auditmanager", "action": "GetAssessmentFramework"}, }, List: &plugin.ListConfig{ Hydrate: listAuditManagerFrameworks, + Tags: map[string]string{"service": "auditmanager", "action": "ListAssessmentFrameworks"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAuditManagerFramework, + Tags: map[string]string{"service": "auditmanager", "action": "GetAssessmentFramework"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(auditmanagerv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -174,6 +182,9 @@ func listAuditManagerFrameworks(ctx context.Context, d *plugin.QueryData, _ *plu // List standard audit manager frameworks for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { // User with Admin access gets the error as ‘AccessDeniedException: Please complete AWS Audit Manager setup from home page to enable this action in this account’ @@ -203,6 +214,9 @@ func listAuditManagerFrameworks(ctx context.Context, d *plugin.QueryData, _ *plu // List standard audit manager frameworks for paginatorCustom.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginatorCustom.NextPage(ctx) if err != nil { // User with Admin access gets the error as ‘AccessDeniedException: Please complete AWS Audit Manager setup from home page to enable this action in this account’ diff --git a/aws/table_aws_availability_zone.go b/aws/table_aws_availability_zone.go index 8727dfec2..97e05bb1d 100644 --- a/aws/table_aws_availability_zone.go +++ b/aws/table_aws_availability_zone.go @@ -24,10 +24,12 @@ func tableAwsAvailabilityZone(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValue"}), }, Hydrate: getAwsAvailabilityZone, + Tags: map[string]string{"service": "ec2", "action": "DescribeAvailabilityZones"}, }, List: &plugin.ListConfig{ ParentHydrate: listAwsRegions, Hydrate: listAwsAvailabilityZones, + Tags: map[string]string{"service": "ec2", "action": "DescribeAvailabilityZones"}, KeyColumns: []*plugin.KeyColumn{ { Name: "name", @@ -176,7 +178,7 @@ func getAwsAvailabilityZone(ctx context.Context, d *plugin.QueryData, _ *plugin. ZoneNames: []string{name}, } - // execute list call + // execute get call op, err := svc.DescribeAvailabilityZones(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_availability_zone.getAwsAvailabilityZone", "api_error", err) diff --git a/aws/table_aws_backup_framework.go b/aws/table_aws_backup_framework.go index 9acd46546..9842432ca 100644 --- a/aws/table_aws_backup_framework.go +++ b/aws/table_aws_backup_framework.go @@ -28,9 +28,21 @@ func tableAwsBackupFramework(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValueException"}), }, Hydrate: getAwsBackupFramework, + Tags: map[string]string{"service": "backup", "action": "DescribeFramework"}, }, List: &plugin.ListConfig{ Hydrate: listAwsBackupFrameworks, + Tags: map[string]string{"service": "backup", "action": "ListFrameworks"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsBackupFramework, + Tags: map[string]string{"service": "backup", "action": "DescribeFramework"}, + }, + { + Func: listAwsBackupFrameworkTags, + Tags: map[string]string{"service": "backup", "action": "ListTags"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(backupv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -155,6 +167,9 @@ func listAwsBackupFrameworks(ctx context.Context, d *plugin.QueryData, _ *plugin // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_backup_framework.listAwsBackupFrameworks", "api_error", err) @@ -263,6 +278,9 @@ func listAwsBackupFrameworkTags(ctx context.Context, d *plugin.QueryData, h *plu // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_api_gateway_rest_api.listRestAPI", "api_error", err) diff --git a/aws/table_aws_backup_legal_hold.go b/aws/table_aws_backup_legal_hold.go index cb8c47f99..34195b903 100644 --- a/aws/table_aws_backup_legal_hold.go +++ b/aws/table_aws_backup_legal_hold.go @@ -26,9 +26,17 @@ func tableAwsBackupLegalHold(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValueException"}), }, Hydrate: getAwsBackupLegalHold, + Tags: map[string]string{"service": "backup", "action": "GetLegalHold"}, }, List: &plugin.ListConfig{ Hydrate: listAwsBackupLegalHolds, + Tags: map[string]string{"service": "backup", "action": "ListLegalHolds"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsBackupLegalHold, + Tags: map[string]string{"service": "backup", "action": "GetLegalHold"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(backupv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -130,6 +138,9 @@ func listAwsBackupLegalHolds(ctx context.Context, d *plugin.QueryData, _ *plugin // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_backup_legal_hold.listAwsBackupLegalHolds", "api_error", err) diff --git a/aws/table_aws_backup_plan.go b/aws/table_aws_backup_plan.go index d22ffa024..588586c76 100644 --- a/aws/table_aws_backup_plan.go +++ b/aws/table_aws_backup_plan.go @@ -26,9 +26,17 @@ func tableAwsBackupPlan(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValueException"}), }, Hydrate: getAwsBackupPlan, + Tags: map[string]string{"service": "backup", "action": "GetBackupPlan"}, }, List: &plugin.ListConfig{ Hydrate: listAwsBackupPlans, + Tags: map[string]string{"service": "backup", "action": "ListBackupPlans"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsBackupPlan, + Tags: map[string]string{"service": "backup", "action": "GetBackupPlan"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(backupv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -142,6 +150,9 @@ func listAwsBackupPlans(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydr // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_backup_plan.listAwsBackupPlans", "api_error", err) diff --git a/aws/table_aws_backup_protected_resource.go b/aws/table_aws_backup_protected_resource.go index fae651735..25034f0f9 100644 --- a/aws/table_aws_backup_protected_resource.go +++ b/aws/table_aws_backup_protected_resource.go @@ -26,9 +26,11 @@ func tableAwsBackupProtectedResource(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "InvalidParameter", "InvalidParameterValueException"}), }, Hydrate: getAwsBackupProtectedResource, + Tags: map[string]string{"service": "backup", "action": "DescribeProtectedResource"}, }, List: &plugin.ListConfig{ Hydrate: listAwsBackupProtectedResources, + Tags: map[string]string{"service": "backup", "action": "ListProtectedResources"}, }, GetMatrixItemFunc: SupportedRegionMatrix(backupv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -98,6 +100,9 @@ func listAwsBackupProtectedResources(ctx context.Context, d *plugin.QueryData, _ // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_backup_protected_resource.listAwsBackupProtectedResources", "api_error", err) diff --git a/aws/table_aws_backup_recovery_point.go b/aws/table_aws_backup_recovery_point.go index 0f3943262..5ac072e7a 100644 --- a/aws/table_aws_backup_recovery_point.go +++ b/aws/table_aws_backup_recovery_point.go @@ -28,10 +28,12 @@ func tableAwsBackupRecoveryPoint(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFoundException"}), }, Hydrate: getAwsBackupRecoveryPoint, + Tags: map[string]string{"service": "backup", "action": "DescribeRecoveryPoint"}, }, List: &plugin.ListConfig{ ParentHydrate: listAwsBackupVaults, Hydrate: listAwsBackupRecoveryPoints, + Tags: map[string]string{"service": "backup", "action": "ListRecoveryPointsByBackupVault"}, KeyColumns: []*plugin.KeyColumn{ // { // Name: "recovery_point_arn", @@ -213,6 +215,9 @@ func listAwsBackupRecoveryPoints(ctx context.Context, d *plugin.QueryData, h *pl // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { if strings.Contains(err.Error(), "not supported resource type") { diff --git a/aws/table_aws_backup_report_plan.go b/aws/table_aws_backup_report_plan.go index c805d44d5..6ab450d15 100644 --- a/aws/table_aws_backup_report_plan.go +++ b/aws/table_aws_backup_report_plan.go @@ -25,9 +25,11 @@ func tableAwsBackupReportPlan(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValueException", "ResourceNotFoundException"}), }, Hydrate: getAwsBackupReportPlan, + Tags: map[string]string{"service": "backup", "action": "DescribeReportPlan"}, }, List: &plugin.ListConfig{ Hydrate: listAwsBackupReportPlans, + Tags: map[string]string{"service": "backup", "action": "ListReportPlans"}, }, GetMatrixItemFunc: SupportedRegionMatrix(backupv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -121,7 +123,7 @@ func listAwsBackupReportPlans(ctx context.Context, d *plugin.QueryData, _ *plugi } } - input := &backup.ListReportPlansInput { + input := &backup.ListReportPlansInput{ MaxResults: aws.Int32(maxLimit), } @@ -132,6 +134,9 @@ func listAwsBackupReportPlans(ctx context.Context, d *plugin.QueryData, _ *plugi // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_backup_report_plan.listAwsBackupReportPlans", "api_error", err) @@ -173,7 +178,7 @@ func getAwsBackupReportPlan(ctx context.Context, d *plugin.QueryData, h *plugin. } params := &backup.DescribeReportPlanInput{ - ReportPlanName: aws.String(reportPlanName), + ReportPlanName: aws.String(reportPlanName), } op, err := svc.DescribeReportPlan(ctx, params) @@ -182,8 +187,8 @@ func getAwsBackupReportPlan(ctx context.Context, d *plugin.QueryData, h *plugin. } if op != nil { - return *op.ReportPlan, nil - } - - return nil, nil + return *op.ReportPlan, nil + } + + return nil, nil } diff --git a/aws/table_aws_backup_selection.go b/aws/table_aws_backup_selection.go index 73328d7ec..a4f0d102e 100644 --- a/aws/table_aws_backup_selection.go +++ b/aws/table_aws_backup_selection.go @@ -27,10 +27,18 @@ func tableAwsBackupSelection(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValue", "InvalidParameterValueException"}), }, Hydrate: getBackupSelection, + Tags: map[string]string{"service": "backup", "action": "GetBackupSelection"}, }, List: &plugin.ListConfig{ Hydrate: listBackupSelections, ParentHydrate: listAwsBackupPlans, + Tags: map[string]string{"service": "backup", "action": "ListBackupSelections"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getBackupSelection, + Tags: map[string]string{"service": "backup", "action": "GetBackupSelection"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(backupv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -149,6 +157,9 @@ func listBackupSelections(ctx context.Context, d *plugin.QueryData, h *plugin.Hy // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_backup_selection.listBackupSelections", "api_error", err) diff --git a/aws/table_aws_backup_vault.go b/aws/table_aws_backup_vault.go index f25c6b96f..ce89b36c7 100644 --- a/aws/table_aws_backup_vault.go +++ b/aws/table_aws_backup_vault.go @@ -31,9 +31,21 @@ func tableAwsBackupVault(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameter", "AccessDeniedException"}), }, Hydrate: getAwsBackupVault, + Tags: map[string]string{"service": "backup", "action": "DescribeBackupVault"}, }, List: &plugin.ListConfig{ Hydrate: listAwsBackupVaults, + Tags: map[string]string{"service": "backup", "action": "ListBackupVaults"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsBackupVaultNotification, + Tags: map[string]string{"service": "backup", "action": "GetBackupVaultNotifications"}, + }, + { + Func: getAwsBackupVaultAccessPolicy, + Tags: map[string]string{"service": "backup", "action": "GetBackupVaultAccessPolicy"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(backupv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -152,6 +164,9 @@ func listAwsBackupVaults(ctx context.Context, d *plugin.QueryData, _ *plugin.Hyd // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_backup_vault.listAwsBackupVaults", "api_error", err) diff --git a/aws/table_aws_cloudcontrol_resource.go b/aws/table_aws_cloudcontrol_resource.go index 8a77ea067..91d4cd9d6 100644 --- a/aws/table_aws_cloudcontrol_resource.go +++ b/aws/table_aws_cloudcontrol_resource.go @@ -25,6 +25,7 @@ func tableAwsCloudControlResource(_ context.Context) *plugin.Table { {Name: "resource_model", Require: plugin.Optional}, }, Hydrate: listCloudControlResources, + Tags: map[string]string{"service": "cloudformation", "action": "ListResources"}, }, Get: &plugin.GetConfig{ KeyColumns: []*plugin.KeyColumn{ @@ -32,6 +33,13 @@ func tableAwsCloudControlResource(_ context.Context) *plugin.Table { {Name: "identifier"}, }, Hydrate: getCloudControlResource, + Tags: map[string]string{"service": "cloudformation", "action": "GetResource"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCloudControlResource, + Tags: map[string]string{"service": "cloudformation", "action": "GetResource"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(cloudcontrolapiv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -112,6 +120,9 @@ func listCloudControlResources(ctx context.Context, d *plugin.QueryData, _ *plug }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_cloudcontrol_resource.listCloudControlResources", "api_error", err) diff --git a/aws/table_aws_cloudformation_stack.go b/aws/table_aws_cloudformation_stack.go index a0dd58535..e5743a8c8 100644 --- a/aws/table_aws_cloudformation_stack.go +++ b/aws/table_aws_cloudformation_stack.go @@ -26,9 +26,11 @@ func tableAwsCloudFormationStack(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationError", "ResourceNotFoundException"}), }, Hydrate: getCloudFormationStack, + Tags: map[string]string{"service": "cloudformation", "action": "DescribeStacks"}, }, List: &plugin.ListConfig{ Hydrate: listCloudFormationStacks, + Tags: map[string]string{"service": "cloudformation", "action": "DescribeStacks"}, KeyColumns: []*plugin.KeyColumn{ { Name: "name", @@ -36,6 +38,16 @@ func tableAwsCloudFormationStack(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getStackTemplate, + Tags: map[string]string{"service": "cloudformation", "action": "GetTemplate"}, + }, + { + Func: describeStackResources, + Tags: map[string]string{"service": "cloudformation", "action": "DescribeStackResources"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(cloudformationv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -207,6 +219,9 @@ func listCloudFormationStacks(ctx context.Context, d *plugin.QueryData, _ *plugi o.StopOnDuplicateToken = true }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_cloudformation_stack.listCloudFormationStacks", "api_error", err) diff --git a/aws/table_aws_cloudformation_stack_resource.go b/aws/table_aws_cloudformation_stack_resource.go index c129afab8..947d3f5a6 100644 --- a/aws/table_aws_cloudformation_stack_resource.go +++ b/aws/table_aws_cloudformation_stack_resource.go @@ -26,10 +26,12 @@ func tableAwsCloudFormationStackResource(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationError", "ResourceNotFoundException"}), }, Hydrate: getCloudFormationStackResource, + Tags: map[string]string{"service": "cloudformation", "action": "DescribeStackResource"}, }, List: &plugin.ListConfig{ ParentHydrate: listCloudFormationStacks, Hydrate: listCloudFormationStackResources, + Tags: map[string]string{"service": "cloudformation", "action": "ListStackResources"}, KeyColumns: []*plugin.KeyColumn{ { Name: "stack_name", @@ -37,6 +39,12 @@ func tableAwsCloudFormationStackResource(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCloudFormationStackResource, + Tags: map[string]string{"service": "cloudformation", "action": "DescribeStackResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(cloudformationv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -144,6 +152,9 @@ func listCloudFormationStackResources(ctx context.Context, d *plugin.QueryData, o.StopOnDuplicateToken = true }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_cloudformation_stack_resource.listCloudFormationStackResources", "api_error", err) diff --git a/aws/table_aws_cloudformation_stack_set.go b/aws/table_aws_cloudformation_stack_set.go index a5d2b5f28..4b67ac307 100644 --- a/aws/table_aws_cloudformation_stack_set.go +++ b/aws/table_aws_cloudformation_stack_set.go @@ -26,9 +26,11 @@ func tableAwsCloudFormationStackSet(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"StackSetNotFoundException"}), }, Hydrate: getCloudFormationStackSet, + Tags: map[string]string{"service": "cloudformation", "action": "DescribeStackSet"}, }, List: &plugin.ListConfig{ Hydrate: listCloudFormationStackSets, + Tags: map[string]string{"service": "cloudformation", "action": "ListStackSets"}, KeyColumns: []*plugin.KeyColumn{ { Name: "status", @@ -36,6 +38,12 @@ func tableAwsCloudFormationStackSet(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCloudFormationStackSet, + Tags: map[string]string{"service": "cloudformation", "action": "DescribeStackSet"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(cloudformationv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -186,7 +194,7 @@ func listCloudFormationStackSets(ctx context.Context, d *plugin.QueryData, _ *pl if d.QueryContext.Limit != nil { limit := int32(*d.QueryContext.Limit) if limit < maxLimit { - maxLimit = limit + maxLimit = limit } } status := d.EqualsQualString("status") @@ -203,6 +211,9 @@ func listCloudFormationStackSets(ctx context.Context, d *plugin.QueryData, _ *pl o.StopOnDuplicateToken = true }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_cloudformation_stack_set.listCloudFormationStackSets", "api_error", err) @@ -251,7 +262,6 @@ func getCloudFormationStackSet(ctx context.Context, d *plugin.QueryData, h *plug return nil, nil } - params := &cloudformation.DescribeStackSetInput{ StackSetName: aws.String(name), } diff --git a/aws/table_aws_cloudfront_cache_policy.go b/aws/table_aws_cloudfront_cache_policy.go index bac15df7e..c3a2ec0a6 100644 --- a/aws/table_aws_cloudfront_cache_policy.go +++ b/aws/table_aws_cloudfront_cache_policy.go @@ -24,9 +24,17 @@ func tableAwsCloudFrontCachePolicy(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchCachePolicy"}), }, Hydrate: getCloudFrontCachePolicy, + Tags: map[string]string{"service": "cloudfront", "action": "GetCachePolicy"}, }, List: &plugin.ListConfig{ Hydrate: listCloudFrontCachePolicies, + Tags: map[string]string{"service": "cloudfront", "action": "ListCachePolicies"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCloudFrontCachePolicy, + Tags: map[string]string{"service": "cloudfront", "action": "GetCachePolicy"}, + }, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { @@ -136,6 +144,9 @@ func listCloudFrontCachePolicies(ctx context.Context, d *plugin.QueryData, _ *pl // Paginator not avilable for API ListCachePolicies pagesLeft := true for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.ListCachePolicies(ctx, input) if err != nil { plugin.Logger(ctx).Error("aws_cloudfront_cache_policy.listCloudFrontCachePolicies", "api_error", err) diff --git a/aws/table_aws_cloudfront_distribution.go b/aws/table_aws_cloudfront_distribution.go index 293e3612c..f2f970edf 100644 --- a/aws/table_aws_cloudfront_distribution.go +++ b/aws/table_aws_cloudfront_distribution.go @@ -23,9 +23,21 @@ func tableAwsCloudFrontDistribution(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchDistribution"}), }, Hydrate: getCloudFrontDistribution, + Tags: map[string]string{"service": "cloudfront", "action": "GetDistribution"}, }, List: &plugin.ListConfig{ Hydrate: listAwsCloudFrontDistributions, + Tags: map[string]string{"service": "cloudfront", "action": "ListDistributions"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCloudFrontDistribution, + Tags: map[string]string{"service": "cloudfront", "action": "GetDistribution"}, + }, + { + Func: getCloudFrontDistributionTags, + Tags: map[string]string{"service": "cloudfront", "action": "ListTagsForResource"}, + }, }, Columns: awsRegionalColumns([]*plugin.Column{ { @@ -263,6 +275,9 @@ func listAwsCloudFrontDistributions(ctx context.Context, d *plugin.QueryData, _ }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_cloudfront_distribution.listAwsCloudFrontDistributions", "api_error", err) diff --git a/aws/table_aws_cloudfront_function.go b/aws/table_aws_cloudfront_function.go index 93203eed8..2995edb42 100644 --- a/aws/table_aws_cloudfront_function.go +++ b/aws/table_aws_cloudfront_function.go @@ -24,9 +24,17 @@ func tableAwsCloudFrontFunction(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchFunctionExists"}), }, Hydrate: getCloudFrontFunction, + Tags: map[string]string{"service": "cloudfront", "action": "GetFunction"}, }, List: &plugin.ListConfig{ Hydrate: listCloudWatchFunctions, + Tags: map[string]string{"service": "cloudfront", "action": "ListFunctions"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCloudFrontFunction, + Tags: map[string]string{"service": "cloudfront", "action": "GetFunction"}, + }, }, Columns: awsRegionalColumns([]*plugin.Column{ { @@ -116,6 +124,9 @@ func listCloudWatchFunctions(ctx context.Context, d *plugin.QueryData, h *plugin // Paginator not available for the API pagesLeft := true for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + // List CloudFront functions data, err := svc.ListFunctions(ctx, input) if err != nil { diff --git a/aws/table_aws_cloudfront_origin_access_identity.go b/aws/table_aws_cloudfront_origin_access_identity.go index 37ee41607..e48cdfb7e 100644 --- a/aws/table_aws_cloudfront_origin_access_identity.go +++ b/aws/table_aws_cloudfront_origin_access_identity.go @@ -23,9 +23,17 @@ func tableAwsCloudFrontOriginAccessIdentity(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchCloudFrontOriginAccessIdentity"}), }, Hydrate: getCloudFrontOriginAccessIdentity, + Tags: map[string]string{"service": "cloudfront", "action": "GetCloudFrontOriginAccessIdentity"}, }, List: &plugin.ListConfig{ Hydrate: listCloudFrontOriginAccessIdentities, + Tags: map[string]string{"service": "cloudfront", "action": "ListCloudFrontOriginAccessIdentities"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCloudFrontOriginAccessIdentity, + Tags: map[string]string{"service": "cloudfront", "action": "GetCloudFrontOriginAccessIdentity"}, + }, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { @@ -122,6 +130,9 @@ func listCloudFrontOriginAccessIdentities(ctx context.Context, d *plugin.QueryDa }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_cloudfront_origin_access_identity.listCloudFrontOriginAccessIdentities", "api_error", err) diff --git a/aws/table_aws_cloudfront_origin_request_policy.go b/aws/table_aws_cloudfront_origin_request_policy.go index 2e473c367..9fd681c22 100644 --- a/aws/table_aws_cloudfront_origin_request_policy.go +++ b/aws/table_aws_cloudfront_origin_request_policy.go @@ -24,9 +24,17 @@ func tableAwsCloudFrontOriginRequestPolicy(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchOriginRequestPolicy", "InvalidParameter"}), }, Hydrate: getCloudFrontOriginRequestPolicy, + Tags: map[string]string{"service": "cloudfront", "action": "GetOriginRequestPolicy"}, }, List: &plugin.ListConfig{ Hydrate: listCloudFrontOriginRequestPolicies, + Tags: map[string]string{"service": "cloudfront", "action": "ListOriginRequestPolicies"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCloudFrontOriginRequestPolicy, + Tags: map[string]string{"service": "cloudfront", "action": "GetOriginRequestPolicy"}, + }, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { @@ -129,6 +137,9 @@ func listCloudFrontOriginRequestPolicies(ctx context.Context, d *plugin.QueryDat pagesLeft := true for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + response, err := svc.ListOriginRequestPolicies(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_cloudfront_origin_request_policy.listCloudFrontOriginRequestPolicies", "api_error", err) diff --git a/aws/table_aws_cloudfront_response_headers_policy.go b/aws/table_aws_cloudfront_response_headers_policy.go index 7441ee7ff..2b369291f 100644 --- a/aws/table_aws_cloudfront_response_headers_policy.go +++ b/aws/table_aws_cloudfront_response_headers_policy.go @@ -25,6 +25,13 @@ func tableAwsCloudFrontResponseHeadersPolicy(_ context.Context) *plugin.Table { }, }, Hydrate: listCloudFrontResponseHeadersPolicies, + Tags: map[string]string{"service": "cloudfront", "action": "ListResponseHeadersPolicies"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getETagValue, + Tags: map[string]string{"service": "cloudfront", "action": "GetResponseHeadersPolicy"}, + }, }, Columns: awsRegionalColumns([]*plugin.Column{ { @@ -127,6 +134,9 @@ func listCloudFrontResponseHeadersPolicies(ctx context.Context, d *plugin.QueryD // Paginator not avilable for the API pagesLeft := true for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + data, err := svc.ListResponseHeadersPolicies(ctx, input) if err != nil { plugin.Logger(ctx).Error("aws_cloudfront_response_headers_policy.listCloudFrontResponseHeadersPolicies", "api_error", err) diff --git a/aws/table_aws_cloudsearch_domain.go b/aws/table_aws_cloudsearch_domain.go index ed1696fcb..5ad750aa0 100644 --- a/aws/table_aws_cloudsearch_domain.go +++ b/aws/table_aws_cloudsearch_domain.go @@ -23,9 +23,17 @@ func tableAwsCloudSearchDomain(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("domain_name"), Hydrate: getCloudSearchDomain, + Tags: map[string]string{"service": "cloudsearch", "action": "DescribeDomains"}, }, List: &plugin.ListConfig{ Hydrate: listCloudSearchDomains, + Tags: map[string]string{"service": "cloudsearch", "action": "ListDomainNames"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCloudSearchDomain, + Tags: map[string]string{"service": "cloudsearch", "action": "DescribeDomains"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(cloudsearchv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ diff --git a/aws/table_aws_cloudtrail_channel.go b/aws/table_aws_cloudtrail_channel.go index 93fb67eef..35f7f6ec3 100644 --- a/aws/table_aws_cloudtrail_channel.go +++ b/aws/table_aws_cloudtrail_channel.go @@ -23,12 +23,20 @@ func tableAwsCloudtrailChannel(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("arn"), Hydrate: getCloudTrailChannel, + Tags: map[string]string{"service": "cloudtrail", "action": "GetChannel"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ChannelNotFoundException"}), }, }, List: &plugin.ListConfig{ Hydrate: listCloudTrailChannels, + Tags: map[string]string{"service": "cloudtrail", "action": "ListChannels"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCloudSearchDomain, + Tags: map[string]string{"service": "cloudtrail", "action": "GetChannel"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(cloudtrailv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -124,6 +132,9 @@ func listCloudTrailChannels(ctx context.Context, d *plugin.QueryData, _ *plugin. // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_cloudtrail_channel.listCloudTrailChannels", "api_error", err) diff --git a/aws/table_aws_cloudtrail_event_data_store.go b/aws/table_aws_cloudtrail_event_data_store.go index 754ebf0ef..f921c6f92 100644 --- a/aws/table_aws_cloudtrail_event_data_store.go +++ b/aws/table_aws_cloudtrail_event_data_store.go @@ -23,9 +23,17 @@ func tableAwsCloudtrailEventDataStore(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("arn"), Hydrate: getCloudTrailEventDataStore, + Tags: map[string]string{"service": "cloudtrail", "action": "GetEventDataStore"}, }, List: &plugin.ListConfig{ Hydrate: listCloudTrailEventDataStores, + Tags: map[string]string{"service": "cloudtrail", "action": "ListEventDataStores"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCloudTrailEventDataStore, + Tags: map[string]string{"service": "cloudtrail", "action": "GetEventDataStore"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(cloudtrailv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -137,6 +145,9 @@ func listCloudTrailEventDataStores(ctx context.Context, d *plugin.QueryData, _ * // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_cloudtrail_event_data_store.listCloudTrailEventDataStores", "api_error", err) diff --git a/aws/table_aws_cloudtrail_import.go b/aws/table_aws_cloudtrail_import.go index 29e7464a3..c99150ff8 100644 --- a/aws/table_aws_cloudtrail_import.go +++ b/aws/table_aws_cloudtrail_import.go @@ -23,12 +23,14 @@ func tableAwsCloudtrailImport(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("import_id"), Hydrate: getCloudTrailImport, + Tags: map[string]string{"service": "cloudtrail", "action": "GetImport"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"UnsupportedOperationException", "ImportNotFoundException"}), }, }, List: &plugin.ListConfig{ Hydrate: listCloudTrailImports, + Tags: map[string]string{"service": "cloudtrail", "action": "ListImports"}, // For the location where the API operation is not supported, we receive UnsupportedOperationException. IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"UnsupportedOperationException"}), @@ -40,6 +42,12 @@ func tableAwsCloudtrailImport(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCloudTrailImport, + Tags: map[string]string{"service": "cloudtrail", "action": "GetImport"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(cloudtrailv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -138,6 +146,9 @@ func listCloudTrailImports(ctx context.Context, d *plugin.QueryData, _ *plugin.H // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_cloudtrail_import.listCloudTrailImports", "api_error", err) diff --git a/aws/table_aws_cloudtrail_query.go b/aws/table_aws_cloudtrail_query.go index 397568f54..90e1c2145 100644 --- a/aws/table_aws_cloudtrail_query.go +++ b/aws/table_aws_cloudtrail_query.go @@ -23,6 +23,7 @@ func tableAwsCloudTrailQuery(_ context.Context) *plugin.Table { Description: "AWS CloudTrail Query", Get: &plugin.GetConfig{ Hydrate: getCloudTrailQuery, + Tags: map[string]string{"service": "cloudtrail", "action": "DescribeQuery"}, KeyColumns: plugin.AllColumns([]string{"event_data_store_arn", "query_id"}), IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"EventDataStoreNotFoundException", "QueryIdNotFoundException"}), @@ -31,6 +32,7 @@ func tableAwsCloudTrailQuery(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listCloudTrailEventDataStores, Hydrate: listCloudTrailLakeQueries, + Tags: map[string]string{"service": "cloudtrail", "action": "ListQueries"}, KeyColumns: plugin.KeyColumnSlice{ { Name: "event_data_store_arn", @@ -47,6 +49,12 @@ func tableAwsCloudTrailQuery(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCloudTrailQuery, + Tags: map[string]string{"service": "cloudtrail", "action": "DescribeQuery"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(cloudtrailv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -203,6 +211,9 @@ func listCloudTrailLakeQueries(ctx context.Context, d *plugin.QueryData, h *plug }) if paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + op, err := paginator.NextPage(ctx) if err != nil { // You cannot act on an event data store that is inactive. This error could not be caught by configuring it in ignore config diff --git a/aws/table_aws_cloudtrail_trail.go b/aws/table_aws_cloudtrail_trail.go index a4f55fcf4..51bcf10c3 100644 --- a/aws/table_aws_cloudtrail_trail.go +++ b/aws/table_aws_cloudtrail_trail.go @@ -30,13 +30,33 @@ func tableAwsCloudtrailTrail(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidTrailNameException", "TrailNotFoundException", "CloudTrailARNInvalidException"}), }, Hydrate: getCloudtrailTrail, + Tags: map[string]string{"service": "cloudtrail", "action": "DescribeTrails"}, }, List: &plugin.ListConfig{ Hydrate: listCloudtrailTrails, + Tags: map[string]string{"service": "cloudtrail", "action": "DescribeTrails"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidTrailNameException", "TrailNotFoundException", "CloudTrailARNInvalidException"}), }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCloudtrailTrailStatus, + Tags: map[string]string{"service": "cloudtrail", "action": "GetTrailStatus"}, + }, + { + Func: getCloudtrailTrailEventSelector, + Tags: map[string]string{"service": "cloudtrail", "action": "GetEventSelectors"}, + }, + { + Func: getCloudtrailTrailInsightSelector, + Tags: map[string]string{"service": "cloudtrail", "action": "GetInsightSelectors"}, + }, + { + Func: getCloudtrailTrailTags, + Tags: map[string]string{"service": "cloudtrail", "action": "ListTags"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(cloudtrailv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { diff --git a/aws/table_aws_cloudtrail_trail_event.go b/aws/table_aws_cloudtrail_trail_event.go index 31aac9fd7..bca0a0fff 100644 --- a/aws/table_aws_cloudtrail_trail_event.go +++ b/aws/table_aws_cloudtrail_trail_event.go @@ -26,6 +26,7 @@ func tableAwsCloudtrailTrailEvent(_ context.Context) *plugin.Table { Description: "CloudTrail events from cloudwatch service.", List: &plugin.ListConfig{ Hydrate: listCloudwatchLogTrailEvents, + Tags: map[string]string{"service": "logs", "action": "FilterLogEvents"}, KeyColumns: tableAwsCloudtrailEventsListKeyColumns(), IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), @@ -299,6 +300,10 @@ func listCloudwatchLogTrailEvents(ctx context.Context, d *plugin.QueryData, _ *p }) // List call for paginator.HasMorePages() { + + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_cloudtrail_trail_event.listCloudwatchLogTrailEvents", "api_error", err) diff --git a/aws/table_aws_cloudwatch_alarm.go b/aws/table_aws_cloudwatch_alarm.go index 822791c4e..ebb7099c7 100644 --- a/aws/table_aws_cloudwatch_alarm.go +++ b/aws/table_aws_cloudwatch_alarm.go @@ -23,9 +23,11 @@ func tableAwsCloudWatchAlarm(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("name"), Hydrate: getCloudWatchAlarm, + Tags: map[string]string{"service": "cloudwatch", "action": "DescribeAlarms"}, }, List: &plugin.ListConfig{ Hydrate: listCloudWatchAlarms, + Tags: map[string]string{"service": "cloudwatch", "action": "DescribeAlarms"}, KeyColumns: []*plugin.KeyColumn{ { Name: "name", @@ -37,6 +39,12 @@ func tableAwsCloudWatchAlarm(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsCloudWatchAlarmTags, + Tags: map[string]string{"service": "cloudwatch", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(cloudwatchv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -251,6 +259,9 @@ func listCloudWatchAlarms(ctx context.Context, d *plugin.QueryData, _ *plugin.Hy // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_cloudwatch_alarm.listCloudWatchAlarms", "api_error", err) diff --git a/aws/table_aws_cloudwatch_log_event.go b/aws/table_aws_cloudwatch_log_event.go index 25f2de520..8e19149e8 100644 --- a/aws/table_aws_cloudwatch_log_event.go +++ b/aws/table_aws_cloudwatch_log_event.go @@ -34,6 +34,7 @@ func tableAwsCloudwatchLogEvent(_ context.Context) *plugin.Table { Description: "AWS CloudWatch Log Event", List: &plugin.ListConfig{ Hydrate: listCloudwatchLogEvents, + Tags: map[string]string{"service": "logs", "action": "FilterLogEvents"}, KeyColumns: tableAwsCloudwatchLogEventListKeyColumns(), IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), @@ -170,6 +171,9 @@ func listCloudwatchLogEvents(ctx context.Context, d *plugin.QueryData, _ *plugin // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_cloudwatch_alarm.listCloudWatchAlarms", "api_error", err) diff --git a/aws/table_aws_cloudwatch_log_group.go b/aws/table_aws_cloudwatch_log_group.go index 4e5fd1ac2..673ab0a1d 100644 --- a/aws/table_aws_cloudwatch_log_group.go +++ b/aws/table_aws_cloudwatch_log_group.go @@ -22,9 +22,21 @@ func tableAwsCloudwatchLogGroup(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("name"), Hydrate: getCloudwatchLogGroup, + Tags: map[string]string{"service": "logs", "action": "DescribeLogGroups"}, }, List: &plugin.ListConfig{ Hydrate: listCloudwatchLogGroups, + Tags: map[string]string{"service": "logs", "action": "DescribeLogGroups"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCloudwatchLogGroupDataProtectionPolicy, + Tags: map[string]string{"service": "logs", "action": "GetDataProtectionPolicy"}, + }, + { + Func: getLogGroupTagging, + Tags: map[string]string{"service": "logs", "action": "ListTagsForResource"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(cloudwatchlogsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -139,6 +151,9 @@ func listCloudwatchLogGroups(ctx context.Context, d *plugin.QueryData, _ *plugin }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_cloudwatch_log_group.listCloudwatchLogGroups", "api_error", err) diff --git a/aws/table_aws_cloudwatch_log_metric_filter.go b/aws/table_aws_cloudwatch_log_metric_filter.go index cbf87187b..3a2f18803 100644 --- a/aws/table_aws_cloudwatch_log_metric_filter.go +++ b/aws/table_aws_cloudwatch_log_metric_filter.go @@ -21,9 +21,11 @@ func tableAwsCloudwatchLogMetricFilter(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("name"), Hydrate: getCloudwatchLogMetricFilter, + Tags: map[string]string{"service": "logs", "action": "DescribeMetricFilters"}, }, List: &plugin.ListConfig{ Hydrate: listCloudwatchLogMetricFilters, + Tags: map[string]string{"service": "logs", "action": "DescribeMetricFilters"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, @@ -155,6 +157,9 @@ func listCloudwatchLogMetricFilters(ctx context.Context, d *plugin.QueryData, _ }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_cloudwatch_log_metric_filter.listCloudwatchLogMetricFilters", "api_error", err) diff --git a/aws/table_aws_cloudwatch_log_resource_policy.go b/aws/table_aws_cloudwatch_log_resource_policy.go index 9f88d6c5e..8188faf76 100644 --- a/aws/table_aws_cloudwatch_log_resource_policy.go +++ b/aws/table_aws_cloudwatch_log_resource_policy.go @@ -18,6 +18,7 @@ func tableAwsCloudwatchLogResourcePolicy(_ context.Context) *plugin.Table { Description: "AWS CloudWatch Log Resource Policy", List: &plugin.ListConfig{ Hydrate: listCloudwatchLogResourcePolicies, + Tags: map[string]string{"service": "logs", "action": "DescribeResourcePolicies"}, }, GetMatrixItemFunc: SupportedRegionMatrix(cloudwatchlogsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -88,6 +89,9 @@ func listCloudwatchLogResourcePolicies(ctx context.Context, d *plugin.QueryData, // This API doesn't have Paginator available for { + // apply rate limiting + d.WaitForListRateLimit(ctx) + resp, err := svc.DescribeResourcePolicies(ctx, input) if err != nil { plugin.Logger(ctx).Error("aws_cloudwatch_log_resource_policy.listCloudwatchLogResourcePolicies", "api_error", err) diff --git a/aws/table_aws_cloudwatch_log_stream.go b/aws/table_aws_cloudwatch_log_stream.go index 93a96e0f6..925fcf7fb 100644 --- a/aws/table_aws_cloudwatch_log_stream.go +++ b/aws/table_aws_cloudwatch_log_stream.go @@ -28,10 +28,12 @@ func tableAwsCloudwatchLogStream(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.AllColumns([]string{"log_group_name", "name"}), Hydrate: getCloudwatchLogStream, + Tags: map[string]string{"service": "logs", "action": "DescribeLogStreams"}, }, List: &plugin.ListConfig{ ParentHydrate: listCloudwatchLogGroups, Hydrate: listCloudwatchLogStreams, + Tags: map[string]string{"service": "logs", "action": "DescribeLogStreams"}, KeyColumns: []*plugin.KeyColumn{ { Name: "name", @@ -149,6 +151,9 @@ func listCloudwatchLogStreams(ctx context.Context, d *plugin.QueryData, h *plugi } for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Info("aws_cloudwatch_log_group.listCloudwatchLogGroups", "api_error", err) diff --git a/aws/table_aws_cloudwatch_log_subscription_filter.go b/aws/table_aws_cloudwatch_log_subscription_filter.go index a9b423e48..15901212f 100644 --- a/aws/table_aws_cloudwatch_log_subscription_filter.go +++ b/aws/table_aws_cloudwatch_log_subscription_filter.go @@ -23,10 +23,12 @@ func tableAwsCloudwatchLogSubscriptionFilter(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.AllColumns([]string{"name", "log_group_name"}), Hydrate: getCloudwatchLogSubscriptionFilter, + Tags: map[string]string{"service": "logs", "action": "DescribeSubscriptionFilters"}, }, List: &plugin.ListConfig{ Hydrate: listCloudwatchLogSubscriptionFilters, ParentHydrate: listCloudwatchLogGroups, + Tags: map[string]string{"service": "logs", "action": "DescribeSubscriptionFilters"}, KeyColumns: []*plugin.KeyColumn{ { Name: "name", @@ -148,6 +150,9 @@ func listCloudwatchLogSubscriptionFilters(ctx context.Context, d *plugin.QueryDa }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_cloudwatch_alarm.listCloudWatchAlarms", "api_error", err) diff --git a/aws/table_aws_cloudwatch_metric.go b/aws/table_aws_cloudwatch_metric.go index c3007e74f..689a4a646 100644 --- a/aws/table_aws_cloudwatch_metric.go +++ b/aws/table_aws_cloudwatch_metric.go @@ -24,6 +24,7 @@ func tableAwsCloudWatchMetric(_ context.Context) *plugin.Table { Description: "AWS CloudWatch Metric", List: &plugin.ListConfig{ Hydrate: listCloudWatchMetrics, + Tags: map[string]string{"service": "cloudwatch", "action": "ListMetrics"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValue"}), }, @@ -124,6 +125,9 @@ func listCloudWatchMetrics(ctx context.Context, d *plugin.QueryData, _ *plugin.H }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Info("aws_cloudwatch_metric.listCloudWatchMetrics", "api_error", err) diff --git a/aws/table_aws_cloudwatch_metric_data_point.go b/aws/table_aws_cloudwatch_metric_data_point.go index e877be3c6..cb117e865 100644 --- a/aws/table_aws_cloudwatch_metric_data_point.go +++ b/aws/table_aws_cloudwatch_metric_data_point.go @@ -24,6 +24,7 @@ func tableAwsCloudWatchMetricDataPoint(_ context.Context) *plugin.Table { Description: "AWS CloudWatch Metric Data Point", List: &plugin.ListConfig{ Hydrate: listCloudWatchMetricDataPoints, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricData"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValue"}), }, @@ -263,6 +264,9 @@ func listCloudWatchMetricDataPoints(ctx context.Context, d *plugin.QueryData, h } for { + // apply rate limiting + d.WaitForListRateLimit(ctx) + data, err := svc.GetMetricData(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_cloudwatch_metric_data_point.listCloudWatchMetricDataPoints", "api_error", err) diff --git a/aws/table_aws_cloudwatch_metric_statistic_data_point.go b/aws/table_aws_cloudwatch_metric_statistic_data_point.go index ecae5b885..fa943aa67 100644 --- a/aws/table_aws_cloudwatch_metric_statistic_data_point.go +++ b/aws/table_aws_cloudwatch_metric_statistic_data_point.go @@ -23,6 +23,7 @@ func tableAwsCloudWatchMetricStatisticDataPoint(_ context.Context) *plugin.Table Description: "AWS CloudWatch Metric Statistic Data Point", List: &plugin.ListConfig{ Hydrate: listCloudWatchMetricStatisticDataPoints, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValue"}), }, diff --git a/aws/table_aws_codeartifact_domain.go b/aws/table_aws_codeartifact_domain.go index bf409cb43..9492c847b 100644 --- a/aws/table_aws_codeartifact_domain.go +++ b/aws/table_aws_codeartifact_domain.go @@ -33,9 +33,25 @@ func tableAwsCodeArtifactDomain(_ context.Context) *plugin.Table { }, }, Hydrate: getCodeArtifactDomain, + Tags: map[string]string{"service": "codeartifact", "action": "DescribeDomain"}, }, List: &plugin.ListConfig{ Hydrate: listCodeArtifactDomains, + Tags: map[string]string{"service": "codeartifact", "action": "ListDomains"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCodeArtifactDomainTags, + Tags: map[string]string{"service": "codeartifact", "action": "ListTagsForResource"}, + }, + { + Func: getCodeArtifactDomainPermissionsPolicy, + Tags: map[string]string{"service": "codeartifact", "action": "GetDomainPermissionsPolicy"}, + }, + { + Func: getCodeArtifactDomain, + Tags: map[string]string{"service": "codeartifact", "action": "DescribeDomain"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(codeartifactv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -173,6 +189,9 @@ func listCodeArtifactDomains(ctx context.Context, d *plugin.QueryData, _ *plugin }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_codeartifact_domain.listCodeArtifactDomains", "api_error", err) diff --git a/aws/table_aws_codeartifact_repository.go b/aws/table_aws_codeartifact_repository.go index eb981bcff..f48d3a356 100644 --- a/aws/table_aws_codeartifact_repository.go +++ b/aws/table_aws_codeartifact_repository.go @@ -37,14 +37,29 @@ func tableAwsCodeArtifactRepository(_ context.Context) *plugin.Table { }, }, Hydrate: getCodeArtifactRepository, + Tags: map[string]string{"service": "codeartifact", "action": "DescribeRepository"}, }, List: &plugin.ListConfig{ Hydrate: listCodeArtifactRepositories, + Tags: map[string]string{"service": "codeartifact", "action": "ListRepositories"}, }, HydrateConfig: []plugin.HydrateConfig{ { Func: getCodeArtifactRepositoryEndpoints, Depends: []plugin.HydrateFunc{getCodeArtifactRepository}, + Tags: map[string]string{"service": "codeartifact", "action": "GetRepositoryEndpoint"}, + }, + { + Func: getCodeArtifactRepositoryTags, + Tags: map[string]string{"service": "codeartifact", "action": "ListTagsForResource"}, + }, + { + Func: getCodeArtifactRepositoryPermissionsPolicy, + Tags: map[string]string{"service": "codeartifact", "action": "GetRepositoryPermissionsPolicy"}, + }, + { + Func: getCodeArtifactRepository, + Tags: map[string]string{"service": "codeartifact", "action": "DescribeRepository"}, }, }, GetMatrixItemFunc: SupportedRegionMatrix(codeartifactv1.EndpointsID), @@ -184,6 +199,9 @@ func listCodeArtifactRepositories(ctx context.Context, d *plugin.QueryData, h *p }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_codeartifact_repository.listCodeArtifactRepositories", "api_error", err) diff --git a/aws/table_aws_codebuild_build.go b/aws/table_aws_codebuild_build.go index 4741132fa..d0b2ee4e5 100644 --- a/aws/table_aws_codebuild_build.go +++ b/aws/table_aws_codebuild_build.go @@ -18,6 +18,7 @@ func tableAwsCodeBuildBuild(_ context.Context) *plugin.Table { Description: "AWS CodeBuild Build", List: &plugin.ListConfig{ Hydrate: listCodeBuildBuilds, + Tags: map[string]string{"service": "codebuild", "action": "ListBuilds"}, KeyColumns: []*plugin.KeyColumn{ { Name: "id", @@ -246,6 +247,9 @@ func listCodeBuildBuilds(ctx context.Context, d *plugin.QueryData, h *plugin.Hyd // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_codebuild_build.listCodeBuildBuilds", "api_error", err) diff --git a/aws/table_aws_codebuild_project.go b/aws/table_aws_codebuild_project.go index c80569ef7..934baba5d 100644 --- a/aws/table_aws_codebuild_project.go +++ b/aws/table_aws_codebuild_project.go @@ -26,9 +26,17 @@ func tableAwsCodeBuildProject(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidInputException"}), }, Hydrate: getCodeBuildProject, + Tags: map[string]string{"service": "codebuild", "action": "BatchGetProjects"}, }, List: &plugin.ListConfig{ Hydrate: listCodeBuildProjects, + Tags: map[string]string{"service": "codebuild", "action": "ListProjects"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCodeBuildProject, + Tags: map[string]string{"service": "codeartifact", "action": "BatchGetProjects"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(codebuildv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -236,6 +244,9 @@ func listCodeBuildProjects(ctx context.Context, d *plugin.QueryData, _ *plugin.H // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_codebuild_project.listCodeBuildProjects", "api_error", err) diff --git a/aws/table_aws_codebuild_source_credential.go b/aws/table_aws_codebuild_source_credential.go index f363563b8..d393dbac2 100644 --- a/aws/table_aws_codebuild_source_credential.go +++ b/aws/table_aws_codebuild_source_credential.go @@ -23,6 +23,7 @@ func tableAwsCodeBuildSourceCredential(_ context.Context) *plugin.Table { Description: "AWS CodeBuild Source Credential", List: &plugin.ListConfig{ Hydrate: listCodeBuildSourceCredentials, + Tags: map[string]string{"service": "codebuild", "action": "ListSourceCredentials"}, }, GetMatrixItemFunc: SupportedRegionMatrix(codebuildv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ diff --git a/aws/table_aws_codecommit_repository.go b/aws/table_aws_codecommit_repository.go index 8f44206e5..105cb31c9 100644 --- a/aws/table_aws_codecommit_repository.go +++ b/aws/table_aws_codecommit_repository.go @@ -25,6 +25,13 @@ func tableAwsCodeCommitRepository(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameter"}), }, Hydrate: listCodeCommitRepositories, + Tags: map[string]string{"service": "codecommit", "action": "ListRepositories"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: listCodeCommitRepositoryTags, + Tags: map[string]string{"service": "codecommit", "action": "ListTagsForResource"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(codecommitv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -123,6 +130,9 @@ func listCodeCommitRepositories(ctx context.Context, d *plugin.QueryData, _ *plu // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_codecommit_repository.listCodeCommitRepositories", "api_error", err) diff --git a/aws/table_aws_codedeploy_app.go b/aws/table_aws_codedeploy_app.go index 5f7a2ad1c..f62bb740a 100644 --- a/aws/table_aws_codedeploy_app.go +++ b/aws/table_aws_codedeploy_app.go @@ -26,9 +26,21 @@ func tableAwsCodeDeployApplication(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ApplicationDoesNotExistException"}), }, Hydrate: getCodeDeployApplication, + Tags: map[string]string{"service": "codedeploy", "action": "GetApplication"}, }, List: &plugin.ListConfig{ Hydrate: listCodeDeployApplications, + Tags: map[string]string{"service": "codedeploy", "action": "ListApplications"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCodeDeployApplicationTags, + Tags: map[string]string{"service": "codedeploy", "action": "ListTagsForResource"}, + }, + { + Func: getCodeDeployApplication, + Tags: map[string]string{"service": "codedeploy", "action": "GetApplication"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(codedeployv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -128,6 +140,9 @@ func listCodeDeployApplications(ctx context.Context, d *plugin.QueryData, _ *plu }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_codedeploy_app.listCodeDeployApplications", "api_error", err) diff --git a/aws/table_aws_codedeploy_deployment_config.go b/aws/table_aws_codedeploy_deployment_config.go index 23dae2953..764cb17c2 100644 --- a/aws/table_aws_codedeploy_deployment_config.go +++ b/aws/table_aws_codedeploy_deployment_config.go @@ -26,9 +26,17 @@ func tableAwsCodeDeployDeploymentConfig(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"DeploymentConfigDoesNotExistException"}), }, Hydrate: getCodeDeployDeploymentConfig, + Tags: map[string]string{"service": "codedeploy", "action": "GetDeploymentConfig"}, }, List: &plugin.ListConfig{ Hydrate: listCodeDeployDeploymentConfigs, + Tags: map[string]string{"service": "codedeploy", "action": "ListDeploymentConfigs"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCodeDeployDeploymentConfig, + Tags: map[string]string{"service": "codedeploy", "action": "GetDeploymentConfig"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(codedeployv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -117,6 +125,9 @@ func listCodeDeployDeploymentConfigs(ctx context.Context, d *plugin.QueryData, h }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_codedeploy_deployment_config.listCodeDeployDeploymentConfigs", "api_error", err) diff --git a/aws/table_aws_codedeploy_deployment_group.go b/aws/table_aws_codedeploy_deployment_group.go index 4ea416ddb..ed642e8b9 100644 --- a/aws/table_aws_codedeploy_deployment_group.go +++ b/aws/table_aws_codedeploy_deployment_group.go @@ -26,14 +26,26 @@ func tableAwsCodeDeployDeploymentGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ApplicationDoesNotExistException", "DeploymentGroupDoesNotExistException"}), }, Hydrate: getCodeDeployDeploymentGroup, + Tags: map[string]string{"service": "codedeploy", "action": "GetDeploymentGroup"}, }, List: &plugin.ListConfig{ - KeyColumns: plugin.OptionalColumns([]string{"application_name"}), + KeyColumns: plugin.OptionalColumns([]string{"application_name"}), ParentHydrate: listCodeDeployApplications, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ApplicationDoesNotExistException"}), }, Hydrate: listCodeDeployDeploymentGroups, + Tags: map[string]string{"service": "codedeploy", "action": "ListDeploymentGroups"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCodeDeployDeploymentGroupTags, + Tags: map[string]string{"service": "codedeploy", "action": "ListTagsForResource"}, + }, + { + Func: getCodeDeployDeploymentGroup, + Tags: map[string]string{"service": "codedeploy", "action": "GetDeploymentGroup"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(codedeployv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -232,8 +244,8 @@ func listCodeDeployDeploymentGroups(ctx context.Context, d *plugin.QueryData, h } // Check if the application name is nil or if it doesn't match the parent hydrate - if applicationName != "" && applicationName != *application.ApplicationName { - return nil,nil + if applicationName != "" && applicationName != *application.ApplicationName { + return nil, nil } paginator := codedeploy.NewListDeploymentGroupsPaginator(svc, &input, func(o *codedeploy.ListDeploymentGroupsPaginatorOptions) { @@ -241,6 +253,9 @@ func listCodeDeployDeploymentGroups(ctx context.Context, d *plugin.QueryData, h }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_codedeploy_deployment_group.listCodeDeployDeploymentGroups", "api_error", err) @@ -250,7 +265,7 @@ func listCodeDeployDeploymentGroups(ctx context.Context, d *plugin.QueryData, h for _, deploymentgroup := range output.DeploymentGroups { item := &types.DeploymentGroupInfo{ DeploymentGroupName: aws.String(deploymentgroup), - ApplicationName: output.ApplicationName, + ApplicationName: output.ApplicationName, } d.StreamListItem(ctx, item) @@ -287,7 +302,7 @@ func getCodeDeployDeploymentGroup(ctx context.Context, d *plugin.QueryData, h *p // Build the params params := &codedeploy.GetDeploymentGroupInput{ DeploymentGroupName: aws.String(name), - ApplicationName: aws.String(appname), + ApplicationName: aws.String(appname), } // Create session diff --git a/aws/table_aws_codepipeline_pipeline.go b/aws/table_aws_codepipeline_pipeline.go index 6335a2494..8e1d11e51 100644 --- a/aws/table_aws_codepipeline_pipeline.go +++ b/aws/table_aws_codepipeline_pipeline.go @@ -26,9 +26,21 @@ func tableAwsCodepipelinePipeline(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"PipelineNotFoundException"}), }, Hydrate: getCodepipelinePipeline, + Tags: map[string]string{"service": "codepipeline", "action": "GetPipeline"}, }, List: &plugin.ListConfig{ Hydrate: listCodepipelinePipelines, + Tags: map[string]string{"service": "codepipeline", "action": "ListPipelines"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getPipelineTags, + Tags: map[string]string{"service": "codepipeline", "action": "ListTagsForResource"}, + }, + { + Func: getCodepipelinePipeline, + Tags: map[string]string{"service": "codepipeline", "action": "GetPipeline"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(codepipelinev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -162,6 +174,9 @@ func listCodepipelinePipelines(ctx context.Context, d *plugin.QueryData, _ *plug // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_codepipeline_pipeline.listCodepipelinePipelines", "api_error", err) @@ -251,6 +266,9 @@ func getPipelineTags(ctx context.Context, d *plugin.QueryData, h *plugin.Hydrate // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_codepipeline_pipeline.getPipelineTags", "api_error", err) diff --git a/aws/table_aws_cognito_identity_pool.go b/aws/table_aws_cognito_identity_pool.go index 33b786bfd..7748e3b65 100644 --- a/aws/table_aws_cognito_identity_pool.go +++ b/aws/table_aws_cognito_identity_pool.go @@ -24,9 +24,17 @@ func tableAwsCognitoIdentityPool(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("identity_pool_id"), Hydrate: getCognitoIdentityPool, + Tags: map[string]string{"service": "cognito-identity", "action": "DescribeIdentityPool"}, }, List: &plugin.ListConfig{ Hydrate: listCognitoIdentityPools, + Tags: map[string]string{"service": "cognito-identity", "action": "ListIdentityPools"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCognitoIdentityPool, + Tags: map[string]string{"service": "cognito-identity", "action": "DescribeIdentityPool"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(cognitoidentityv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -148,6 +156,9 @@ func listCognitoIdentityPools(ctx context.Context, d *plugin.QueryData, _ *plugi }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_cognito_identity_pool.listCognitoIdentityPools", "api_error", err) diff --git a/aws/table_aws_cognito_identity_provider.go b/aws/table_aws_cognito_identity_provider.go index fd3214451..1cf07ce8a 100644 --- a/aws/table_aws_cognito_identity_provider.go +++ b/aws/table_aws_cognito_identity_provider.go @@ -29,14 +29,22 @@ func tableAwsCognitoIdentityProvider(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.AllColumns([]string{"provider_name", "user_pool_id"}), Hydrate: getCognitoIdentityProvider, + Tags: map[string]string{"service": "cognito-idp", "action": "DescribeIdentityProvider"}, }, List: &plugin.ListConfig{ ParentHydrate: listCognitoUserPools, Hydrate: listCognitoIdentityProviders, + Tags: map[string]string{"service": "cognito-idp", "action": "ListIdentityProviders"}, KeyColumns: []*plugin.KeyColumn{ {Name: "user_pool_id", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCognitoIdentityProvider, + Tags: map[string]string{"service": "cognito-idp", "action": "DescribeIdentityProvider"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(cognitoidentityproviderv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -155,6 +163,9 @@ func listCognitoIdentityProviders(ctx context.Context, d *plugin.QueryData, h *p }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_cognito_identity_provider.listCognitoIdentityProviders", "api_error", err) diff --git a/aws/table_aws_cognito_user_pool.go b/aws/table_aws_cognito_user_pool.go index adf05c78d..28f8a5831 100644 --- a/aws/table_aws_cognito_user_pool.go +++ b/aws/table_aws_cognito_user_pool.go @@ -24,9 +24,17 @@ func tableAwsCognitoUserPool(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("id"), Hydrate: getCognitoUserPool, + Tags: map[string]string{"service": "cognito-idp", "action": "DescribeUserPool"}, }, List: &plugin.ListConfig{ Hydrate: listCognitoUserPools, + Tags: map[string]string{"service": "cognito-idp", "action": "ListUserPools"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getCognitoUserPool, + Tags: map[string]string{"service": "cognito-idp", "action": "DescribeUserPool"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(cognitoidentityproviderv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -256,6 +264,9 @@ func listCognitoUserPools(ctx context.Context, d *plugin.QueryData, _ *plugin.Hy }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_cognito_user_pool.listCognitoUserPools", "api_error", err) diff --git a/aws/table_aws_config_aggregate_authorization.go b/aws/table_aws_config_aggregate_authorization.go index 686fccc4b..c107ebf21 100644 --- a/aws/table_aws_config_aggregate_authorization.go +++ b/aws/table_aws_config_aggregate_authorization.go @@ -19,6 +19,13 @@ func tableAwsConfigAggregateAuthorization(_ context.Context) *plugin.Table { Description: "AWS Config Aggregate Authorization", List: &plugin.ListConfig{ Hydrate: listConfigAggregateAuthorizations, + Tags: map[string]string{"service": "config", "action": "DescribeAggregationAuthorizations"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getConfigAggregateAuthorizationsTags, + Tags: map[string]string{"service": "config", "action": "ListTagsForResource"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(configservicev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -106,6 +113,9 @@ func listConfigAggregateAuthorizations(ctx context.Context, d *plugin.QueryData, plugin.Logger(ctx).Info("aws_config_aggregate_authorization.listConfigAggregateAuthorizations", "HAS MORE PAGES", err) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_config_aggregate_authorization.listConfigAggregateAuthorizations", "api_error", err) diff --git a/aws/table_aws_config_configuration_recorder.go b/aws/table_aws_config_configuration_recorder.go index ef8391a60..13cffa823 100644 --- a/aws/table_aws_config_configuration_recorder.go +++ b/aws/table_aws_config_configuration_recorder.go @@ -23,9 +23,17 @@ func tableAwsConfigConfigurationRecorder(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchConfigurationRecorderException"}), }, Hydrate: getConfigConfigurationRecorder, + Tags: map[string]string{"service": "config", "action": "DescribeConfigurationRecorders"}, }, List: &plugin.ListConfig{ Hydrate: listConfigConfigurationRecorders, + Tags: map[string]string{"service": "config", "action": "DescribeConfigurationRecorders"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getConfigConfigurationRecorderStatus, + Tags: map[string]string{"service": "config", "action": "DescribeConfigurationRecorderStatus"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(configservicev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ diff --git a/aws/table_aws_config_conformance_pack.go b/aws/table_aws_config_conformance_pack.go index 23d3b68b6..9ed9c8617 100644 --- a/aws/table_aws_config_conformance_pack.go +++ b/aws/table_aws_config_conformance_pack.go @@ -22,9 +22,11 @@ func tableAwsConfigConformancePack(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchConformancePackException"}), }, Hydrate: getConfigConformancePack, + Tags: map[string]string{"service": "config", "action": "DescribeConformancePacks"}, }, List: &plugin.ListConfig{ Hydrate: listConfigConformancePacks, + Tags: map[string]string{"service": "config", "action": "DescribeConformancePacks"}, KeyColumns: []*plugin.KeyColumn{ { Name: "name", @@ -129,6 +131,9 @@ func listConfigConformancePacks(ctx context.Context, d *plugin.QueryData, _ *plu }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_config_conformance_pack.listConfigConformancePacks", "api_error", err) diff --git a/aws/table_aws_config_retention_configuration.go b/aws/table_aws_config_retention_configuration.go index cb3336717..d5df2a597 100644 --- a/aws/table_aws_config_retention_configuration.go +++ b/aws/table_aws_config_retention_configuration.go @@ -18,6 +18,7 @@ func tableAwsConfigRetentionConfiguration(_ context.Context) *plugin.Table { Description: "AWS Config Retention Configuration", List: &plugin.ListConfig{ Hydrate: listConfigRetentionConfigurations, + Tags: map[string]string{"service": "config", "action": "DescribeRetentionConfigurations"}, }, GetMatrixItemFunc: SupportedRegionMatrix(configservicev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -62,6 +63,9 @@ func listConfigRetentionConfigurations(ctx context.Context, d *plugin.QueryData, // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_config_configuration_recorder.listConfigRetentionConfigurations", "api_error", err) diff --git a/aws/table_aws_config_rule.go b/aws/table_aws_config_rule.go index a3064fd56..397e08d8a 100644 --- a/aws/table_aws_config_rule.go +++ b/aws/table_aws_config_rule.go @@ -25,9 +25,11 @@ func tableAwsConfigRule(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchConfigRuleException", "ResourceNotFoundException", "ValidationException"}), }, Hydrate: getConfigRule, + Tags: map[string]string{"service": "config", "action": "DescribeConfigRules"}, }, List: &plugin.ListConfig{ Hydrate: listConfigRules, + Tags: map[string]string{"service": "config", "action": "DescribeConfigRules"}, KeyColumns: []*plugin.KeyColumn{ { Name: "name", @@ -35,6 +37,16 @@ func tableAwsConfigRule(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getConfigRuleTags, + Tags: map[string]string{"service": "config", "action": "ListTagsForResource"}, + }, + { + Func: getComplianceByConfigRules, + Tags: map[string]string{"service": "config", "action": "DescribeComplianceByConfigRule"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(configservicev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -158,6 +170,9 @@ func listConfigRules(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrate }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_config_conformance_pack.listConfigConformancePacks", "api_error", err) diff --git a/aws/table_aws_cost_by_account_daily.go b/aws/table_aws_cost_by_account_daily.go index e0341181f..25837c525 100644 --- a/aws/table_aws_cost_by_account_daily.go +++ b/aws/table_aws_cost_by_account_daily.go @@ -14,6 +14,7 @@ func tableAwsCostByLinkedAccountDaily(_ context.Context) *plugin.Table { Description: "AWS Cost Explorer - Cost by Linked Account (Daily)", List: &plugin.ListConfig{ Hydrate: listCostByLinkedAccountDaily, + Tags: map[string]string{"service": "ce", "action": "GetCostAndUsage"}, }, Columns: awsGlobalRegionColumns( costExplorerColumns([]*plugin.Column{ diff --git a/aws/table_aws_cost_by_account_monthly.go b/aws/table_aws_cost_by_account_monthly.go index c941f6904..b06109a7a 100644 --- a/aws/table_aws_cost_by_account_monthly.go +++ b/aws/table_aws_cost_by_account_monthly.go @@ -19,6 +19,7 @@ func tableAwsCostByLinkedAccountMonthly(_ context.Context) *plugin.Table { Description: "AWS Cost Explorer - Cost by Linked Account (Monthly)", List: &plugin.ListConfig{ Hydrate: listCostByLinkedAccountMonthly, + Tags: map[string]string{"service": "ce", "action": "GetCostAndUsage"}, }, Columns: awsGlobalRegionColumns( costExplorerColumns([]*plugin.Column{ diff --git a/aws/table_aws_cost_by_record_type_daily.go b/aws/table_aws_cost_by_record_type_daily.go index fe51c1ccc..51a57b0ec 100644 --- a/aws/table_aws_cost_by_record_type_daily.go +++ b/aws/table_aws_cost_by_record_type_daily.go @@ -14,6 +14,7 @@ func tableAwsCostByRecordTypeDaily(_ context.Context) *plugin.Table { Description: "AWS Cost Explorer - Cost by Record Type (Daily)", List: &plugin.ListConfig{ Hydrate: listCostByRecordTypeDaily, + Tags: map[string]string{"service": "ce", "action": "GetCostAndUsage"}, }, Columns: awsGlobalRegionColumns( costExplorerColumns([]*plugin.Column{ diff --git a/aws/table_aws_cost_by_record_type_monthly.go b/aws/table_aws_cost_by_record_type_monthly.go index 0282cbde4..b75f757db 100644 --- a/aws/table_aws_cost_by_record_type_monthly.go +++ b/aws/table_aws_cost_by_record_type_monthly.go @@ -19,6 +19,7 @@ func tableAwsCostByRecordTypeMonthly(_ context.Context) *plugin.Table { Description: "AWS Cost Explorer - Cost by Record Type (Monthly)", List: &plugin.ListConfig{ Hydrate: listCostByRecordTypeMonthly, + Tags: map[string]string{"service": "ce", "action": "GetCostAndUsage"}, }, Columns: awsGlobalRegionColumns( costExplorerColumns([]*plugin.Column{ diff --git a/aws/table_aws_cost_by_service_daily.go b/aws/table_aws_cost_by_service_daily.go index c2d151f72..2deba64c0 100644 --- a/aws/table_aws_cost_by_service_daily.go +++ b/aws/table_aws_cost_by_service_daily.go @@ -14,6 +14,7 @@ func tableAwsCostByServiceDaily(_ context.Context) *plugin.Table { Description: "AWS Cost Explorer - Cost by Service (Daily)", List: &plugin.ListConfig{ Hydrate: listCostByServiceDaily, + Tags: map[string]string{"service": "ce", "action": "GetCostAndUsage"}, KeyColumns: plugin.KeyColumnSlice{ {Name: "service", Operators: []string{"=", "<>"}, Require: plugin.Optional}, }, diff --git a/aws/table_aws_cost_by_service_monthly.go b/aws/table_aws_cost_by_service_monthly.go index 2fc800835..65dba1cc7 100644 --- a/aws/table_aws_cost_by_service_monthly.go +++ b/aws/table_aws_cost_by_service_monthly.go @@ -20,6 +20,7 @@ func tableAwsCostByServiceMonthly(_ context.Context) *plugin.Table { Description: "AWS Cost Explorer - Cost by Service (Monthly)", List: &plugin.ListConfig{ Hydrate: listCostByServiceMonthly, + Tags: map[string]string{"service": "ce", "action": "GetCostAndUsage"}, KeyColumns: plugin.KeyColumnSlice{ {Name: "service", Operators: []string{"=", "<>"}, Require: plugin.Optional}, }, diff --git a/aws/table_aws_cost_by_service_usage_type_daily.go b/aws/table_aws_cost_by_service_usage_type_daily.go index 3c83138ec..7e4cb25fb 100644 --- a/aws/table_aws_cost_by_service_usage_type_daily.go +++ b/aws/table_aws_cost_by_service_usage_type_daily.go @@ -14,6 +14,7 @@ func tableAwsCostByServiceUsageTypeDaily(_ context.Context) *plugin.Table { Description: "AWS Cost Explorer - Cost by Service and Usage Type (Daily)", List: &plugin.ListConfig{ Hydrate: listCostByServiceAndUsageDaily, + Tags: map[string]string{"service": "ce", "action": "GetCostAndUsage"}, KeyColumns: plugin.KeyColumnSlice{ {Name: "service", Operators: []string{"=", "<>"}, Require: plugin.Optional}, {Name: "usage_type", Operators: []string{"=", "<>"}, Require: plugin.Optional}, diff --git a/aws/table_aws_cost_by_service_usage_type_monthly.go b/aws/table_aws_cost_by_service_usage_type_monthly.go index db170ae7e..9d59b55f2 100644 --- a/aws/table_aws_cost_by_service_usage_type_monthly.go +++ b/aws/table_aws_cost_by_service_usage_type_monthly.go @@ -20,6 +20,7 @@ func tableAwsCostByServiceUsageTypeMonthly(_ context.Context) *plugin.Table { Description: "AWS Cost Explorer - Cost by Service and Usage Type (Monthly)", List: &plugin.ListConfig{ Hydrate: listCostByServiceAndUsageMonthly, + Tags: map[string]string{"service": "ce", "action": "GetCostAndUsage"}, KeyColumns: plugin.KeyColumnSlice{ {Name: "service", Operators: []string{"=", "<>"}, Require: plugin.Optional}, {Name: "usage_type", Operators: []string{"=", "<>"}, Require: plugin.Optional}, diff --git a/aws/table_aws_cost_by_tag.go b/aws/table_aws_cost_by_tag.go index e33480906..5738c0d3a 100644 --- a/aws/table_aws_cost_by_tag.go +++ b/aws/table_aws_cost_by_tag.go @@ -26,6 +26,7 @@ func tableAwsCostByTag(_ context.Context) *plugin.Table { {Name: "tag_key_2", Operators: []string{"=", "<>"}, Require: plugin.Optional, CacheMatch: "exact"}, }, Hydrate: listCostAndUsageByTags, + Tags: map[string]string{"service": "ce", "action": "GetCostAndUsage"}, }, Columns: awsGlobalRegionColumns( costExplorerColumns([]*plugin.Column{ diff --git a/aws/table_aws_cost_forecast_daily.go b/aws/table_aws_cost_forecast_daily.go index 7a9e62d9c..894420618 100644 --- a/aws/table_aws_cost_forecast_daily.go +++ b/aws/table_aws_cost_forecast_daily.go @@ -19,6 +19,7 @@ func tableAwsCostForecastDaily(_ context.Context) *plugin.Table { Description: "AWS Cost Explorer - Cost Forecast (Daily)", List: &plugin.ListConfig{ Hydrate: listCostForecastDaily, + Tags: map[string]string{"service": "ce", "action": "GetCostForecast"}, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { diff --git a/aws/table_aws_cost_forecast_monthly.go b/aws/table_aws_cost_forecast_monthly.go index 5b8c2440f..91efa2202 100644 --- a/aws/table_aws_cost_forecast_monthly.go +++ b/aws/table_aws_cost_forecast_monthly.go @@ -14,6 +14,7 @@ func tableAwsCostForecastMonthly(_ context.Context) *plugin.Table { Description: "AWS Cost Explorer - Cost Forecast (Monthly)", List: &plugin.ListConfig{ Hydrate: listCostForecastMonthly, + Tags: map[string]string{"service": "ce", "action": "GetCostForecast"}, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { diff --git a/aws/table_aws_cost_usage.go b/aws/table_aws_cost_usage.go index 09e210b5c..4839e3ced 100644 --- a/aws/table_aws_cost_usage.go +++ b/aws/table_aws_cost_usage.go @@ -21,6 +21,7 @@ func tableAwsCostAndUsage(_ context.Context) *plugin.Table { //KeyColumns: plugin.AllColumns([]string{"search_start_time", "search_end_time", "granularity", "dimension_type_1", "dimension_type_2"}), KeyColumns: plugin.AllColumns([]string{"granularity", "dimension_type_1", "dimension_type_2"}), Hydrate: listCostAndUsage, + Tags: map[string]string{"service": "ce", "action": "GetCostAndUsage"}, }, Columns: awsGlobalRegionColumns( costExplorerColumns([]*plugin.Column{ diff --git a/aws/table_aws_dax_cluster.go b/aws/table_aws_dax_cluster.go index 4111192fe..0dd5516af 100644 --- a/aws/table_aws_dax_cluster.go +++ b/aws/table_aws_dax_cluster.go @@ -27,9 +27,11 @@ func tableAwsDaxCluster(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ClusterNotFoundFault", "ServiceLinkedRoleNotFoundFault"}), }, Hydrate: getDaxCluster, + Tags: map[string]string{"service": "dax", "action": "DescribeClusters"}, }, List: &plugin.ListConfig{ Hydrate: listDaxClusters, + Tags: map[string]string{"service": "dax", "action": "DescribeClusters"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValueException"}), }, @@ -40,6 +42,12 @@ func tableAwsDaxCluster(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getDaxClusterTags, + Tags: map[string]string{"service": "dax", "action": "ListTags"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(daxv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -201,6 +209,9 @@ func listDaxClusters(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrate } for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.DescribeClusters(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_dax_cluster.listDaxClusters", "api_error", err) diff --git a/aws/table_aws_dax_parameter.go b/aws/table_aws_dax_parameter.go index 980d3691f..a44752228 100644 --- a/aws/table_aws_dax_parameter.go +++ b/aws/table_aws_dax_parameter.go @@ -22,6 +22,7 @@ func tableAwsDaxParameter(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listDaxParameterGroups, Hydrate: listDaxParameters, + Tags: map[string]string{"service": "dax", "action": "DescribeParameters"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ParameterGroupNotFoundFault"}), }, @@ -126,6 +127,9 @@ func listDaxParameters(ctx context.Context, d *plugin.QueryData, h *plugin.Hydra } for { + // apply rate limiting + d.WaitForListRateLimit(ctx) + op, err := svc.DescribeParameters(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_dax_cluster. listDaxParameters", "api_error", err) diff --git a/aws/table_aws_dax_parameter_group.go b/aws/table_aws_dax_parameter_group.go index 3a2e67bef..32b45d95d 100644 --- a/aws/table_aws_dax_parameter_group.go +++ b/aws/table_aws_dax_parameter_group.go @@ -21,6 +21,7 @@ func tableAwsDaxParameterGroup(_ context.Context) *plugin.Table { Description: "AWS DAX Parameter Group", List: &plugin.ListConfig{ Hydrate: listDaxParameterGroups, + Tags: map[string]string{"service": "dax", "action": "DescribeParameterGroups"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ParameterGroupNotFoundFault"}), }, @@ -96,6 +97,9 @@ func listDaxParameterGroups(ctx context.Context, d *plugin.QueryData, _ *plugin. } for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.DescribeParameterGroups(ctx, params) if err != nil { logger.Error("aws_dax_parameter_group.listDaxParameterGroups", "api_error", err) diff --git a/aws/table_aws_dax_subnet_group.go b/aws/table_aws_dax_subnet_group.go index 9669e6c69..eacb68c7b 100644 --- a/aws/table_aws_dax_subnet_group.go +++ b/aws/table_aws_dax_subnet_group.go @@ -22,6 +22,7 @@ func tableAwsDaxSubnetGroup(_ context.Context) *plugin.Table { Description: "AWS DAX Subnet Group", List: &plugin.ListConfig{ Hydrate: listDaxSubnetGroups, + Tags: map[string]string{"service": "dax", "action": "DescribeSubnetGroups"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"SubnetGroupNotFoundFault"}), }, @@ -114,6 +115,9 @@ func listDaxSubnetGroups(ctx context.Context, d *plugin.QueryData, _ *plugin.Hyd } for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.DescribeSubnetGroups(ctx, params) if err != nil { logger.Error("aws_dax_subnet_group.listSubnetGroups", "api_error", err) diff --git a/aws/table_aws_directory_service_certificate.go b/aws/table_aws_directory_service_certificate.go index 8dfc2640a..b67b77920 100644 --- a/aws/table_aws_directory_service_certificate.go +++ b/aws/table_aws_directory_service_certificate.go @@ -29,10 +29,12 @@ func tableAwsDirectoryServiceCertificate(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"CertificateDoesNotExistException", "DirectoryDoesNotExistException", "InvalidParameterException"}), }, Hydrate: getDirectoryServiceCertificate, + Tags: map[string]string{"service": "ds", "action": "DescribeCertificate"}, }, List: &plugin.ListConfig{ ParentHydrate: listDirectoryServiceDirectories, Hydrate: listDirectoryServiceCertificates, + Tags: map[string]string{"service": "ds", "action": "ListCertificates"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"DirectoryDoesNotExistException"}), }, @@ -43,6 +45,12 @@ func tableAwsDirectoryServiceCertificate(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getDirectoryServiceCertificate, + Tags: map[string]string{"service": "ds", "action": "DescribeCertificate"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(directoryservicev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -157,6 +165,9 @@ func listDirectoryServiceCertificates(ctx context.Context, d *plugin.QueryData, pagesLeft := true // List call for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.ListCertificates(ctx, input) if err != nil { // In the case of parent hydrate the ignore config seems to not work fine. So we need to handle it manually diff --git a/aws/table_aws_directory_service_directory.go b/aws/table_aws_directory_service_directory.go index 701db6abf..237e58af3 100644 --- a/aws/table_aws_directory_service_directory.go +++ b/aws/table_aws_directory_service_directory.go @@ -26,9 +26,11 @@ func tableAwsDirectoryServiceDirectory(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValueException", "ResourceNotFoundFault", "EntityDoesNotExistException"}), }, Hydrate: getDirectoryServiceDirectory, + Tags: map[string]string{"service": "ds", "action": "DescribeDirectories"}, }, List: &plugin.ListConfig{ Hydrate: listDirectoryServiceDirectories, + Tags: map[string]string{"service": "ds", "action": "DescribeDirectories"}, KeyColumns: []*plugin.KeyColumn{ { Name: "directory_id", @@ -36,6 +38,24 @@ func tableAwsDirectoryServiceDirectory(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getDirectoryServiceEventTopics, + Tags: map[string]string{"service": "ds", "action": "DescribeEventTopics"}, + }, + { + Func: getDirectoryServiceSnapshotLimit, + Tags: map[string]string{"service": "ds", "action": "GetSnapshotLimits"}, + }, + { + Func: getDirectoryServiceSharedDirectory, + Tags: map[string]string{"service": "ds", "action": "DescribeSharedDirectories"}, + }, + { + Func: getDirectoryServiceDirectoryTags, + Tags: map[string]string{"service": "ds", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(directoryservicev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -266,6 +286,9 @@ func listDirectoryServiceDirectories(ctx context.Context, d *plugin.QueryData, _ // List call for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.DescribeDirectories(ctx, input) if err != nil { plugin.Logger(ctx).Error("aws_directory_service_directory.listDirectoryServiceDirectories", "api_error", err) diff --git a/aws/table_aws_directory_service_log_subscription.go b/aws/table_aws_directory_service_log_subscription.go index e41d3e0a0..cfb5d6a1e 100644 --- a/aws/table_aws_directory_service_log_subscription.go +++ b/aws/table_aws_directory_service_log_subscription.go @@ -21,6 +21,7 @@ func tableAwsDirectoryServiceLogSubscription(_ context.Context) *plugin.Table { Description: "AWS Directory Service Log Subscription", List: &plugin.ListConfig{ Hydrate: listDirectoryServiceLogSubscription, + Tags: map[string]string{"service": "ds", "action": "ListLogSubscriptions"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"EntityDoesNotExistException"}), }, @@ -87,7 +88,7 @@ func listDirectoryServiceLogSubscription(ctx context.Context, d *plugin.QueryDat input := &directoryservice.ListLogSubscriptionsInput{ Limit: aws.Int32(maxLimit), } - + if d.EqualsQualString("directory_id") != "" { input.DirectoryId = aws.String(d.EqualsQualString("directory_id")) } @@ -96,6 +97,9 @@ func listDirectoryServiceLogSubscription(ctx context.Context, d *plugin.QueryDat // List call for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.ListLogSubscriptions(ctx, input) if err != nil { plugin.Logger(ctx).Error("aws_directory_service_log_subscription.listDirectoryServiceLogSubscription", "api_error", err) diff --git a/aws/table_aws_dlm_lifecycle_policy.go b/aws/table_aws_dlm_lifecycle_policy.go index 42283cac9..d33f52964 100644 --- a/aws/table_aws_dlm_lifecycle_policy.go +++ b/aws/table_aws_dlm_lifecycle_policy.go @@ -23,12 +23,20 @@ func tableAwsDLMLifecyclePolicy(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("policy_id"), Hydrate: getDLMLifecyclePolicy, + Tags: map[string]string{"service": "dlm", "action": "GetLifecyclePolicy"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, }, List: &plugin.ListConfig{ Hydrate: listDLMLifecyclePolicies, + Tags: map[string]string{"service": "dlm", "action": "GetLifecyclePolicies"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getDLMLifecyclePolicy, + Tags: map[string]string{"service": "dlm", "action": "GetLifecyclePolicy"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(dlmv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -117,6 +125,8 @@ func tableAwsDLMLifecyclePolicy(_ context.Context) *plugin.Table { func listDLMLifecyclePolicies(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateData) (interface{}, error) { logger := plugin.Logger(ctx) + // apply rate limiting + d.WaitForListRateLimit(ctx) // Create Session svc, err := DLMClient(ctx, d) diff --git a/aws/table_aws_dms_replication_instance.go b/aws/table_aws_dms_replication_instance.go index 1071fd30f..fbf112cd2 100644 --- a/aws/table_aws_dms_replication_instance.go +++ b/aws/table_aws_dms_replication_instance.go @@ -26,9 +26,11 @@ func tableAwsDmsReplicationInstance(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValueException", "ResourceNotFoundFault", "InvalidParameterCombinationException"}), }, Hydrate: getDmsReplicationInstance, + Tags: map[string]string{"service": "dms", "action": "DescribeReplicationInstances"}, }, List: &plugin.ListConfig{ Hydrate: listDmsReplicationInstances, + Tags: map[string]string{"service": "dms", "action": "DescribeReplicationInstances"}, KeyColumns: []*plugin.KeyColumn{ { Name: "replication_instance_identifier", @@ -48,6 +50,12 @@ func tableAwsDmsReplicationInstance(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getDmsReplicationInstanceTags, + Tags: map[string]string{"service": "dms", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(databasemigrationservicev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -268,6 +276,9 @@ func listDmsReplicationInstances(ctx context.Context, d *plugin.QueryData, _ *pl // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_dms_replication_instance.listDmsReplicationInstances", "api_error", err) diff --git a/aws/table_aws_docdb_cluster.go b/aws/table_aws_docdb_cluster.go index 6006d6e5c..e31a21e32 100644 --- a/aws/table_aws_docdb_cluster.go +++ b/aws/table_aws_docdb_cluster.go @@ -28,9 +28,17 @@ func tableAwsDocDBCluster(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"DBClusterNotFoundFault"}), }, Hydrate: getDocDBCluster, + Tags: map[string]string{"service": "docdb-elastic", "action": "GetCluster"}, }, List: &plugin.ListConfig{ Hydrate: listDocDBClusters, + Tags: map[string]string{"service": "docdb-elastic", "action": "ListClusters"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getDocDBClusterTags, + Tags: map[string]string{"service": "docdb-elastic", "action": "ListTagsForResource"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(docdbv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -268,6 +276,9 @@ func listDocDBClusters(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydra }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_docdb_cluster.listDocDBClusters", "api_error", err) diff --git a/aws/table_aws_docdb_cluster_instance.go b/aws/table_aws_docdb_cluster_instance.go index f504fb061..886c24039 100644 --- a/aws/table_aws_docdb_cluster_instance.go +++ b/aws/table_aws_docdb_cluster_instance.go @@ -24,6 +24,7 @@ func tableAwsDocDBClusterInstance(_ context.Context) *plugin.Table { Description: "AWS DocumentDB Cluster Instance", List: &plugin.ListConfig{ Hydrate: listDocDBClusterInstances, + Tags: map[string]string{"service": "rds", "action": "DescribeDBInstances"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValue", "DBInstanceNotFound"}), }, @@ -33,6 +34,12 @@ func tableAwsDocDBClusterInstance(_ context.Context) *plugin.Table { {Name: "db_instance_arn", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getDocDBClusterInstanceTags, + Tags: map[string]string{"service": "docdb", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(docdbv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -289,6 +296,9 @@ func listDocDBClusterInstances(ctx context.Context, d *plugin.QueryData, _ *plug }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_docdb_cluster_instance.listDocDBClusterInstances", "api_error", err) diff --git a/aws/table_aws_drs_job.go b/aws/table_aws_drs_job.go index 65e24b20b..9f1e692be 100644 --- a/aws/table_aws_drs_job.go +++ b/aws/table_aws_drs_job.go @@ -29,6 +29,7 @@ func tableAwsDRSJob(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"UninitializedAccountException", "BadRequestException"}), }, Hydrate: listAwsDRSJobs, + Tags: map[string]string{"service": "drs", "action": "DescribeJobs"}, }, GetMatrixItemFunc: SupportedRegionMatrix(drsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -175,6 +176,9 @@ func listAwsDRSJobs(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateD }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_drs_job.listAwsDRSJobs", "api_error", err) diff --git a/aws/table_aws_drs_recovery_instance.go b/aws/table_aws_drs_recovery_instance.go index 6a44cb820..e00c31df0 100644 --- a/aws/table_aws_drs_recovery_instance.go +++ b/aws/table_aws_drs_recovery_instance.go @@ -27,6 +27,7 @@ func tableAwsDRSRecoveryInstance(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"UninitializedAccountException", "BadRequestException"}), }, Hydrate: listAwsDRSRecoveryInstances, + Tags: map[string]string{"service": "drs", "action": "DescribeRecoveryInstances"}, }, GetMatrixItemFunc: SupportedRegionMatrix(drsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -172,6 +173,9 @@ func listAwsDRSRecoveryInstances(ctx context.Context, d *plugin.QueryData, _ *pl }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_drs_recovery_instance.listAwsDRSRecoveryInstances", "api_error", err) diff --git a/aws/table_aws_drs_recovery_snapshot.go b/aws/table_aws_drs_recovery_snapshot.go index 08f690c73..19ed87f75 100644 --- a/aws/table_aws_drs_recovery_snapshot.go +++ b/aws/table_aws_drs_recovery_snapshot.go @@ -30,6 +30,7 @@ func tableAwsDRSRecoverySnapshot(_ context.Context) *plugin.Table { }, ParentHydrate: listAwsDRSSourceServers, Hydrate: listAwsDRSRecoverySnapshots, + Tags: map[string]string{"service": "drs", "action": "DescribeRecoverySnapshots"}, }, GetMatrixItemFunc: SupportedRegionMatrix(drsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -143,6 +144,9 @@ func listAwsDRSRecoverySnapshots(ctx context.Context, d *plugin.QueryData, h *pl }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_drs_recovery_snapshot.listAwsDRSRecoverySnapshots", "api_error", err) diff --git a/aws/table_aws_drs_source_server.go b/aws/table_aws_drs_source_server.go index 4cbfa0918..2d8699576 100644 --- a/aws/table_aws_drs_source_server.go +++ b/aws/table_aws_drs_source_server.go @@ -29,6 +29,13 @@ func tableAwsDRSSourceServer(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"UninitializedAccountException", "BadRequestException"}), }, Hydrate: listAwsDRSSourceServers, + Tags: map[string]string{"service": "drs", "action": "DescribeSourceServers"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsDRSSourceServerLaunchConfiguration, + Tags: map[string]string{"service": "drs", "action": "GetLaunchConfiguration"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(drsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -189,6 +196,9 @@ func listAwsDRSSourceServers(ctx context.Context, d *plugin.QueryData, _ *plugin }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_drs_source_server.listAwsDRSSourceServers", "api_error", err) diff --git a/aws/table_aws_dynamodb_backup.go b/aws/table_aws_dynamodb_backup.go index ce3f08fbd..15dcb8902 100644 --- a/aws/table_aws_dynamodb_backup.go +++ b/aws/table_aws_dynamodb_backup.go @@ -24,9 +24,11 @@ func tableAwsDynamoDBBackup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationException", "BackupNotFoundException"}), }, Hydrate: getDynamodbBackup, + Tags: map[string]string{"service": "dynamodb", "action": "DescribeBackup"}, }, List: &plugin.ListConfig{ Hydrate: listDynamodbBackups, + Tags: map[string]string{"service": "dynamodb", "action": "ListBackups"}, KeyColumns: []*plugin.KeyColumn{ { Name: "backup_type", diff --git a/aws/table_aws_dynamodb_global_table.go b/aws/table_aws_dynamodb_global_table.go index f07f2f462..52d4a407e 100644 --- a/aws/table_aws_dynamodb_global_table.go +++ b/aws/table_aws_dynamodb_global_table.go @@ -25,9 +25,11 @@ func tableAwsDynamoDBGlobalTable(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, Hydrate: getDynamoDBGlobalTable, + Tags: map[string]string{"service": "dynamodb", "action": "DescribeGlobalTable"}, }, List: &plugin.ListConfig{ Hydrate: listDynamoDBGlobalTables, + Tags: map[string]string{"service": "dynamodb", "action": "ListGlobalTables"}, KeyColumns: []*plugin.KeyColumn{ { Name: "global_table_name", @@ -35,6 +37,12 @@ func tableAwsDynamoDBGlobalTable(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getDynamoDBGlobalTable, + Tags: map[string]string{"service": "dynamodb", "action": "DescribeGlobalTable"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(dynamodbv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { diff --git a/aws/table_aws_dynamodb_metric_account_provisioned_read_capacity_util.go b/aws/table_aws_dynamodb_metric_account_provisioned_read_capacity_util.go index e5b1cfe8b..29cacb8db 100644 --- a/aws/table_aws_dynamodb_metric_account_provisioned_read_capacity_util.go +++ b/aws/table_aws_dynamodb_metric_account_provisioned_read_capacity_util.go @@ -14,6 +14,7 @@ func tableAwsDynamoDBMetricAccountProvisionedReadCapacityUtilization(_ context.C Description: "AWS DynamoDB Metric Account Provisioned Read Capacity Utilization", List: &plugin.ListConfig{ Hydrate: listDynamoDBMetricAccountProvisionedReadCapacityUtilization, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns([]*plugin.Column{})), diff --git a/aws/table_aws_dynamodb_metric_account_provisioned_write_capacity_util.go b/aws/table_aws_dynamodb_metric_account_provisioned_write_capacity_util.go index b92dbff96..c9190f661 100644 --- a/aws/table_aws_dynamodb_metric_account_provisioned_write_capacity_util.go +++ b/aws/table_aws_dynamodb_metric_account_provisioned_write_capacity_util.go @@ -14,6 +14,7 @@ func tableAwsDynamoDBMetricAccountProvisionedWriteCapacityUtilization(_ context. Description: "AWS DynamoDB Metric Account Provisioned Write Capacity Utilization", List: &plugin.ListConfig{ Hydrate: listDynamoDBMetricAccountProvisionedWriteCapacityUtilization, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns([]*plugin.Column{})), diff --git a/aws/table_aws_dynamodb_table.go b/aws/table_aws_dynamodb_table.go index 9c91631d7..aa45fef33 100644 --- a/aws/table_aws_dynamodb_table.go +++ b/aws/table_aws_dynamodb_table.go @@ -31,9 +31,11 @@ func tableAwsDynamoDBTable(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, Hydrate: getDynamoDBTable, + Tags: map[string]string{"service": "dynamodb", "action": "DescribeTable"}, }, List: &plugin.ListConfig{ Hydrate: listDynamoDBTables, + Tags: map[string]string{"service": "dynamodb", "action": "ListTables"}, KeyColumns: []*plugin.KeyColumn{ { Name: "name", @@ -41,6 +43,24 @@ func tableAwsDynamoDBTable(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getDynamoDBTable, + Tags: map[string]string{"service": "dynamodb", "action": "DescribeTable"}, + }, + { + Func: getTableTagging, + Tags: map[string]string{"service": "dynamodb", "action": "ListTagsOfResource"}, + }, + { + Func: getDescribeContinuousBackups, + Tags: map[string]string{"service": "dynamodb", "action": "DescribeContinuousBackups"}, + }, + { + Func: getTableStreamingDestination, + Tags: map[string]string{"service": "dynamodb", "action": "DescribeKinesisStreamingDestination"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(dynamodbv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -267,6 +287,9 @@ func listDynamoDBTables(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydr // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_dynamodb_table.listDynamoDBTables", "api_error", err) @@ -388,6 +411,9 @@ func getTableTagging(ctx context.Context, d *plugin.QueryData, h *plugin.Hydrate pagesLeft := true tags := []types.Tag{} for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.ListTagsOfResource(ctx, params) if err != nil { var ae smithy.APIError diff --git a/aws/table_aws_dynamodb_table_export.go b/aws/table_aws_dynamodb_table_export.go index c7be0b03d..5d4a6ea80 100644 --- a/aws/table_aws_dynamodb_table_export.go +++ b/aws/table_aws_dynamodb_table_export.go @@ -24,10 +24,18 @@ func tableAwsDynamoDBTableExport(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "ExportNotFoundException"}), }, Hydrate: getTableExport, + Tags: map[string]string{"service": "dynamodb", "action": "DescribeExport"}, }, List: &plugin.ListConfig{ ParentHydrate: listDynamoDBTables, Hydrate: listTableExports, + Tags: map[string]string{"service": "dynamodb", "action": "ListExports"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getTableExport, + Tags: map[string]string{"service": "dynamodb", "action": "DescribeExport"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(dynamodbv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -207,6 +215,9 @@ func listTableExports(ctx context.Context, d *plugin.QueryData, h *plugin.Hydrat // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_dynamodb_table_export.listTableExports", "api_error", err) diff --git a/aws/table_aws_ebs_snapshot.go b/aws/table_aws_ebs_snapshot.go index 08e1da693..3356a6422 100644 --- a/aws/table_aws_ebs_snapshot.go +++ b/aws/table_aws_ebs_snapshot.go @@ -20,6 +20,7 @@ func tableAwsEBSSnapshot(_ context.Context) *plugin.Table { Description: "AWS EBS Snapshot", List: &plugin.ListConfig{ Hydrate: listAwsEBSSnapshots, + Tags: map[string]string{"service": "ec2", "action": "DescribeSnapshots"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidSnapshot.NotFound", "InvalidSnapshotID.Malformed", "InvalidParameterValue", "InvalidUserID.Malformed"}), }, @@ -66,6 +67,12 @@ func tableAwsEBSSnapshot(_ context.Context) *plugin.Table { }, }, GetMatrixItemFunc: SupportedRegionMatrix(ec2v1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsEBSSnapshotCreateVolumePermissions, + Tags: map[string]string{"service": "ec2", "action": "DescribeSnapshotAttribute"}, + }, + }, Columns: awsRegionalColumns([]*plugin.Column{ { Name: "snapshot_id", @@ -214,6 +221,9 @@ func listAwsEBSSnapshots(ctx context.Context, d *plugin.QueryData, h *plugin.Hyd // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ebs_snapshot.listAwsEBSSnapshots", "api_error", err) diff --git a/aws/table_aws_ebs_volume.go b/aws/table_aws_ebs_volume.go index be2e3916d..fc6a2dce5 100644 --- a/aws/table_aws_ebs_volume.go +++ b/aws/table_aws_ebs_volume.go @@ -28,9 +28,11 @@ func tableAwsEBSVolume(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidVolume.NotFound", "InvalidParameterValue"}), }, Hydrate: getEBSVolume, + Tags: map[string]string{"service": "ec2", "action": "DescribeVolumes"}, }, List: &plugin.ListConfig{ Hydrate: listEBSVolume, + Tags: map[string]string{"service": "ec2", "action": "DescribeVolumes"}, KeyColumns: []*plugin.KeyColumn{ {Name: "availability_zone", Require: plugin.Optional}, {Name: "encrypted", Require: plugin.Optional, Operators: []string{"=", "<>"}}, @@ -43,6 +45,16 @@ func tableAwsEBSVolume(_ context.Context) *plugin.Table { {Name: "volume_type", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getVolumeAutoEnableIOData, + Tags: map[string]string{"service": "ec2", "action": "DescribeVolumeAttribute"}, + }, + { + Func: getVolumeProductCodes, + Tags: map[string]string{"service": "ec2", "action": "DescribeVolumeAttribute"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(ec2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -206,6 +218,9 @@ func listEBSVolume(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateDa // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ebs_volume.listEBSVolume", "api_error", err) diff --git a/aws/table_aws_ebs_volume_metric_read_ops.go b/aws/table_aws_ebs_volume_metric_read_ops.go index 704a857e5..c9b750e59 100644 --- a/aws/table_aws_ebs_volume_metric_read_ops.go +++ b/aws/table_aws_ebs_volume_metric_read_ops.go @@ -18,6 +18,7 @@ func tableAwsEbsVolumeMetricReadOps(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listEBSVolume, Hydrate: listEbsVolumeMetricReadOps, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_ebs_volume_metric_read_ops_daily.go b/aws/table_aws_ebs_volume_metric_read_ops_daily.go index e527069fc..7cb7165a5 100644 --- a/aws/table_aws_ebs_volume_metric_read_ops_daily.go +++ b/aws/table_aws_ebs_volume_metric_read_ops_daily.go @@ -18,6 +18,7 @@ func tableAwsEbsVolumeMetricReadOpsDaily(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listEBSVolume, Hydrate: listEbsVolumeMetricReadOpsDaily, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_ebs_volume_metric_read_ops_hourly.go b/aws/table_aws_ebs_volume_metric_read_ops_hourly.go index 1adf513aa..6591c1a2e 100644 --- a/aws/table_aws_ebs_volume_metric_read_ops_hourly.go +++ b/aws/table_aws_ebs_volume_metric_read_ops_hourly.go @@ -18,6 +18,7 @@ func tableAwsEbsVolumeMetricReadOpsHourly(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listEBSVolume, Hydrate: listEbsVolumeMetricReadOpsHourly, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_ebs_volume_metric_write_ops.go b/aws/table_aws_ebs_volume_metric_write_ops.go index df43a4456..4494b656a 100644 --- a/aws/table_aws_ebs_volume_metric_write_ops.go +++ b/aws/table_aws_ebs_volume_metric_write_ops.go @@ -18,6 +18,7 @@ func tableAwsEbsVolumeMetricWriteOps(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listEBSVolume, Hydrate: listEbsVolumeMetricWriteOps, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_ebs_volume_metric_write_ops_daily.go b/aws/table_aws_ebs_volume_metric_write_ops_daily.go index f35c2e6d8..d64f47e7c 100644 --- a/aws/table_aws_ebs_volume_metric_write_ops_daily.go +++ b/aws/table_aws_ebs_volume_metric_write_ops_daily.go @@ -18,6 +18,7 @@ func tableAwsEbsVolumeMetricWriteOpsDaily(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listEBSVolume, Hydrate: listEbsVolumeMetricWriteOpsDaily, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_ebs_volume_metric_write_ops_hourly.go b/aws/table_aws_ebs_volume_metric_write_ops_hourly.go index 8d6d823e9..3020854e0 100644 --- a/aws/table_aws_ebs_volume_metric_write_ops_hourly.go +++ b/aws/table_aws_ebs_volume_metric_write_ops_hourly.go @@ -18,6 +18,7 @@ func tableAwsEbsVolumeMetricWriteOpsHourly(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listEBSVolume, Hydrate: listEbsVolumeMetricWriteOpsHourly, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_ec2_ami.go b/aws/table_aws_ec2_ami.go index 6ebaa0ec2..5d0dd8526 100644 --- a/aws/table_aws_ec2_ami.go +++ b/aws/table_aws_ec2_ami.go @@ -29,9 +29,11 @@ func tableAwsEc2Ami(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidAMIID.NotFound", "InvalidAMIID.Unavailable", "InvalidAMIID.Malformed"}), }, Hydrate: getEc2Ami, + Tags: map[string]string{"service": "ec2", "action": "DescribeImages"}, }, List: &plugin.ListConfig{ Hydrate: listEc2Amis, + Tags: map[string]string{"service": "ec2", "action": "DescribeImages"}, KeyColumns: []*plugin.KeyColumn{ {Name: "architecture", Require: plugin.Optional}, {Name: "description", Require: plugin.Optional}, @@ -235,6 +237,9 @@ func listEc2Amis(ctx context.Context, d *plugin.QueryData, h *plugin.HydrateData input.Filters = filters } + // apply rate limiting + d.WaitForListRateLimit(ctx) + resp, err := svc.DescribeImages(ctx, input) if err != nil { plugin.Logger(ctx).Error("aws_ec2_ami.listEc2Amis", "api_error", err) diff --git a/aws/table_aws_ec2_ami_shared.go b/aws/table_aws_ec2_ami_shared.go index fd731479d..43e907198 100644 --- a/aws/table_aws_ec2_ami_shared.go +++ b/aws/table_aws_ec2_ami_shared.go @@ -26,6 +26,7 @@ func tableAwsEc2AmiShared(_ context.Context) *plugin.Table { Description: "AWS EC2 AMI - All public, private, and shared AMIs", List: &plugin.ListConfig{ Hydrate: listAmisByOwner, + Tags: map[string]string{"service": "ec2", "action": "DescribeImages"}, KeyColumns: []*plugin.KeyColumn{ {Name: "owner_id", Require: plugin.Optional, CacheMatch: "exact"}, {Name: "architecture", Require: plugin.Optional}, @@ -242,6 +243,10 @@ func listAmisByOwner(ctx context.Context, d *plugin.QueryData, h *plugin.Hydrate if len(filters) != 0 { input.Filters = filters } + + // apply rate limiting + d.WaitForListRateLimit(ctx) + // There is no MaxResult property in param, through which we can limit the number of results resp, err := svc.DescribeImages(ctx, input) if err != nil { diff --git a/aws/table_aws_ec2_application_load_balancer.go b/aws/table_aws_ec2_application_load_balancer.go index 2e0ff885d..b31b4180f 100644 --- a/aws/table_aws_ec2_application_load_balancer.go +++ b/aws/table_aws_ec2_application_load_balancer.go @@ -25,9 +25,11 @@ func tableAwsEc2ApplicationLoadBalancer(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"LoadBalancerNotFound", "ValidationError"}), }, Hydrate: getEc2ApplicationLoadBalancer, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeLoadBalancers"}, }, List: &plugin.ListConfig{ Hydrate: listEc2ApplicationLoadBalancers, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeLoadBalancers"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"LoadBalancerNotFound"}), }, @@ -42,6 +44,16 @@ func tableAwsEc2ApplicationLoadBalancer(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsEc2ApplicationLoadBalancerAttributes, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeLoadBalancerAttributes"}, + }, + { + Func: getAwsEc2ApplicationLoadBalancerTags, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeTags"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(elbv2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -202,6 +214,9 @@ func listEc2ApplicationLoadBalancers(ctx context.Context, d *plugin.QueryData, _ // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_application_load_balancer.listEc2ApplicationLoadBalancers", "api_error", err) diff --git a/aws/table_aws_ec2_application_load_balancer_metric_request_count.go b/aws/table_aws_ec2_application_load_balancer_metric_request_count.go index a882e0e91..8f5497abb 100644 --- a/aws/table_aws_ec2_application_load_balancer_metric_request_count.go +++ b/aws/table_aws_ec2_application_load_balancer_metric_request_count.go @@ -19,6 +19,7 @@ func tableAwsEc2ApplicationLoadBalancerMetricRequestCount(_ context.Context) *pl List: &plugin.ListConfig{ ParentHydrate: listEc2ApplicationLoadBalancers, Hydrate: listEc2ApplicationLoadBalancerMetricRequestCount, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_ec2_application_load_balancer_metric_request_count_daily.go b/aws/table_aws_ec2_application_load_balancer_metric_request_count_daily.go index f2f28ea82..3aa94242b 100644 --- a/aws/table_aws_ec2_application_load_balancer_metric_request_count_daily.go +++ b/aws/table_aws_ec2_application_load_balancer_metric_request_count_daily.go @@ -20,6 +20,7 @@ func tableAwsEc2ApplicationLoadBalancerMetricRequestCountDaily(_ context.Context List: &plugin.ListConfig{ ParentHydrate: listEc2ApplicationLoadBalancers, Hydrate: listEc2ApplicationLoadBalancerMetricRequestCountDaily, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_ec2_autoscaling_group.go b/aws/table_aws_ec2_autoscaling_group.go index 3ea6eabc8..de758eb82 100644 --- a/aws/table_aws_ec2_autoscaling_group.go +++ b/aws/table_aws_ec2_autoscaling_group.go @@ -25,9 +25,17 @@ func tableAwsEc2ASG(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationError"}), }, Hydrate: getAwsEc2AutoScalingGroup, + Tags: map[string]string{"service": "autoscaling", "action": "DescribeAutoScalingGroups"}, }, List: &plugin.ListConfig{ Hydrate: listAwsEc2AutoScalingGroup, + Tags: map[string]string{"service": "autoscaling", "action": "DescribeAutoScalingGroups"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsEc2AutoScalingGroupPolicy, + Tags: map[string]string{"service": "autoscaling", "action": "DescribePolicies"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(autoscalingv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -298,6 +306,9 @@ func listAwsEc2AutoScalingGroup(ctx context.Context, d *plugin.QueryData, _ *plu // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_autoscaling_group.listAwsEc2AutoScalingGroup", "api_error", err) @@ -385,6 +396,9 @@ func getAwsEc2AutoScalingGroupPolicy(ctx context.Context, d *plugin.QueryData, h }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_autoscaling_group.getAwsEc2AutoScalingGroupPolicy", "api_error", err) diff --git a/aws/table_aws_ec2_capacity_reservation.go b/aws/table_aws_ec2_capacity_reservation.go index 9253a5e0e..5f7fc0a83 100644 --- a/aws/table_aws_ec2_capacity_reservation.go +++ b/aws/table_aws_ec2_capacity_reservation.go @@ -26,9 +26,11 @@ func tableAwsEc2CapacityReservation(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidCapacityReservationId.NotFound", "InvalidCapacityReservationId.Unavailable", "InvalidCapacityReservationId.Malformed"}), }, Hydrate: getEc2CapacityReservation, + Tags: map[string]string{"service": "ec2", "action": "DescribeCapacityReservations"}, }, List: &plugin.ListConfig{ Hydrate: listEc2CapacityReservations, + Tags: map[string]string{"service": "ec2", "action": "DescribeCapacityReservations"}, KeyColumns: []*plugin.KeyColumn{ {Name: "instance_type", Require: plugin.Optional}, {Name: "owner_id", Require: plugin.Optional}, @@ -209,6 +211,9 @@ func listEc2CapacityReservations(ctx context.Context, d *plugin.QueryData, _ *pl // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_capacity_reservation.listEc2CapacityReservations", "api_error", err) diff --git a/aws/table_aws_ec2_classic_load_balancer.go b/aws/table_aws_ec2_classic_load_balancer.go index 8b33118c3..de2a96c50 100644 --- a/aws/table_aws_ec2_classic_load_balancer.go +++ b/aws/table_aws_ec2_classic_load_balancer.go @@ -26,9 +26,21 @@ func tableAwsEc2ClassicLoadBalancer(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"LoadBalancerNotFound"}), }, Hydrate: getEc2ClassicLoadBalancer, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeLoadBalancers"}, }, List: &plugin.ListConfig{ Hydrate: listEc2ClassicLoadBalancers, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeLoadBalancers"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsEc2ClassicLoadBalancerAttributes, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeLoadBalancerAttributes"}, + }, + { + Func: getAwsEc2ClassicLoadBalancerTags, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeTags"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(elbv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -297,6 +309,9 @@ func listEc2ClassicLoadBalancers(ctx context.Context, d *plugin.QueryData, _ *pl // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_classic_load_balancer.listEc2ClassicLoadBalancers", "api_error", err) diff --git a/aws/table_aws_ec2_client_vpn_endpoint.go b/aws/table_aws_ec2_client_vpn_endpoint.go index ed55b773d..9d057713f 100644 --- a/aws/table_aws_ec2_client_vpn_endpoint.go +++ b/aws/table_aws_ec2_client_vpn_endpoint.go @@ -26,9 +26,11 @@ func tableAwsEC2ClientVPNEndpoint(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationError", "InvalidQueryParameter", "InvalidParameterValue", "InvalidClientVpnEndpointId.NotFound"}), }, Hydrate: getEC2ClientVPNEndpoint, + Tags: map[string]string{"service": "ec2", "action": "DescribeClientVpnEndpoints"}, }, List: &plugin.ListConfig{ Hydrate: listEC2ClientVPNEndpoints, + Tags: map[string]string{"service": "ec2", "action": "DescribeClientVpnEndpoints"}, KeyColumns: []*plugin.KeyColumn{ {Name: "transport_protocol", Require: plugin.Optional}, }, @@ -146,7 +148,7 @@ func tableAwsEC2ClientVPNEndpoint(_ context.Context) *plugin.Table { Description: "The protocol used by the VPN session.", Type: proto.ColumnType_JSON, }, - + // Steampipe standard columns { Name: "title", @@ -205,6 +207,9 @@ func listEC2ClientVPNEndpoints(ctx context.Context, d *plugin.QueryData, _ *plug // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_client_vpn_endpoint.listEC2ClientVPNEndpoints", "api_error", err) diff --git a/aws/table_aws_ec2_gateway_load_balancer.go b/aws/table_aws_ec2_gateway_load_balancer.go index 63f904399..cbc944a3c 100644 --- a/aws/table_aws_ec2_gateway_load_balancer.go +++ b/aws/table_aws_ec2_gateway_load_balancer.go @@ -25,9 +25,11 @@ func tableAwsEc2GatewayLoadBalancer(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"LoadBalancerNotFound", "ValidationError"}), }, Hydrate: getEc2GatewayLoadBalancer, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeClientVpnEndpoints"}, }, List: &plugin.ListConfig{ Hydrate: listEc2GatewayLoadBalancers, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeClientVpnEndpoints"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationError"}), }, @@ -35,6 +37,16 @@ func tableAwsEc2GatewayLoadBalancer(_ context.Context) *plugin.Table { {Name: "arn", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsEc2GatewayLoadBalancerAttributes, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeLoadBalancerAttributes"}, + }, + { + Func: getAwsEc2GatewayLoadBalancerTags, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeTags"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(elbv2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -186,6 +198,9 @@ func listEc2GatewayLoadBalancers(ctx context.Context, d *plugin.QueryData, _ *pl // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_gateway_load_balancer.listEc2GatewayLoadBalancers", "api_error", err) diff --git a/aws/table_aws_ec2_instance.go b/aws/table_aws_ec2_instance.go index 5f5b21fa9..8c788505a 100644 --- a/aws/table_aws_ec2_instance.go +++ b/aws/table_aws_ec2_instance.go @@ -30,9 +30,11 @@ func tableAwsEc2Instance(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidInstanceID.NotFound", "InvalidInstanceID.Unavailable", "InvalidInstanceID.Malformed"}), }, Hydrate: getEc2Instance, + Tags: map[string]string{"service": "ec2", "action": "DescribeInstances"}, }, List: &plugin.ListConfig{ Hydrate: listEc2Instance, + Tags: map[string]string{"service": "ec2", "action": "DescribeInstances"}, KeyColumns: []*plugin.KeyColumn{ {Name: "hypervisor", Require: plugin.Optional}, {Name: "iam_instance_profile_arn", Require: plugin.Optional}, @@ -54,6 +56,40 @@ func tableAwsEc2Instance(_ context.Context) *plugin.Table { {Name: "vpc_id", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getInstanceDisableAPITerminationData, + Tags: map[string]string{"service": "ec2", "action": "DescribeInstanceAttribute"}, + }, + { + Func: getInstanceInitiatedShutdownBehavior, + Tags: map[string]string{"service": "ec2", "action": "DescribeInstanceAttribute"}, + }, + { + Func: getInstanceKernelID, + Tags: map[string]string{"service": "ec2", "action": "DescribeInstanceAttribute"}, + }, + { + Func: getInstanceRAMDiskID, + Tags: map[string]string{"service": "ec2", "action": "DescribeInstanceAttribute"}, + }, + { + Func: getInstanceSriovNetSupport, + Tags: map[string]string{"service": "ec2", "action": "DescribeInstanceAttribute"}, + }, + { + Func: getInstanceUserData, + Tags: map[string]string{"service": "ec2", "action": "DescribeInstanceAttribute"}, + }, + { + Func: getEc2LaunchTemplateData, + Tags: map[string]string{"service": "ec2", "action": "GetLaunchTemplateData"}, + }, + { + Func: getInstanceStatus, + Tags: map[string]string{"service": "ec2", "action": "DescribeInstanceStatus"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(ec2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -515,6 +551,9 @@ func listEc2Instance(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrate // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_instance.listEc2Instance", "api_error", err) diff --git a/aws/table_aws_ec2_instance_availability.go b/aws/table_aws_ec2_instance_availability.go index 70890b7b9..0de8ffbcc 100644 --- a/aws/table_aws_ec2_instance_availability.go +++ b/aws/table_aws_ec2_instance_availability.go @@ -21,6 +21,7 @@ func tableAwsInstanceAvailability(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listAwsRegions, Hydrate: listAwsAvailableInstanceTypes, + Tags: map[string]string{"service": "ec2", "action": "DescribeInstanceTypeOfferings"}, KeyColumns: []*plugin.KeyColumn{ { Name: "instance_type", @@ -112,6 +113,9 @@ func listAwsAvailableInstanceTypes(ctx context.Context, d *plugin.QueryData, h * // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_instance_availability.listAwsAvailableInstanceTypes", "api_error", err) diff --git a/aws/table_aws_ec2_instance_metric_cpu_utilization.go b/aws/table_aws_ec2_instance_metric_cpu_utilization.go index 69cac6f35..af323b80b 100644 --- a/aws/table_aws_ec2_instance_metric_cpu_utilization.go +++ b/aws/table_aws_ec2_instance_metric_cpu_utilization.go @@ -18,6 +18,7 @@ func tableAwsEc2InstanceMetricCpuUtilization(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listEc2Instance, Hydrate: listEc2InstanceMetricCpuUtilization, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_ec2_instance_metric_cpu_utilization_daily.go b/aws/table_aws_ec2_instance_metric_cpu_utilization_daily.go index 93542ead9..2fd7f9751 100644 --- a/aws/table_aws_ec2_instance_metric_cpu_utilization_daily.go +++ b/aws/table_aws_ec2_instance_metric_cpu_utilization_daily.go @@ -19,6 +19,7 @@ func tableAwsEc2InstanceMetricCpuUtilizationDaily(_ context.Context) *plugin.Tab List: &plugin.ListConfig{ ParentHydrate: listEc2Instance, Hydrate: listEc2InstanceMetricCpuUtilizationDaily, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_ec2_instance_metric_cpu_utilization_hourly.go b/aws/table_aws_ec2_instance_metric_cpu_utilization_hourly.go index 7acc67b90..bc915ba35 100644 --- a/aws/table_aws_ec2_instance_metric_cpu_utilization_hourly.go +++ b/aws/table_aws_ec2_instance_metric_cpu_utilization_hourly.go @@ -18,6 +18,7 @@ func tableAwsEc2InstanceMetricCpuUtilizationHourly(_ context.Context) *plugin.Ta List: &plugin.ListConfig{ ParentHydrate: listEc2Instance, Hydrate: listEc2InstanceMetricCpuUtilizationHourly, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_ec2_instance_type.go b/aws/table_aws_ec2_instance_type.go index 280899e2c..6e8a2c7e4 100644 --- a/aws/table_aws_ec2_instance_type.go +++ b/aws/table_aws_ec2_instance_type.go @@ -25,9 +25,17 @@ func tableAwsInstanceType(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidInstanceType"}), }, Hydrate: describeInstanceType, + Tags: map[string]string{"service": "ec2", "action": "DescribeInstanceTypes"}, }, List: &plugin.ListConfig{ Hydrate: listAwsInstanceTypesOfferings, + Tags: map[string]string{"service": "ec2", "action": "DescribeInstanceTypeOfferings"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: describeInstanceType, + Tags: map[string]string{"service": "ec2", "action": "DescribeInstanceTypes"}, + }, }, Columns: []*plugin.Column{ { @@ -233,6 +241,9 @@ func listAwsInstanceTypesOfferings(ctx context.Context, d *plugin.QueryData, h * // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_instance_type.listAwsInstanceTypesOfferings", "api_error", err) diff --git a/aws/table_aws_ec2_key_pair.go b/aws/table_aws_ec2_key_pair.go index 801f40932..bbff9696b 100644 --- a/aws/table_aws_ec2_key_pair.go +++ b/aws/table_aws_ec2_key_pair.go @@ -26,9 +26,11 @@ func tableAwsEc2KeyPair(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidKeyPair.NotFound", "InvalidKeyPair.Unavailable", "InvalidKeyPair.Malformed"}), }, Hydrate: getEc2KeyPair, + Tags: map[string]string{"service": "ec2", "action": "DescribeKeyPairs"}, }, List: &plugin.ListConfig{ Hydrate: listEc2KeyPairs, + Tags: map[string]string{"service": "ec2", "action": "DescribeKeyPairs"}, KeyColumns: []*plugin.KeyColumn{ {Name: "key_pair_id", Require: plugin.Optional}, {Name: "key_fingerprint", Require: plugin.Optional}, diff --git a/aws/table_aws_ec2_launch_configuration.go b/aws/table_aws_ec2_launch_configuration.go index ca304ffe9..d7684adf9 100644 --- a/aws/table_aws_ec2_launch_configuration.go +++ b/aws/table_aws_ec2_launch_configuration.go @@ -23,9 +23,11 @@ func tableAwsEc2LaunchConfiguration(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "ValidationError"}), }, Hydrate: getAwsEc2LaunchConfiguration, + Tags: map[string]string{"service": "autoscaling", "action": "DescribeLaunchConfigurations"}, }, List: &plugin.ListConfig{ Hydrate: listAwsEc2LaunchConfigurations, + Tags: map[string]string{"service": "autoscaling", "action": "DescribeLaunchConfigurations"}, }, GetMatrixItemFunc: SupportedRegionMatrix(ec2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -205,6 +207,9 @@ func listAwsEc2LaunchConfigurations(ctx context.Context, d *plugin.QueryData, _ // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_launch_configuration.listAwsEc2LaunchConfigurations", "api_error", err) diff --git a/aws/table_aws_ec2_launch_template.go b/aws/table_aws_ec2_launch_template.go index 4a291c723..8d0de5efa 100644 --- a/aws/table_aws_ec2_launch_template.go +++ b/aws/table_aws_ec2_launch_template.go @@ -26,6 +26,7 @@ func tableAwsEc2LaunchTemplate(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidLaunchTemplateName.NotFoundException", "InvalidLaunchTemplateId.NotFound", "InvalidLaunchTemplateId.Malformed"}), }, Hydrate: listEc2LaunchTemplates, + Tags: map[string]string{"service": "ec2", "action": "DescribeLaunchTemplates"}, KeyColumns: []*plugin.KeyColumn{ { Name: "launch_template_name", @@ -138,6 +139,9 @@ func listEc2LaunchTemplates(ctx context.Context, d *plugin.QueryData, _ *plugin. // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { // When a table is used as the parent hydrate in another table, the ignore config does not function as expected. Consequently, it becomes necessary to handle this situation manually. diff --git a/aws/table_aws_ec2_launch_template_version.go b/aws/table_aws_ec2_launch_template_version.go index 962c0a67c..85d416320 100644 --- a/aws/table_aws_ec2_launch_template_version.go +++ b/aws/table_aws_ec2_launch_template_version.go @@ -26,6 +26,7 @@ func tableAwsEc2LaunchTemplateVersion(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidLaunchTemplateId.NotFound", "InvalidLaunchTemplateId.VersionNotFound"}), }, Hydrate: getEc2LaunchTemplateVersion, + Tags: map[string]string{"service": "ec2", "action": "DescribeLaunchTemplateVersions"}, }, List: &plugin.ListConfig{ // IgnoreConfig: &plugin.IgnoreConfig{ @@ -33,6 +34,7 @@ func tableAwsEc2LaunchTemplateVersion(_ context.Context) *plugin.Table { // }, ParentHydrate: listEc2LaunchTemplates, Hydrate: listEc2LaunchTemplateVersions, + Tags: map[string]string{"service": "ec2", "action": "DescribeLaunchTemplateVersions"}, KeyColumns: []*plugin.KeyColumn{ { Name: "launch_template_id", @@ -254,6 +256,9 @@ func listEc2LaunchTemplateVersions(ctx context.Context, d *plugin.QueryData, h * // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_launch_template_version.listEc2LaunchTemplateVersions", "api_error", err) diff --git a/aws/table_aws_ec2_load_balancer_listener.go b/aws/table_aws_ec2_load_balancer_listener.go index 8d34b0b37..44443f83e 100644 --- a/aws/table_aws_ec2_load_balancer_listener.go +++ b/aws/table_aws_ec2_load_balancer_listener.go @@ -27,10 +27,12 @@ func tableAwsEc2ApplicationLoadBalancerListener(_ context.Context) *plugin.Table ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ListenerNotFound", "LoadBalancerNotFound", "ValidationError"}), }, Hydrate: getEc2LoadBalancerListener, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeLoadBalancers"}, }, List: &plugin.ListConfig{ ParentHydrate: listEc2LoadBalancers, Hydrate: listEc2LoadBalancerListeners, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeLoadBalancers"}, }, GetMatrixItemFunc: SupportedRegionMatrix(elbv2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -126,6 +128,9 @@ func listEc2LoadBalancers(ctx context.Context, d *plugin.QueryData, _ *plugin.Hy // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_load_balancer_listener.listEc2LoadBalancers", "api_error", err) @@ -178,6 +183,9 @@ func listEc2LoadBalancerListeners(ctx context.Context, d *plugin.QueryData, h *p // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_load_balancer_listener.listEc2LoadBalancerListeners", "api_error", err) diff --git a/aws/table_aws_ec2_managed_prefix_list.go b/aws/table_aws_ec2_managed_prefix_list.go index 193d8cc93..fdb9a1e92 100644 --- a/aws/table_aws_ec2_managed_prefix_list.go +++ b/aws/table_aws_ec2_managed_prefix_list.go @@ -26,6 +26,7 @@ func tableAwsEc2ManagedPrefixList(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidAction", "InvalidRequest", "UnsupportedOperation"}), }, Hydrate: listManagedPrefixList, + Tags: map[string]string{"service": "ec2", "action": "DescribeManagedPrefixLists"}, KeyColumns: []*plugin.KeyColumn{ {Name: "name", Require: plugin.Optional}, {Name: "id", Require: plugin.Optional}, @@ -180,6 +181,9 @@ func listManagedPrefixList(ctx context.Context, d *plugin.QueryData, _ *plugin.H // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_managed_prefix_list.listManagedPrefixList", "api_error", err) diff --git a/aws/table_aws_ec2_managed_prefix_list_entry.go b/aws/table_aws_ec2_managed_prefix_list_entry.go index fa133b21d..6a4b75ab8 100644 --- a/aws/table_aws_ec2_managed_prefix_list_entry.go +++ b/aws/table_aws_ec2_managed_prefix_list_entry.go @@ -27,6 +27,7 @@ func tableAwsEc2ManagedPrefixListEntry(_ context.Context) *plugin.Table { }, ParentHydrate: listManagedPrefixList, Hydrate: listManagedPrefixListEntries, + Tags: map[string]string{"service": "ec2", "action": "GetManagedPrefixListEntries"}, KeyColumns: []*plugin.KeyColumn{ {Name: "prefix_list_id", Require: plugin.Optional}, }, @@ -104,6 +105,9 @@ func listManagedPrefixListEntries(ctx context.Context, d *plugin.QueryData, h *p // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_managed_prefix_list_entry.listManagedPrefixListEntries", "api_error", err) diff --git a/aws/table_aws_ec2_network_interface.go b/aws/table_aws_ec2_network_interface.go index 6666941bb..d5a7001dc 100644 --- a/aws/table_aws_ec2_network_interface.go +++ b/aws/table_aws_ec2_network_interface.go @@ -28,9 +28,11 @@ func tableAwsEc2NetworkInterface(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidNetworkInterfaceID.NotFound", "InvalidNetworkInterfaceID.Unavailable", "InvalidNetworkInterfaceID.Malformed"}), }, Hydrate: getEc2NetworkInterface, + Tags: map[string]string{"service": "ec2", "action": "DescribeNetworkInterfaces"}, }, List: &plugin.ListConfig{ Hydrate: listEc2NetworkInterfaces, + Tags: map[string]string{"service": "ec2", "action": "DescribeNetworkInterfaces"}, KeyColumns: []*plugin.KeyColumn{ {Name: "association_id", Require: plugin.Optional}, {Name: "association_allocation_id", Require: plugin.Optional}, @@ -304,6 +306,9 @@ func listEc2NetworkInterfaces(ctx context.Context, d *plugin.QueryData, _ *plugi // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_network_interface.listEc2NetworkInterfaces", "api_error", err) diff --git a/aws/table_aws_ec2_network_load_balancer.go b/aws/table_aws_ec2_network_load_balancer.go index e07ca7586..725ca17e7 100644 --- a/aws/table_aws_ec2_network_load_balancer.go +++ b/aws/table_aws_ec2_network_load_balancer.go @@ -26,9 +26,11 @@ func tableAwsEc2NetworkLoadBalancer(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"LoadBalancerNotFound", "ValidationError"}), }, Hydrate: getEc2NetworkLoadBalancer, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeLoadBalancers"}, }, List: &plugin.ListConfig{ Hydrate: listEc2NetworkLoadBalancers, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeLoadBalancers"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"LoadBalancerNotFound", "ValidationError"}), }, @@ -39,6 +41,16 @@ func tableAwsEc2NetworkLoadBalancer(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsEc2NetworkLoadBalancerAttributes, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeLoadBalancerAttributes"}, + }, + { + Func: getAwsEc2NetworkLoadBalancerTags, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeTags"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(elbv2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -196,6 +208,9 @@ func listEc2NetworkLoadBalancers(ctx context.Context, d *plugin.QueryData, _ *pl // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_api_gateway_rest_api.listRestAPI", "api_error", err) diff --git a/aws/table_aws_ec2_network_load_balancer_metric_net_flow_count.go b/aws/table_aws_ec2_network_load_balancer_metric_net_flow_count.go index 30c2753b0..faf777e30 100644 --- a/aws/table_aws_ec2_network_load_balancer_metric_net_flow_count.go +++ b/aws/table_aws_ec2_network_load_balancer_metric_net_flow_count.go @@ -20,6 +20,7 @@ func tableAwsEc2NetworkLoadBalancerMetricNetFlowCount(_ context.Context) *plugin List: &plugin.ListConfig{ ParentHydrate: listEc2NetworkLoadBalancers, Hydrate: listEc2NetworkLoadBalancerMetricNetFlowCount, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_ec2_network_load_balancer_metric_net_flow_count_daily.go b/aws/table_aws_ec2_network_load_balancer_metric_net_flow_count_daily.go index bdce27ce3..e80294c8b 100644 --- a/aws/table_aws_ec2_network_load_balancer_metric_net_flow_count_daily.go +++ b/aws/table_aws_ec2_network_load_balancer_metric_net_flow_count_daily.go @@ -20,6 +20,7 @@ func tableAwsEc2NetworkLoadBalancerMetricNetFlowCountDaily(_ context.Context) *p List: &plugin.ListConfig{ ParentHydrate: listEc2NetworkLoadBalancers, Hydrate: listEc2NetworkLoadBalancerMetricNetFlowCountDaily, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_ec2_regional_settings.go b/aws/table_aws_ec2_regional_settings.go index 55e149496..e55648adf 100644 --- a/aws/table_aws_ec2_regional_settings.go +++ b/aws/table_aws_ec2_regional_settings.go @@ -25,6 +25,16 @@ func tableAwsEc2RegionalSettings(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ Hydrate: listEc2RegionalSettings, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getDefaultEBSVolumeEncryption, + Tags: map[string]string{"service": "ec2", "action": "GetEbsEncryptionByDefault"}, + }, + { + Func: getDefaultEBSVolumeEncryptionKey, + Tags: map[string]string{"service": "ec2", "action": "GetEbsDefaultKmsKeyId"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(ec2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { diff --git a/aws/table_aws_ec2_reserved_instance.go b/aws/table_aws_ec2_reserved_instance.go index 0fae4d2c5..f4e70dfc4 100644 --- a/aws/table_aws_ec2_reserved_instance.go +++ b/aws/table_aws_ec2_reserved_instance.go @@ -28,9 +28,11 @@ func tableAwsEc2ReservedInstance(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValue", "InvalidInstanceID.Unavailable", "InvalidInstanceID.Malformed"}), }, Hydrate: getEc2ReservedInstance, + Tags: map[string]string{"service": "ec2", "action": "DescribeReservedInstances"}, }, List: &plugin.ListConfig{ Hydrate: listEc2ReservedInstances, + Tags: map[string]string{"service": "ec2", "action": "DescribeReservedInstances"}, KeyColumns: []*plugin.KeyColumn{ {Name: "availability_zone", Require: plugin.Optional}, {Name: "duration", Require: plugin.Optional}, @@ -46,6 +48,12 @@ func tableAwsEc2ReservedInstance(_ context.Context) *plugin.Table { {Name: "offering_type", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getEc2ReservedInstanceModificationDetails, + Tags: map[string]string{"service": "ec2", "action": "DescribeReservedInstancesModifications"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(ec2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { diff --git a/aws/table_aws_ec2_spot_price.go b/aws/table_aws_ec2_spot_price.go index 956f2f87e..aa775a8ab 100644 --- a/aws/table_aws_ec2_spot_price.go +++ b/aws/table_aws_ec2_spot_price.go @@ -22,6 +22,7 @@ func tableAwsEc2SpotPrice(_ context.Context) *plugin.Table { Description: "AWS EC2 Spot Price History", List: &plugin.ListConfig{ Hydrate: listEc2SpotPrice, + Tags: map[string]string{"service": "ec2", "action": "DescribeSpotPriceHistory"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValue"}), }, @@ -110,6 +111,9 @@ func listEc2SpotPrice(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrat ) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_spot_price_history.listEc2SpotPrice", "api_error", err) diff --git a/aws/table_aws_ec2_ssl_policy.go b/aws/table_aws_ec2_ssl_policy.go index 6e580bd20..74f7cc71f 100644 --- a/aws/table_aws_ec2_ssl_policy.go +++ b/aws/table_aws_ec2_ssl_policy.go @@ -26,9 +26,11 @@ func tableAwsEc2SslPolicy(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"SSLPolicyNotFound"}), }, Hydrate: getEc2SslPolicy, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeSSLPolicies"}, }, List: &plugin.ListConfig{ Hydrate: listEc2SslPolicies, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeSSLPolicies"}, }, GetMatrixItemFunc: SupportedRegionMatrix(elbv2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -97,6 +99,9 @@ func listEc2SslPolicies(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydr pagesLeft := true for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + response, err := svc.DescribeSSLPolicies(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_ec2_ssl_policy.listEc2SslPolicies", "api_error", err) diff --git a/aws/table_aws_ec2_target_group.go b/aws/table_aws_ec2_target_group.go index eed4aeaf7..82813b257 100644 --- a/aws/table_aws_ec2_target_group.go +++ b/aws/table_aws_ec2_target_group.go @@ -26,9 +26,11 @@ func tableAwsEc2TargetGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"LoadBalancerNotFound", "TargetGroupNotFound", "ValidationError"}), }, Hydrate: getEc2TargetGroup, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeTargetGroups"}, }, List: &plugin.ListConfig{ Hydrate: listEc2TargetGroups, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeTargetGroups"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"TargetGroupNotFound", "ValidationError"}), }, @@ -36,6 +38,16 @@ func tableAwsEc2TargetGroup(_ context.Context) *plugin.Table { {Name: "target_group_name", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsEc2TargetGroupTargetHealthDescription, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeTargetHealth"}, + }, + { + Func: getAwsEc2TargetGroupTags, + Tags: map[string]string{"service": "elasticloadbalancing", "action": "DescribeTags"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(elbv2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -200,6 +212,9 @@ func listEc2TargetGroups(ctx context.Context, d *plugin.QueryData, _ *plugin.Hyd // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_target_group.listEc2TargetGroups", "api_error", err) diff --git a/aws/table_aws_ec2_transit_gateway.go b/aws/table_aws_ec2_transit_gateway.go index e6339f584..3b30cc563 100644 --- a/aws/table_aws_ec2_transit_gateway.go +++ b/aws/table_aws_ec2_transit_gateway.go @@ -27,9 +27,11 @@ func tableAwsEc2TransitGateway(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidTransitGatewayID.NotFound", "InvalidTransitGatewayID.Unavailable", "InvalidTransitGatewayID.Malformed", "InvalidAction"}), }, Hydrate: getEc2TransitGateway, + Tags: map[string]string{"service": "ec2", "action": "DescribeTransitGateways"}, }, List: &plugin.ListConfig{ Hydrate: listEc2TransitGateways, + Tags: map[string]string{"service": "ec2", "action": "DescribeTransitGateways"}, KeyColumns: []*plugin.KeyColumn{ {Name: "propagation_default_route_table_id", Require: plugin.Optional}, {Name: "amazon_side_asn", Require: plugin.Optional}, @@ -214,6 +216,9 @@ func listEc2TransitGateways(ctx context.Context, d *plugin.QueryData, _ *plugin. // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_transit_gateway.listEc2TransitGateways", "api_error", err) diff --git a/aws/table_aws_ec2_transit_gateway_route.go b/aws/table_aws_ec2_transit_gateway_route.go index 3763a1f91..6f1429c7c 100644 --- a/aws/table_aws_ec2_transit_gateway_route.go +++ b/aws/table_aws_ec2_transit_gateway_route.go @@ -23,6 +23,7 @@ func tableAwsEc2TransitGatewayRoute(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listEc2TransitGatewayRouteTable, Hydrate: listEc2TransitGatewayRoute, + Tags: map[string]string{"service": "ec2", "action": "SearchTransitGatewayRoutes"}, KeyColumns: []*plugin.KeyColumn{ {Name: "prefix_list_id", Require: plugin.Optional}, {Name: "state", Require: plugin.Optional}, diff --git a/aws/table_aws_ec2_transit_gateway_route_table.go b/aws/table_aws_ec2_transit_gateway_route_table.go index c66210116..7a6db5e4d 100644 --- a/aws/table_aws_ec2_transit_gateway_route_table.go +++ b/aws/table_aws_ec2_transit_gateway_route_table.go @@ -27,9 +27,11 @@ func tableAwsEc2TransitGatewayRouteTable(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidRouteTableID.NotFound", "InvalidRouteTableId.Unavailable", "InvalidRouteTableId.Malformed"}), }, Hydrate: getEc2TransitGatewayRouteTable, + Tags: map[string]string{"service": "ec2", "action": "DescribeTransitGatewayRouteTables"}, }, List: &plugin.ListConfig{ Hydrate: listEc2TransitGatewayRouteTable, + Tags: map[string]string{"service": "ec2", "action": "DescribeTransitGatewayRouteTables"}, KeyColumns: []*plugin.KeyColumn{ {Name: "transit_gateway_id", Require: plugin.Optional}, {Name: "state", Require: plugin.Optional}, @@ -155,6 +157,9 @@ func listEc2TransitGatewayRouteTable(ctx context.Context, d *plugin.QueryData, _ // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_transit_gateway_route_table.listEc2TransitGatewayRouteTable", "api_error", err) diff --git a/aws/table_aws_ec2_transit_gateway_vpc_attachment.go b/aws/table_aws_ec2_transit_gateway_vpc_attachment.go index 2bb5e7a4f..1592e78f9 100644 --- a/aws/table_aws_ec2_transit_gateway_vpc_attachment.go +++ b/aws/table_aws_ec2_transit_gateway_vpc_attachment.go @@ -23,9 +23,11 @@ func tableAwsEc2TransitGatewayVpcAttachment(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidTransitGatewayAttachmentID.NotFound", "InvalidTransitGatewayAttachmentID.Unavailable", "InvalidTransitGatewayAttachmentID.Malformed", "InvalidAction"}), }, Hydrate: getEc2TransitGatewayVpcAttachment, + Tags: map[string]string{"service": "ec2", "action": "DescribeTransitGatewayAttachments"}, }, List: &plugin.ListConfig{ Hydrate: listEc2TransitGatewayVpcAttachment, + Tags: map[string]string{"service": "ec2", "action": "DescribeTransitGatewayAttachments"}, KeyColumns: []*plugin.KeyColumn{ {Name: "association_state", Require: plugin.Optional}, {Name: "association_transit_gateway_route_table_id", Require: plugin.Optional}, @@ -166,6 +168,9 @@ func listEc2TransitGatewayVpcAttachment(ctx context.Context, d *plugin.QueryData // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ec2_transit_gateway_vpc_attachment.listEc2TransitGatewayVpcAttachment", "api_error", err) diff --git a/aws/table_aws_ecr_image.go b/aws/table_aws_ecr_image.go index 673372100..2d14497cc 100644 --- a/aws/table_aws_ecr_image.go +++ b/aws/table_aws_ecr_image.go @@ -23,6 +23,7 @@ func tableAwsEcrImage(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listAwsEcrRepositories, Hydrate: listAwsEcrImages, + Tags: map[string]string{"service": "ecr", "action": "DescribeImages"}, KeyColumns: []*plugin.KeyColumn{ {Name: "repository_name", Require: plugin.Optional}, {Name: "registry_id", Require: plugin.Optional}, @@ -147,6 +148,9 @@ func listAwsEcrImages(ctx context.Context, d *plugin.QueryData, h *plugin.Hydrat // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ecr_image.listAwsEcrImages", "api_error", err) diff --git a/aws/table_aws_ecr_image_scan_finding.go b/aws/table_aws_ecr_image_scan_finding.go index 7bce2a32d..5eaf006b7 100644 --- a/aws/table_aws_ecr_image_scan_finding.go +++ b/aws/table_aws_ecr_image_scan_finding.go @@ -23,6 +23,7 @@ func tableAwsEcrImageScanFinding(_ context.Context) *plugin.Table { Description: "AWS ECR Image Scan Finding", List: &plugin.ListConfig{ Hydrate: listAwsEcrImageScanFindings, + Tags: map[string]string{"service": "ecr", "action": "DescribeImageScanFindings"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"RepositoryNotFoundException", "ImageNotFoundException", "ScanNotFoundException"}), }, @@ -160,6 +161,9 @@ func listAwsEcrImageScanFindings(ctx context.Context, d *plugin.QueryData, _ *pl // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ecr_image_scan_finding.listAwsEcrImageScanFindings", "api_error", err) diff --git a/aws/table_aws_ecr_repository.go b/aws/table_aws_ecr_repository.go index 32a6ffd5b..0a46d6aee 100644 --- a/aws/table_aws_ecr_repository.go +++ b/aws/table_aws_ecr_repository.go @@ -30,13 +30,45 @@ func tableAwsEcrRepository(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"RepositoryNotFoundException", "RepositoryPolicyNotFoundException", "LifecyclePolicyNotFoundException"}), }, Hydrate: getAwsEcrRepositories, + Tags: map[string]string{"service": "ecr", "action": "DescribeRepositories"}, }, List: &plugin.ListConfig{ Hydrate: listAwsEcrRepositories, + Tags: map[string]string{"service": "ecr", "action": "DescribeRepositories"}, KeyColumns: []*plugin.KeyColumn{ {Name: "registry_id", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsEcrRepositories, + Tags: map[string]string{"service": "ecr", "action": "DescribeRepositories"}, + }, + { + Func: listAwsEcrRepositoryTags, + Tags: map[string]string{"service": "ecr", "action": "ListTagsForResource"}, + }, + { + Func: getAwsEcrRepositoryPolicy, + Tags: map[string]string{"service": "ecr", "action": "GetRepositoryPolicy"}, + }, + { + Func: getAwsEcrDescribeImages, + Tags: map[string]string{"service": "ecr", "action": "DescribeImages"}, + }, + { + Func: getAwsEcrDescribeImageScanningFindings, + Tags: map[string]string{"service": "ecr", "action": "DescribeImageScanFindings"}, + }, + { + Func: getAwsEcrRepositoryLifecyclePolicy, + Tags: map[string]string{"service": "ecr", "action": "GetLifecyclePolicy"}, + }, + { + Func: getAwsEcrRepositoryScanningConfiguration, + Tags: map[string]string{"service": "ecr", "action": "BatchGetRepositoryScanningConfiguration"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(ecrv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -206,6 +238,9 @@ func listAwsEcrRepositories(ctx context.Context, d *plugin.QueryData, _ *plugin. // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ecr_repository.listAwsEcrRepositories", "api_error", err) @@ -379,6 +414,9 @@ func getAwsEcrDescribeImageScanningFindings(ctx context.Context, d *plugin.Query // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + scan, err := paginator.NextPage(ctx) if err != nil { if strings.Contains(err.Error(), "ScanNotFoundException") { diff --git a/aws/table_aws_ecrpublic_repository.go b/aws/table_aws_ecrpublic_repository.go index 0231c04a6..d900e190a 100644 --- a/aws/table_aws_ecrpublic_repository.go +++ b/aws/table_aws_ecrpublic_repository.go @@ -27,13 +27,29 @@ func tableAwsEcrpublicRepository(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"RepositoryNotFoundException", "RepositoryPolicyNotFoundException", "LifecyclePolicyNotFoundException"}), }, Hydrate: getAwsEcrpublicRepository, + Tags: map[string]string{"service": "ecr-public", "action": "DescribeRepositories"}, }, List: &plugin.ListConfig{ Hydrate: listAwsEcrpublicRepositories, + Tags: map[string]string{"service": "ecr-public", "action": "DescribeRepositories"}, KeyColumns: []*plugin.KeyColumn{ {Name: "registry_id", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: listAwsEcrpublicRepositoryTags, + Tags: map[string]string{"service": "ecr-public", "action": "ListTagsForResource"}, + }, + { + Func: getAwsEcrpublicRepositoryPolicy, + Tags: map[string]string{"service": "ecr-public", "action": "GetRepositoryPolicy"}, + }, + { + Func: getAwsEcrpublicDescribeImages, + Tags: map[string]string{"service": "ecr-public", "action": "DescribeImages"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(ecrpublicv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -161,6 +177,9 @@ func listAwsEcrpublicRepositories(ctx context.Context, d *plugin.QueryData, _ *p // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ecrpublic_repository.listAwsEcrpublicRepositories", "api_error", err) diff --git a/aws/table_aws_ecs_cluster.go b/aws/table_aws_ecs_cluster.go index 567a11477..49bb786b4 100644 --- a/aws/table_aws_ecs_cluster.go +++ b/aws/table_aws_ecs_cluster.go @@ -26,9 +26,21 @@ func tableAwsEcsCluster(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "InvalidParameterException"}), }, Hydrate: getEcsCluster, + Tags: map[string]string{"service": "ecs", "action": "DescribeClusters"}, }, List: &plugin.ListConfig{ Hydrate: listEcsClusters, + Tags: map[string]string{"service": "ecs", "action": "ListClusters"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getEcsCluster, + Tags: map[string]string{"service": "ecs", "action": "DescribeClusters"}, + }, + { + Func: getAwsEcsClusterTags, + Tags: map[string]string{"service": "ecs", "action": "ListTagsForResource"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(ecsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -175,6 +187,9 @@ func listEcsClusters(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrate // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ecs_cluster.listEcsClusters", "api_error", err) diff --git a/aws/table_aws_ecs_cluster_metric_cpu_utilization.go b/aws/table_aws_ecs_cluster_metric_cpu_utilization.go index d0f98031f..ff2285b20 100644 --- a/aws/table_aws_ecs_cluster_metric_cpu_utilization.go +++ b/aws/table_aws_ecs_cluster_metric_cpu_utilization.go @@ -19,6 +19,7 @@ func tableAwsEcsClusterMetricCpuUtilization(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listEcsClusters, Hydrate: listEcsClusterMetricCpuUtilization, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_ecs_cluster_metric_cpu_utilization_daily.go b/aws/table_aws_ecs_cluster_metric_cpu_utilization_daily.go index 568a82862..021126e18 100644 --- a/aws/table_aws_ecs_cluster_metric_cpu_utilization_daily.go +++ b/aws/table_aws_ecs_cluster_metric_cpu_utilization_daily.go @@ -20,6 +20,7 @@ func tableAwsEcsClusterMetricCpuUtilizationDaily(_ context.Context) *plugin.Tabl List: &plugin.ListConfig{ ParentHydrate: listEcsClusters, Hydrate: listEcsClusterMetricCpuUtilizationDaily, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_ecs_cluster_metric_cpu_utilization_hourly.go b/aws/table_aws_ecs_cluster_metric_cpu_utilization_hourly.go index 4323df6f5..2e15c678b 100644 --- a/aws/table_aws_ecs_cluster_metric_cpu_utilization_hourly.go +++ b/aws/table_aws_ecs_cluster_metric_cpu_utilization_hourly.go @@ -19,6 +19,7 @@ func tableAwsEcsClusterMetricCpuUtilizationHourly(_ context.Context) *plugin.Tab List: &plugin.ListConfig{ ParentHydrate: listEcsClusters, Hydrate: listEcsClusterMetricCpuUtilizationHourly, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_ecs_container_instance.go b/aws/table_aws_ecs_container_instance.go index 83a4c793e..3b8afa305 100644 --- a/aws/table_aws_ecs_container_instance.go +++ b/aws/table_aws_ecs_container_instance.go @@ -21,6 +21,7 @@ func tableAwsEcsContainerInstance(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listEcsClusters, Hydrate: listEcsContainerInstances, + Tags: map[string]string{"service": "ecs", "action": "ListContainerInstances"}, }, GetMatrixItemFunc: SupportedRegionMatrix(ecsv1.EndpointsID), Columns: awsGlobalRegionColumns([]*plugin.Column{ @@ -192,6 +193,9 @@ func listEcsContainerInstances(ctx context.Context, d *plugin.QueryData, h *plug // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ecs_cluster.listEcsClusters", "api_error", err) diff --git a/aws/table_aws_ecs_service.go b/aws/table_aws_ecs_service.go index 7e3d71ada..be24abba8 100644 --- a/aws/table_aws_ecs_service.go +++ b/aws/table_aws_ecs_service.go @@ -23,11 +23,18 @@ func tableAwsEcsService(_ context.Context) *plugin.Table { Description: "AWS ECS Service", List: &plugin.ListConfig{ Hydrate: listEcsServices, + Tags: map[string]string{"service": "ecs", "action": "ListServices"}, ParentHydrate: listEcsClusters, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ClusterNotFoundException"}), }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getEcsServiceTags, + Tags: map[string]string{"service": "ecs", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(ecsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -253,6 +260,9 @@ func listEcsServices(ctx context.Context, d *plugin.QueryData, h *plugin.Hydrate var serviceNames []string // List all available ECS services for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ecs_service.listEcsServices", "api_error", err) diff --git a/aws/table_aws_ecs_task.go b/aws/table_aws_ecs_task.go index 7bfed105d..5e5c2ea89 100644 --- a/aws/table_aws_ecs_task.go +++ b/aws/table_aws_ecs_task.go @@ -21,6 +21,7 @@ func tableAwsEcsTask(_ context.Context) *plugin.Table { Description: "AWS ECS Task", List: &plugin.ListConfig{ Hydrate: listEcsTasks, + Tags: map[string]string{"service": "ecs", "action": "DescribeTasks"}, ParentHydrate: listEcsClusters, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ClusterNotFoundException", "ServiceNotFoundException", "InvalidParameterException"}), @@ -45,6 +46,12 @@ func tableAwsEcsTask(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getEcsTaskProtection, + Tags: map[string]string{"service": "ecs", "action": "GetTaskProtection"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(ecsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -319,6 +326,9 @@ func listEcsTasks(ctx context.Context, d *plugin.QueryData, h *plugin.HydrateDat // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { // Error could not be caught by ignore config, we need to handle it manually diff --git a/aws/table_aws_ecs_task_definition.go b/aws/table_aws_ecs_task_definition.go index bac3a8751..5fa0a81f5 100644 --- a/aws/table_aws_ecs_task_definition.go +++ b/aws/table_aws_ecs_task_definition.go @@ -27,14 +27,22 @@ func tableAwsEcsTaskDefinition(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterException", "ClientException"}), }, Hydrate: getEcsTaskDefinition, + Tags: map[string]string{"service": "ecs", "action": "DescribeTaskDefinition"}, }, List: &plugin.ListConfig{ Hydrate: listEcsTaskDefinitions, + Tags: map[string]string{"service": "ecs", "action": "ListTaskDefinitions"}, KeyColumns: []*plugin.KeyColumn{ {Name: "family", Require: plugin.Optional}, {Name: "status", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getEcsTaskDefinition, + Tags: map[string]string{"service": "ecs", "action": "DescribeTaskDefinition"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(ecsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -259,6 +267,9 @@ func listEcsTaskDefinitions(ctx context.Context, d *plugin.QueryData, _ *plugin. // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ecs_task_definition.listEcsTaskDefinitions", "api_error", err) diff --git a/aws/table_aws_efs_access_point.go b/aws/table_aws_efs_access_point.go index 2499c4952..0bd04f63d 100644 --- a/aws/table_aws_efs_access_point.go +++ b/aws/table_aws_efs_access_point.go @@ -26,9 +26,11 @@ func tableAwsEfsAccessPoint(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"AccessPointNotFound"}), }, Hydrate: getEfsAccessPoint, + Tags: map[string]string{"service": "elasticfilesystem", "action": "DescribeAccessPoints"}, }, List: &plugin.ListConfig{ Hydrate: listEfsAccessPoints, + Tags: map[string]string{"service": "elasticfilesystem", "action": "DescribeAccessPoints"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"FileSystemNotFound"}), }, @@ -152,6 +154,9 @@ func listEfsAccessPoints(ctx context.Context, d *plugin.QueryData, _ *plugin.Hyd o.StopOnDuplicateToken = true }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_efs_access_point.listEfsAccessPoints", "api_error", err) diff --git a/aws/table_aws_efs_file_system.go b/aws/table_aws_efs_file_system.go index e188258a3..7f5521117 100644 --- a/aws/table_aws_efs_file_system.go +++ b/aws/table_aws_efs_file_system.go @@ -28,13 +28,21 @@ func tableAwsElasticFileSystem(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"FileSystemNotFound", "ValidationException"}), }, Hydrate: getElasticFileSystem, + Tags: map[string]string{"service": "elasticfilesystem", "action": "DescribeFileSystems"}, }, List: &plugin.ListConfig{ Hydrate: listElasticFileSystem, + Tags: map[string]string{"service": "elasticfilesystem", "action": "DescribeFileSystems"}, KeyColumns: []*plugin.KeyColumn{ {Name: "creation_token", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getElasticFileSystemPolicy, + Tags: map[string]string{"service": "elasticfilesystem", "action": "DescribeFileSystemPolicy"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(efsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -198,6 +206,9 @@ func listElasticFileSystem(ctx context.Context, d *plugin.QueryData, _ *plugin.H o.StopOnDuplicateToken = true }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_efs_access_point.listElasticFileSystem", "api_error", err) diff --git a/aws/table_aws_efs_mount_target.go b/aws/table_aws_efs_mount_target.go index 33fa22312..167fbce28 100644 --- a/aws/table_aws_efs_mount_target.go +++ b/aws/table_aws_efs_mount_target.go @@ -27,10 +27,18 @@ func tableAwsEfsMountTarget(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"MountTargetNotFound", "InvalidParameter"}), }, Hydrate: getAwsEfsMountTarget, + Tags: map[string]string{"service": "elasticfilesystem", "action": "DescribeMountTargets"}, }, List: &plugin.ListConfig{ ParentHydrate: listElasticFileSystem, Hydrate: listAwsEfsMountTargets, + Tags: map[string]string{"service": "elasticfilesystem", "action": "DescribeMountTargets"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsEfsMountTargetSecurityGroup, + Tags: map[string]string{"service": "elasticfilesystem", "action": "DescribeMountTargetSecurityGroups"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(efsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -145,6 +153,9 @@ func listAwsEfsMountTargets(ctx context.Context, d *plugin.QueryData, h *plugin. // List call pagesLeft := true for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.DescribeMountTargets(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_efs_mount_target.listAwsEfsMountTargets", "api_error", err) diff --git a/aws/table_aws_eks_addon.go b/aws/table_aws_eks_addon.go index 6fbfafc5e..283655ca0 100644 --- a/aws/table_aws_eks_addon.go +++ b/aws/table_aws_eks_addon.go @@ -26,10 +26,18 @@ func tableAwsEksAddon(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "InvalidParameterException", "InvalidParameter"}), }, Hydrate: getEksAddon, + Tags: map[string]string{"service": "eks", "action": "DescribeAddon"}, }, List: &plugin.ListConfig{ ParentHydrate: listEKSClusters, Hydrate: listEKSAddons, + Tags: map[string]string{"service": "eks", "action": "ListAddons"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getEksAddon, + Tags: map[string]string{"service": "eks", "action": "DescribeAddon"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(eksv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -151,6 +159,9 @@ func listEKSAddons(ctx context.Context, d *plugin.QueryData, h *plugin.HydrateDa }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_eks_addon.listEKSAddons", "api_error", err) diff --git a/aws/table_aws_eks_addon_version.go b/aws/table_aws_eks_addon_version.go index a697e6fe4..227f36f91 100644 --- a/aws/table_aws_eks_addon_version.go +++ b/aws/table_aws_eks_addon_version.go @@ -22,10 +22,17 @@ func tableAwsEksAddonVersion(_ context.Context) *plugin.Table { Description: "AWS EKS Addon Version", List: &plugin.ListConfig{ Hydrate: listEksAddonVersions, + Tags: map[string]string{"service": "eks", "action": "DescribeAddonVersions"}, KeyColumns: []*plugin.KeyColumn{ {Name: "addon_name", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getEksAddonConfiguration, + Tags: map[string]string{"service": "eks", "action": "DescribeAddonConfiguration"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(eksv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -127,6 +134,9 @@ func listEksAddonVersions(ctx context.Context, d *plugin.QueryData, _ *plugin.Hy }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_eks_addon_version.listEksAddonVersions", "api_error", err) diff --git a/aws/table_aws_eks_cluster.go b/aws/table_aws_eks_cluster.go index 8fe97c97e..9ae9e326c 100644 --- a/aws/table_aws_eks_cluster.go +++ b/aws/table_aws_eks_cluster.go @@ -23,9 +23,17 @@ func tableAwsEksCluster(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("name"), Hydrate: getEKSCluster, + Tags: map[string]string{"service": "eks", "action": "DescribeCluster"}, }, List: &plugin.ListConfig{ Hydrate: listEKSClusters, + Tags: map[string]string{"service": "eks", "action": "ListClusters"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getEKSCluster, + Tags: map[string]string{"service": "eks", "action": "DescribeCluster"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(eksv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -173,6 +181,9 @@ func listEKSClusters(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrate }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_eks_cluster.listEksClusters", "api_error", err) diff --git a/aws/table_aws_eks_fargate_profile.go b/aws/table_aws_eks_fargate_profile.go index 92c1b8432..8721956ea 100644 --- a/aws/table_aws_eks_fargate_profile.go +++ b/aws/table_aws_eks_fargate_profile.go @@ -23,10 +23,12 @@ func tableAwsEksFargateProfile(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.AllColumns([]string{"cluster_name", "fargate_profile_name"}), Hydrate: getEKSFargateProfile, + Tags: map[string]string{"service": "eks", "action": "DescribeFargateProfile"}, }, List: &plugin.ListConfig{ ParentHydrate: listEKSClusters, Hydrate: listEKSFargateProfiles, + Tags: map[string]string{"service": "eks", "action": "ListFargateProfiles"}, KeyColumns: []*plugin.KeyColumn{ { Name: "cluster_name", @@ -34,6 +36,12 @@ func tableAwsEksFargateProfile(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getEKSFargateProfile, + Tags: map[string]string{"service": "eks", "action": "DescribeFargateProfile"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(eksv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -156,6 +164,9 @@ func listEKSFargateProfiles(ctx context.Context, d *plugin.QueryData, h *plugin. }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_eks_fargate_profile.listEKSFargateProfiles", "api_error", err) diff --git a/aws/table_aws_eks_identity_provider_config.go b/aws/table_aws_eks_identity_provider_config.go index a54dfe5ce..e60309723 100644 --- a/aws/table_aws_eks_identity_provider_config.go +++ b/aws/table_aws_eks_identity_provider_config.go @@ -29,10 +29,18 @@ func tableAwsEksIdentityProviderConfig(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.AllColumns([]string{"name", "type", "cluster_name"}), Hydrate: getEKSIdentityProviderConfig, + Tags: map[string]string{"service": "eks", "action": "DescribeIdentityProviderConfig"}, }, List: &plugin.ListConfig{ ParentHydrate: listEKSClusters, Hydrate: listEKSIdentityProviderConfigs, + Tags: map[string]string{"service": "eks", "action": "ListIdentityProviderConfigs"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getEKSIdentityProviderConfig, + Tags: map[string]string{"service": "eks", "action": "DescribeIdentityProviderConfig"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(eksv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -169,6 +177,9 @@ func listEKSIdentityProviderConfigs(ctx context.Context, d *plugin.QueryData, h }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_eks_identity_provider_config.listEKSIdentityProviderConfigs", "api_error", err) diff --git a/aws/table_aws_eks_node_group.go b/aws/table_aws_eks_node_group.go index a8f7092b4..f2e2d16fb 100644 --- a/aws/table_aws_eks_node_group.go +++ b/aws/table_aws_eks_node_group.go @@ -23,6 +23,7 @@ func tableAwsEksNodeGroup(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.AllColumns([]string{"nodegroup_name", "cluster_name"}), Hydrate: getEKSNodeGroup, + Tags: map[string]string{"service": "eks", "action": "DescribeNodegroup"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "InvalidParameterException", "InvalidParameter"}), }, @@ -30,10 +31,17 @@ func tableAwsEksNodeGroup(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listEKSClusters, Hydrate: listEKSNodeGroups, + Tags: map[string]string{"service": "eks", "action": "ListNodegroups"}, KeyColumns: []*plugin.KeyColumn{ {Name: "cluster_name", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getEKSNodeGroup, + Tags: map[string]string{"service": "eks", "action": "DescribeNodegroup"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(eksv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -240,6 +248,9 @@ func listEKSNodeGroups(ctx context.Context, d *plugin.QueryData, h *plugin.Hydra }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_eks_node_group.listEKSNodeGroups", "api_error", err) diff --git a/aws/table_aws_elastic_beanstalk_application.go b/aws/table_aws_elastic_beanstalk_application.go index 79c4892db..87ce77a8c 100644 --- a/aws/table_aws_elastic_beanstalk_application.go +++ b/aws/table_aws_elastic_beanstalk_application.go @@ -26,9 +26,17 @@ func tableAwsElasticBeanstalkApplication(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, Hydrate: getElasticBeanstalkApplication, + Tags: map[string]string{"service": "elasticbeanstalk", "action": "DescribeApplications"}, }, List: &plugin.ListConfig{ Hydrate: listElasticBeanstalkApplications, + Tags: map[string]string{"service": "elasticbeanstalk", "action": "DescribeApplications"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: listAwsElasticBeanstalkApplicationTags, + Tags: map[string]string{"service": "elasticbeanstalk", "action": "ListTagsForResource"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(elasticbeanstalkv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ diff --git a/aws/table_aws_elastic_beanstalk_environment.go b/aws/table_aws_elastic_beanstalk_environment.go index d44f19c7a..482e478ba 100644 --- a/aws/table_aws_elastic_beanstalk_environment.go +++ b/aws/table_aws_elastic_beanstalk_environment.go @@ -29,14 +29,30 @@ func tableAwsElasticBeanstalkEnvironment(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, Hydrate: getElasticBeanstalkEnvironment, + Tags: map[string]string{"service": "elasticbeanstalk", "action": "DescribeEnvironments"}, }, List: &plugin.ListConfig{ Hydrate: listElasticBeanstalkEnvironments, + Tags: map[string]string{"service": "elasticbeanstalk", "action": "DescribeEnvironments"}, KeyColumns: []*plugin.KeyColumn{ {Name: "environment_id", Require: plugin.Optional}, {Name: "application_name", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getElasticBeanstalkEnvironment, + Tags: map[string]string{"service": "elasticache", "action": "DescribeEnvironments"}, + }, + { + Func: listElasticBeanstalkEnvironmentTags, + Tags: map[string]string{"service": "elasticache", "action": "ListTagsForResource"}, + }, + { + Func: getAwsElasticBeanstalkEnvironmentManagedActions, + Tags: map[string]string{"service": "elasticache", "action": "DescribeEnvironmentManagedActions"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(elasticbeanstalkv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -233,6 +249,9 @@ func listElasticBeanstalkEnvironments(ctx context.Context, d *plugin.QueryData, } for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.DescribeEnvironments(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_elastic_beanstalk_environment.listElasticBeanstalkEnvironments", "api_error", err) diff --git a/aws/table_aws_elasticache_cluster.go b/aws/table_aws_elasticache_cluster.go index e258096b5..984a61a8d 100644 --- a/aws/table_aws_elasticache_cluster.go +++ b/aws/table_aws_elasticache_cluster.go @@ -29,10 +29,19 @@ func tableAwsElastiCacheCluster(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"CacheClusterNotFound", "InvalidParameterValue"}), }, Hydrate: getElastiCacheCluster, + Tags: map[string]string{"service": "elasticache", "action": "DescribeCacheClusters"}, }, List: &plugin.ListConfig{ Hydrate: listElastiCacheClusters, + Tags: map[string]string{"service": "elasticache", "action": "DescribeCacheClusters"}, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: listTagsForElastiCacheCluster, + Tags: map[string]string{"service": "elasticache", "action": "ListTagsForResource"}, + }, + }, + GetMatrixItemFunc: SupportedRegionMatrix(elasticachev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -220,6 +229,9 @@ func listElastiCacheClusters(ctx context.Context, d *plugin.QueryData, _ *plugin }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_elasticache_cluster.listElastiCacheClusters", "api_error", err) diff --git a/aws/table_aws_elasticache_parameter_group.go b/aws/table_aws_elasticache_parameter_group.go index cc0174c85..1ba484af7 100644 --- a/aws/table_aws_elasticache_parameter_group.go +++ b/aws/table_aws_elasticache_parameter_group.go @@ -25,9 +25,11 @@ func tableAwsElastiCacheParameterGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"CacheParameterGroupNotFound", "InvalidParameterValueException"}), }, Hydrate: getElastiCacheParameterGroup, + Tags: map[string]string{"service": "elasticache", "action": "DescribeCacheParameterGroups"}, }, List: &plugin.ListConfig{ Hydrate: listElastiCacheParameterGroup, + Tags: map[string]string{"service": "elasticache", "action": "DescribeCacheParameterGroups"}, }, GetMatrixItemFunc: SupportedRegionMatrix(elasticachev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -107,6 +109,9 @@ func listElastiCacheParameterGroup(ctx context.Context, d *plugin.QueryData, _ * }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_elasticache_parameter_group.listElastiCacheParameterGroup", "api_error", err) diff --git a/aws/table_aws_elasticache_redis_metric_cache_hits_hourly.go b/aws/table_aws_elasticache_redis_metric_cache_hits_hourly.go index 3987dc9af..6a3c958da 100644 --- a/aws/table_aws_elasticache_redis_metric_cache_hits_hourly.go +++ b/aws/table_aws_elasticache_redis_metric_cache_hits_hourly.go @@ -18,6 +18,7 @@ func tableAwsElasticacheRedisMetricCacheHitsHourly(_ context.Context) *plugin.Ta List: &plugin.ListConfig{ ParentHydrate: listElastiCacheClusters, Hydrate: listElastiCacheMetricCacheHitsHourly, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_elasticache_redis_metric_curr_connections_hourly.go b/aws/table_aws_elasticache_redis_metric_curr_connections_hourly.go index bf68b688e..eb3421442 100644 --- a/aws/table_aws_elasticache_redis_metric_curr_connections_hourly.go +++ b/aws/table_aws_elasticache_redis_metric_curr_connections_hourly.go @@ -18,6 +18,7 @@ func tableAwsElasticacheRedisMetricCurrConnectionsHourly(_ context.Context) *plu List: &plugin.ListConfig{ ParentHydrate: listElastiCacheClusters, Hydrate: listElastiCacheMetricCurrConnectionsHourly, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_elasticache_redis_metric_engine_cpu_utilization_daily.go b/aws/table_aws_elasticache_redis_metric_engine_cpu_utilization_daily.go index 8951210f5..e1f8b74b1 100644 --- a/aws/table_aws_elasticache_redis_metric_engine_cpu_utilization_daily.go +++ b/aws/table_aws_elasticache_redis_metric_engine_cpu_utilization_daily.go @@ -18,6 +18,7 @@ func tableAwsElasticacheRedisEngineCPUUtilizationDaily(_ context.Context) *plugi List: &plugin.ListConfig{ ParentHydrate: listElastiCacheClusters, Hydrate: listElastiCacheMetricEngineCPUUtilizationDaily, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_elasticache_redis_metric_engine_cpu_utilization_hourly.go b/aws/table_aws_elasticache_redis_metric_engine_cpu_utilization_hourly.go index dc3e92a06..7d4e613b2 100644 --- a/aws/table_aws_elasticache_redis_metric_engine_cpu_utilization_hourly.go +++ b/aws/table_aws_elasticache_redis_metric_engine_cpu_utilization_hourly.go @@ -18,6 +18,7 @@ func tableAwsElasticacheRedisEngineCPUUtilizationHourly(_ context.Context) *plug List: &plugin.ListConfig{ ParentHydrate: listElastiCacheClusters, Hydrate: listElastiCacheMetricEngineCPUUtilizationHourly, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_elasticache_redis_metric_get_type_cmds_hourly.go b/aws/table_aws_elasticache_redis_metric_get_type_cmds_hourly.go index 14040ca6d..dd1258103 100644 --- a/aws/table_aws_elasticache_redis_metric_get_type_cmds_hourly.go +++ b/aws/table_aws_elasticache_redis_metric_get_type_cmds_hourly.go @@ -18,6 +18,7 @@ func tableAwsElasticacheRedisMetricGetTypeCmdsHourly(_ context.Context) *plugin. List: &plugin.ListConfig{ ParentHydrate: listElastiCacheClusters, Hydrate: listElastiCacheMetricGetTypeCmdsHourly, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_elasticache_redis_metric_list_based_cmds_hourly.go b/aws/table_aws_elasticache_redis_metric_list_based_cmds_hourly.go index 6d0457c0d..b76efdd85 100644 --- a/aws/table_aws_elasticache_redis_metric_list_based_cmds_hourly.go +++ b/aws/table_aws_elasticache_redis_metric_list_based_cmds_hourly.go @@ -18,6 +18,7 @@ func tableAwsElasticacheRedisMetricListBasedCmdsHourly(_ context.Context) *plugi List: &plugin.ListConfig{ ParentHydrate: listElastiCacheClusters, Hydrate: listElastiCacheMetricListBasedCmdsHourly, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_elasticache_redis_metric_new_connections_hourly.go b/aws/table_aws_elasticache_redis_metric_new_connections_hourly.go index 207ae108d..238cb0663 100644 --- a/aws/table_aws_elasticache_redis_metric_new_connections_hourly.go +++ b/aws/table_aws_elasticache_redis_metric_new_connections_hourly.go @@ -18,6 +18,7 @@ func tableAwsElasticacheRedisMetricNewConnectionsHourly(_ context.Context) *plug List: &plugin.ListConfig{ ParentHydrate: listElastiCacheClusters, Hydrate: listElastiCacheMetricNewConnectionsHourly, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_elasticache_replication_group.go b/aws/table_aws_elasticache_replication_group.go index 374467831..c5561bd66 100644 --- a/aws/table_aws_elasticache_replication_group.go +++ b/aws/table_aws_elasticache_replication_group.go @@ -25,9 +25,11 @@ func tableAwsElastiCacheReplicationGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ReplicationGroupNotFoundFault", "InvalidParameterValue"}), }, Hydrate: getElastiCacheReplicationGroup, + Tags: map[string]string{"service": "elasticache", "action": "DescribeReplicationGroups"}, }, List: &plugin.ListConfig{ Hydrate: listElastiCacheReplicationGroups, + Tags: map[string]string{"service": "elasticache", "action": "DescribeReplicationGroups"}, }, GetMatrixItemFunc: SupportedRegionMatrix(elasticachev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -197,6 +199,9 @@ func listElastiCacheReplicationGroups(ctx context.Context, d *plugin.QueryData, }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_elasticache_replication_group.listElastiCacheParameterGroup", "api_error", err) diff --git a/aws/table_aws_elasticache_reserved_cache_node.go b/aws/table_aws_elasticache_reserved_cache_node.go index 5dcb79f60..d7e195d68 100644 --- a/aws/table_aws_elasticache_reserved_cache_node.go +++ b/aws/table_aws_elasticache_reserved_cache_node.go @@ -26,9 +26,11 @@ func tableAwsElastiCacheReservedCacheNode(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ReservedCacheNodeNotFound"}), }, Hydrate: getElastiCacheReservedCacheNode, + Tags: map[string]string{"service": "elasticache", "action": "DescribeReservedCacheNodes"}, }, List: &plugin.ListConfig{ Hydrate: listElastiCacheReservedCacheNodes, + Tags: map[string]string{"service": "elasticache", "action": "DescribeReservedCacheNodes"}, KeyColumns: []*plugin.KeyColumn{ {Name: "cache_node_type", Require: plugin.Optional}, {Name: "duration", Require: plugin.Optional}, @@ -170,6 +172,9 @@ func listElastiCacheReservedCacheNodes(ctx context.Context, d *plugin.QueryData, }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_elasticache_reserved_cache_node.listElastiCacheReservedCacheNodes", "api_error", err) diff --git a/aws/table_aws_elasticache_subnet_group.go b/aws/table_aws_elasticache_subnet_group.go index b1a0539d6..b2da08c1c 100644 --- a/aws/table_aws_elasticache_subnet_group.go +++ b/aws/table_aws_elasticache_subnet_group.go @@ -25,9 +25,11 @@ func tableAwsElastiCacheSubnetGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"CacheSubnetGroupNotFoundFault"}), }, Hydrate: getElastiCacheSubnetGroup, + Tags: map[string]string{"service": "elasticache", "action": "DescribeCacheSubnetGroups"}, }, List: &plugin.ListConfig{ Hydrate: listElastiCacheSubnetGroups, + Tags: map[string]string{"service": "elasticache", "action": "DescribeCacheSubnetGroups"}, }, GetMatrixItemFunc: SupportedRegionMatrix(elasticachev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -106,6 +108,9 @@ func listElastiCacheSubnetGroups(ctx context.Context, d *plugin.QueryData, _ *pl }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_elasticache_subnet_group.listElastiCacheSubnetGroups", "api_error", err) diff --git a/aws/table_aws_elasticsearch_domain.go b/aws/table_aws_elasticsearch_domain.go index 4aa1c6549..1c14860cf 100644 --- a/aws/table_aws_elasticsearch_domain.go +++ b/aws/table_aws_elasticsearch_domain.go @@ -23,14 +23,21 @@ func tableAwsElasticsearchDomain(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, Hydrate: getAwsElasticsearchDomain, + Tags: map[string]string{"service": "es", "action": "DescribeElasticsearchDomain"}, }, List: &plugin.ListConfig{ Hydrate: listAwsElasticsearchDomains, + Tags: map[string]string{"service": "es", "action": "ListDomainNames"}, }, HydrateConfig: []plugin.HydrateConfig{ { Func: listAwsElasticsearchDomainTags, Depends: []plugin.HydrateFunc{getAwsElasticsearchDomain}, + Tags: map[string]string{"service": "es", "action": "ListTags"}, + }, + { + Func: getAwsElasticsearchDomain, + Tags: map[string]string{"service": "es", "action": "DescribeElasticsearchDomain"}, }, }, GetMatrixItemFunc: SupportedRegionMatrix(elasticsearchservicev1.EndpointsID), diff --git a/aws/table_aws_emr_block_public_access_configuration.go b/aws/table_aws_emr_block_public_access_configuration.go index 22f630d91..d1f87e3c5 100644 --- a/aws/table_aws_emr_block_public_access_configuration.go +++ b/aws/table_aws_emr_block_public_access_configuration.go @@ -20,6 +20,7 @@ func tableAwsEmrBlockPublicAccessConfiguration(_ context.Context) *plugin.Table Description: "AWS EMR Block Public Access Configuration", List: &plugin.ListConfig{ Hydrate: listBlockPublicAccessConfigurations, + Tags: map[string]string{"service": "elasticmapreduce", "action": "GetBlockPublicAccessConfiguration"}, }, GetMatrixItemFunc: SupportedRegionMatrix(emrv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ diff --git a/aws/table_aws_emr_cluster.go b/aws/table_aws_emr_cluster.go index af6eea98d..3d678a1b5 100644 --- a/aws/table_aws_emr_cluster.go +++ b/aws/table_aws_emr_cluster.go @@ -26,14 +26,22 @@ func tableAwsEmrCluster(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidRequestException"}), }, Hydrate: getEmrCluster, + Tags: map[string]string{"service": "elasticmapreduce", "action": "DescribeCluster"}, }, List: &plugin.ListConfig{ Hydrate: listEmrClusters, + Tags: map[string]string{"service": "elasticmapreduce", "action": "ListClusters"}, KeyColumns: []*plugin.KeyColumn{ {Name: "state", Require: plugin.Optional}, }, }, GetMatrixItemFunc: SupportedRegionMatrix(emrv1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getEmrCluster, + Tags: map[string]string{"service": "elasticmapreduce", "action": "DescribeCluster"}, + }, + }, Columns: awsRegionalColumns([]*plugin.Column{ { Name: "name", @@ -271,6 +279,9 @@ func listEmrClusters(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrate // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_emr_cluster.listEmrClusters", "api_error", err) diff --git a/aws/table_aws_emr_cluster_metric_is_idle.go b/aws/table_aws_emr_cluster_metric_is_idle.go index f24012e6e..d4c902184 100644 --- a/aws/table_aws_emr_cluster_metric_is_idle.go +++ b/aws/table_aws_emr_cluster_metric_is_idle.go @@ -18,6 +18,7 @@ func tableAwsEmrClusterMetricIsIdle(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listEmrClusters, Hydrate: listEmrClusterMetricIsIdle, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_emr_instance.go b/aws/table_aws_emr_instance.go index a10831e0e..2984843a9 100644 --- a/aws/table_aws_emr_instance.go +++ b/aws/table_aws_emr_instance.go @@ -23,6 +23,7 @@ func tableAwsEmrInstance(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listEmrClusters, Hydrate: listEmrInstances, + Tags: map[string]string{"service": "elasticmapreduce", "action": "ListInstances"}, KeyColumns: []*plugin.KeyColumn{ {Name: "cluster_id", Require: plugin.Optional}, {Name: "instance_fleet_id", Require: plugin.Optional}, @@ -186,6 +187,9 @@ func listEmrInstances(ctx context.Context, d *plugin.QueryData, h *plugin.Hydrat }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_emr_cluster.listEmrClusters", "api_error", err) diff --git a/aws/table_aws_emr_instance_fleet.go b/aws/table_aws_emr_instance_fleet.go index 0676dc273..6ed154f70 100644 --- a/aws/table_aws_emr_instance_fleet.go +++ b/aws/table_aws_emr_instance_fleet.go @@ -25,6 +25,7 @@ func tableAwsEmrInstanceFleet(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listEmrClusters, Hydrate: listEmrInstanceFleets, + Tags: map[string]string{"service": "elasticmapreduce", "action": "ListInstanceFleets"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidRequestException"}), }, @@ -157,6 +158,9 @@ func listEmrInstanceFleets(ctx context.Context, d *plugin.QueryData, h *plugin.H // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { var ae smithy.APIError diff --git a/aws/table_aws_emr_instance_group.go b/aws/table_aws_emr_instance_group.go index 3e3cc44cb..382b653f5 100644 --- a/aws/table_aws_emr_instance_group.go +++ b/aws/table_aws_emr_instance_group.go @@ -25,6 +25,7 @@ func tableAwsEmrInstanceGroup(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listEmrClusters, Hydrate: listEmrInstanceGroups, + Tags: map[string]string{"service": "elasticmapreduce", "action": "ListInstanceGroups"}, }, GetMatrixItemFunc: SupportedRegionMatrix(emrv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -191,6 +192,9 @@ func listEmrInstanceGroups(ctx context.Context, d *plugin.QueryData, h *plugin.H // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { var ae smithy.APIError diff --git a/aws/table_aws_eventbridge_bus.go b/aws/table_aws_eventbridge_bus.go index 7a83a8e5c..90c3e7853 100644 --- a/aws/table_aws_eventbridge_bus.go +++ b/aws/table_aws_eventbridge_bus.go @@ -23,13 +23,21 @@ func tableAwsEventBridgeBus(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameter", "ResourceNotFoundException", "ValidationException"}), }, Hydrate: getAwsEventBridgeBus, + Tags: map[string]string{"service": "events", "action": "DescribeEventBus"}, }, List: &plugin.ListConfig{ Hydrate: listAwsEventBridgeBuses, + Tags: map[string]string{"service": "events", "action": "ListEventBuses"}, KeyColumns: []*plugin.KeyColumn{ {Name: "name", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsEventBridgeBusTags, + Tags: map[string]string{"service": "events", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(eventbridgev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -131,6 +139,9 @@ func listAwsEventBridgeBuses(ctx context.Context, d *plugin.QueryData, _ *plugin // API doesn't support aws-go-sdk-v2 paginator as of date for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := svc.ListEventBuses(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_eventbridge_bus.listAwsEventBridgeBuses", "api_error", err) diff --git a/aws/table_aws_eventbridge_rule.go b/aws/table_aws_eventbridge_rule.go index cc420888b..861491523 100644 --- a/aws/table_aws_eventbridge_rule.go +++ b/aws/table_aws_eventbridge_rule.go @@ -25,15 +25,31 @@ func tableAwsEventBridgeRule(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "ValidationException"}), }, Hydrate: getAwsEventBridgeRule, + Tags: map[string]string{"service": "events", "action": "DescribeRule"}, }, List: &plugin.ListConfig{ ParentHydrate: listAwsEventBridgeBuses, Hydrate: listAwsEventBridgeRules, + Tags: map[string]string{"service": "events", "action": "ListRules"}, KeyColumns: []*plugin.KeyColumn{ {Name: "event_bus_name", Require: plugin.Optional}, {Name: "name_prefix", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsEventBridgeRule, + Tags: map[string]string{"service": "events", "action": "DescribeRule"}, + }, + { + Func: getAwsEventBridgeTargetByRule, + Tags: map[string]string{"service": "events", "action": "ListTargetsByRule"}, + }, + { + Func: getAwsEventBridgeRuleTags, + Tags: map[string]string{"service": "events", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(eventbridgev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -174,6 +190,9 @@ func listAwsEventBridgeRules(ctx context.Context, d *plugin.QueryData, h *plugin // API doesn't support aws-go-sdk-v2 paginator as of date for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := svc.ListRules(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_eventbridge_rule.listAwsEventBridgeRules", "api_error", err) diff --git a/aws/table_aws_fsx_file_system.go b/aws/table_aws_fsx_file_system.go index 6ed76f8d2..21d848cd5 100644 --- a/aws/table_aws_fsx_file_system.go +++ b/aws/table_aws_fsx_file_system.go @@ -26,9 +26,11 @@ func tableAwsFsxFileSystem(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"FileSystemNotFound", "ValidationException"}), }, Hydrate: getFsxFileSystem, + Tags: map[string]string{"service": "fsx", "action": "DescribeFileSystems"}, }, List: &plugin.ListConfig{ Hydrate: listFsxFileSystems, + Tags: map[string]string{"service": "fsx", "action": "DescribeFileSystems"}, }, GetMatrixItemFunc: SupportedRegionMatrix(fsxv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -197,6 +199,9 @@ func listFsxFileSystems(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydr }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_fsx_file_system.aws_fsx_file_system.listFsxFileSystems", "api_error", err) diff --git a/aws/table_aws_glacier_vault.go b/aws/table_aws_glacier_vault.go index a59c865af..7df79ea31 100644 --- a/aws/table_aws_glacier_vault.go +++ b/aws/table_aws_glacier_vault.go @@ -30,9 +30,29 @@ func tableAwsGlacierVault(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "InvalidParameter"}), }, Hydrate: getGlacierVault, + Tags: map[string]string{"service": "glacier", "action": "DescribeVault"}, }, List: &plugin.ListConfig{ Hydrate: listGlacierVault, + Tags: map[string]string{"service": "glacier", "action": "ListVaults"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getGlacierVaultAccessPolicy, + Tags: map[string]string{"service": "glacier", "action": "GetVaultAccessPolicy"}, + }, + { + Func: getGlacierVaultLockPolicy, + Tags: map[string]string{"service": "glacier", "action": "GetVaultLock"}, + }, + { + Func: getGlacierVaultNotifications, + Tags: map[string]string{"service": "glacier", "action": "GetVaultNotifications"}, + }, + { + Func: listTagsForGlacierVault, + Tags: map[string]string{"service": "glacier", "action": "ListTagsForVault"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(glacierv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -176,6 +196,9 @@ func listGlacierVault(ctx context.Context, d *plugin.QueryData, h *plugin.Hydrat }) // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_glacier_vault.listGlacierVault", "api_error", err) diff --git a/aws/table_aws_globalaccelerator_accelerator.go b/aws/table_aws_globalaccelerator_accelerator.go index be819a1b0..60d28fcf4 100644 --- a/aws/table_aws_globalaccelerator_accelerator.go +++ b/aws/table_aws_globalaccelerator_accelerator.go @@ -23,9 +23,21 @@ func tableAwsGlobalAcceleratorAccelerator(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"EntityNotFoundException"}), }, Hydrate: getGlobalAcceleratorAccelerator, + Tags: map[string]string{"service": "globalaccelerator", "action": "DescribeAccelerator"}, }, List: &plugin.ListConfig{ Hydrate: listGlobalAcceleratorAccelerators, + Tags: map[string]string{"service": "globalaccelerator", "action": "ListAccelerators"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getGlobalAcceleratorAcceleratorTags, + Tags: map[string]string{"service": "globalaccelerator", "action": "ListTagsForResource"}, + }, + { + Func: getGlobalAcceleratorAcceleratorAttributes, + Tags: map[string]string{"service": "globalaccelerator", "action": "DescribeAcceleratorAttributes"}, + }, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { @@ -147,6 +159,9 @@ func listGlobalAcceleratorAccelerators(ctx context.Context, d *plugin.QueryData, }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_globalaccelerator_accelerator.listGlobalAcceleratorAccelerators", "api_error", err) diff --git a/aws/table_aws_globalaccelerator_endpoint_group.go b/aws/table_aws_globalaccelerator_endpoint_group.go index 4b2c1ff4d..75d8273f5 100644 --- a/aws/table_aws_globalaccelerator_endpoint_group.go +++ b/aws/table_aws_globalaccelerator_endpoint_group.go @@ -23,6 +23,7 @@ func tableAwsGlobalAcceleratorEndpointGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"EntityNotFoundException"}), }, Hydrate: getGlobalAcceleratorEndpointGroup, + Tags: map[string]string{"service": "globalaccelerator", "action": "DescribeEndpointGroup"}, }, List: &plugin.ListConfig{ KeyColumns: []*plugin.KeyColumn{ @@ -33,6 +34,7 @@ func tableAwsGlobalAcceleratorEndpointGroup(_ context.Context) *plugin.Table { //ParentHydrate: listGlobalAcceleratorListeners, ParentHydrate: listGlobalAcceleratorAccelerators, Hydrate: listGlobalAcceleratorEndpointGroups, + Tags: map[string]string{"service": "globalaccelerator", "action": "ListListeners"}, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { @@ -153,6 +155,9 @@ func listGlobalAcceleratorEndpointGroups(ctx context.Context, d *plugin.QueryDat // List listeners for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_globalaccelerator_endpoint_group.listGlobalAcceleratorEndpointGroups", "api_error", err) diff --git a/aws/table_aws_globalaccelerator_listener.go b/aws/table_aws_globalaccelerator_listener.go index 09f2921f0..359d62b24 100644 --- a/aws/table_aws_globalaccelerator_listener.go +++ b/aws/table_aws_globalaccelerator_listener.go @@ -23,6 +23,7 @@ func tableAwsGlobalAcceleratorListener(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"EntityNotFoundException"}), }, Hydrate: getGlobalAcceleratorListener, + Tags: map[string]string{"service": "globalaccelerator", "action": "DescribeListener"}, }, List: &plugin.ListConfig{ KeyColumns: []*plugin.KeyColumn{ @@ -30,6 +31,7 @@ func tableAwsGlobalAcceleratorListener(_ context.Context) *plugin.Table { }, ParentHydrate: listGlobalAcceleratorAccelerators, Hydrate: listGlobalAcceleratorListeners, + Tags: map[string]string{"service": "globalaccelerator", "action": "ListListeners"}, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { @@ -123,6 +125,9 @@ func listGlobalAcceleratorListeners(ctx context.Context, d *plugin.QueryData, h }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_globalaccelerator_listener.listGlobalAcceleratorListeners", "api_error", err) diff --git a/aws/table_aws_glue_catalog_database.go b/aws/table_aws_glue_catalog_database.go index a8e01daf5..af2a33ff4 100644 --- a/aws/table_aws_glue_catalog_database.go +++ b/aws/table_aws_glue_catalog_database.go @@ -26,9 +26,11 @@ func tableAwsGlueCatalogDatabase(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"EntityNotFoundException"}), }, Hydrate: getGlueCatalogDatabase, + Tags: map[string]string{"service": "glue", "action": "GetDatabase"}, }, List: &plugin.ListConfig{ Hydrate: listGlueCatalogDatabases, + Tags: map[string]string{"service": "glue", "action": "GetDatabases"}, }, GetMatrixItemFunc: SupportedRegionMatrix(gluev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -132,6 +134,9 @@ func listGlueCatalogDatabases(ctx context.Context, d *plugin.QueryData, _ *plugi o.StopOnDuplicateToken = true }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_glue_catalog_database.listGlueCatalogDatabases", "api_error", err) diff --git a/aws/table_aws_glue_catalog_table.go b/aws/table_aws_glue_catalog_table.go index 6c96c09f5..d5429eebe 100644 --- a/aws/table_aws_glue_catalog_table.go +++ b/aws/table_aws_glue_catalog_table.go @@ -26,6 +26,7 @@ func tableAwsGlueCatalogTable(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"EntityNotFoundException"}), }, Hydrate: getGlueCatalogTable, + Tags: map[string]string{"service": "glue", "action": "GetTable"}, }, List: &plugin.ListConfig{ KeyColumns: []*plugin.KeyColumn{ @@ -34,6 +35,7 @@ func tableAwsGlueCatalogTable(_ context.Context) *plugin.Table { }, ParentHydrate: listGlueCatalogDatabases, Hydrate: listGlueCatalogTables, + Tags: map[string]string{"service": "glue", "action": "GetTables"}, }, GetMatrixItemFunc: SupportedRegionMatrix(gluev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -203,6 +205,9 @@ func listGlueCatalogTables(ctx context.Context, d *plugin.QueryData, h *plugin.H o.StopOnDuplicateToken = true }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_glue_catalog_table.listGlueCatalogTables", "api_error", err) diff --git a/aws/table_aws_glue_connection.go b/aws/table_aws_glue_connection.go index 3e402b530..da2c9afab 100644 --- a/aws/table_aws_glue_connection.go +++ b/aws/table_aws_glue_connection.go @@ -27,6 +27,7 @@ func tableAwsGlueConnection(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"EntityNotFoundException"}), }, Hydrate: getGlueConnection, + Tags: map[string]string{"service": "glue", "action": "GetConnection"}, }, List: &plugin.ListConfig{ KeyColumns: plugin.OptionalColumns([]string{"connection_type"}), @@ -34,6 +35,7 @@ func tableAwsGlueConnection(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidInputException"}), }, Hydrate: listGlueConnections, + Tags: map[string]string{"service": "glue", "action": "GetConnections"}, }, GetMatrixItemFunc: SupportedRegionMatrix(gluev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -156,6 +158,9 @@ func listGlueConnections(ctx context.Context, d *plugin.QueryData, _ *plugin.Hyd }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_glue_connection.listGlueConnections", "api_error", err) diff --git a/aws/table_aws_glue_crawler.go b/aws/table_aws_glue_crawler.go index c7dc8fb61..8830be649 100644 --- a/aws/table_aws_glue_crawler.go +++ b/aws/table_aws_glue_crawler.go @@ -26,9 +26,17 @@ func tableAwsGlueCrawler(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"EntityNotFoundException", "InvalidParameter"}), }, Hydrate: getGlueCrawler, + Tags: map[string]string{"service": "glue", "action": "GetCrawler"}, }, List: &plugin.ListConfig{ Hydrate: listGlueCrawlers, + Tags: map[string]string{"service": "glue", "action": "GetCrawlers"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getGlueCrawler, + Tags: map[string]string{"service": "glue", "action": "GetCrawler"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(gluev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -192,6 +200,9 @@ func listGlueCrawlers(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrat }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_glue_crawler.listGlueCrawlers", "api_error", err) diff --git a/aws/table_aws_glue_data_catalog_encryption_settings.go b/aws/table_aws_glue_data_catalog_encryption_settings.go index 3803b45bf..3d772f4d2 100644 --- a/aws/table_aws_glue_data_catalog_encryption_settings.go +++ b/aws/table_aws_glue_data_catalog_encryption_settings.go @@ -19,6 +19,7 @@ func tableAwsGlueDataCatalogEncryptionSettings(_ context.Context) *plugin.Table Description: "AWS Glue Data Catalog Encryption Settings", List: &plugin.ListConfig{ Hydrate: listGlueDataCatalogEncryptionSettings, + Tags: map[string]string{"service": "glue", "action": "GetDataCatalogEncryptionSettings"}, }, GetMatrixItemFunc: SupportedRegionMatrix(gluev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ diff --git a/aws/table_aws_glue_data_quality_ruleset.go b/aws/table_aws_glue_data_quality_ruleset.go index 5aceff534..90e8e80a6 100644 --- a/aws/table_aws_glue_data_quality_ruleset.go +++ b/aws/table_aws_glue_data_quality_ruleset.go @@ -27,9 +27,11 @@ func tableAwsGlueDataQualityRuleset(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"EntityNotFoundException", "UnknownOperationException"}), }, Hydrate: getGlueDataQualityRuleset, + Tags: map[string]string{"service": "glue", "action": "GetDataQualityRuleset"}, }, List: &plugin.ListConfig{ Hydrate: listGlueDataQualityRulesets, + Tags: map[string]string{"service": "glue", "action": "ListDataQualityRulesets"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"UnknownOperationException"}), }, @@ -41,6 +43,12 @@ func tableAwsGlueDataQualityRuleset(_ context.Context) *plugin.Table { {Name: "last_modified_on", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getGlueDataQualityRuleset, + Tags: map[string]string{"service": "glue", "action": "GetDataQualityRuleset"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(gluev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -146,6 +154,9 @@ func listGlueDataQualityRulesets(ctx context.Context, d *plugin.QueryData, _ *pl o.StopOnDuplicateToken = true }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_glue_data_quality_ruleset.listGlueDataQualityRulesets", "api_error", err) diff --git a/aws/table_aws_glue_dev_endpoint.go b/aws/table_aws_glue_dev_endpoint.go index 65464b62c..8fb7e4436 100644 --- a/aws/table_aws_glue_dev_endpoint.go +++ b/aws/table_aws_glue_dev_endpoint.go @@ -26,9 +26,11 @@ func tableAwsGlueDevEndpoint(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"EntityNotFoundException"}), }, Hydrate: getGlueDevEndpoint, + Tags: map[string]string{"service": "glue", "action": "GetDevEndpoint"}, }, List: &plugin.ListConfig{ Hydrate: listGlueDevEndpoints, + Tags: map[string]string{"service": "glue", "action": "GetDevEndpoints"}, }, GetMatrixItemFunc: SupportedRegionMatrix(gluev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -217,6 +219,9 @@ func listGlueDevEndpoints(ctx context.Context, d *plugin.QueryData, _ *plugin.Hy o.StopOnDuplicateToken = true }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_glue_dev_endpoint.listGlueDevEndpoints", "api_error", err) diff --git a/aws/table_aws_glue_job.go b/aws/table_aws_glue_job.go index 718a0d602..bf9d72bf3 100644 --- a/aws/table_aws_glue_job.go +++ b/aws/table_aws_glue_job.go @@ -26,14 +26,22 @@ func tableAwsGlueJob(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"EntityNotFoundException"}), }, Hydrate: getGlueJob, + Tags: map[string]string{"service": "glue", "action": "GetJob"}, }, List: &plugin.ListConfig{ Hydrate: listGlueJobs, + Tags: map[string]string{"service": "glue", "action": "GetJobs"}, }, DefaultIgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"EntityNotFoundException"}), }, GetMatrixItemFunc: SupportedRegionMatrix(gluev1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getGlueJobBookmark, + Tags: map[string]string{"service": "glue", "action": "GetJobBookmark"}, + }, + }, Columns: awsRegionalColumns([]*plugin.Column{ { Name: "name", @@ -205,6 +213,9 @@ func listGlueJobs(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateDat }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_glue_job.listGlueJobs", "api_error", err) diff --git a/aws/table_aws_glue_security_configuration.go b/aws/table_aws_glue_security_configuration.go index 49c2c536d..a95516f5b 100644 --- a/aws/table_aws_glue_security_configuration.go +++ b/aws/table_aws_glue_security_configuration.go @@ -26,9 +26,11 @@ func tableAwsGlueSecurityConfiguration(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"EntityNotFoundException"}), }, Hydrate: getGlueSecurityConfiguration, + Tags: map[string]string{"service": "glue", "action": "GetSecurityConfiguration"}, }, List: &plugin.ListConfig{ Hydrate: listGlueSecurityConfigurations, + Tags: map[string]string{"service": "glue", "action": "GetSecurityConfigurations"}, }, GetMatrixItemFunc: SupportedRegionMatrix(gluev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -110,6 +112,9 @@ func listGlueSecurityConfigurations(ctx context.Context, d *plugin.QueryData, _ o.StopOnDuplicateToken = true }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_glue_security_configuration.listGlueSecurityConfigurations", "api_error", err) diff --git a/aws/table_aws_guardduty_detector.go b/aws/table_aws_guardduty_detector.go index 1e9a2ae09..53ee274a5 100644 --- a/aws/table_aws_guardduty_detector.go +++ b/aws/table_aws_guardduty_detector.go @@ -29,9 +29,21 @@ func tableAwsGuardDutyDetector(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidInputException", "BadRequestException"}), }, Hydrate: getGuardDutyDetector, + Tags: map[string]string{"service": "guardduty", "action": "GetDetector"}, }, List: &plugin.ListConfig{ Hydrate: listGuardDutyDetectors, + Tags: map[string]string{"service": "guardduty", "action": "ListDetectors"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getGuardDutyDetector, + Tags: map[string]string{"service": "guardduty", "action": "GetDetector"}, + }, + { + Func: getGuardDutyDetectorMasterAccount, + Tags: map[string]string{"service": "guardduty", "action": "GetAdministratorAccount"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(guarddutyv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -146,6 +158,9 @@ func listGuardDutyDetectors(ctx context.Context, d *plugin.QueryData, _ *plugin. }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_guardduty_detector.listGuardDutyDetectors", "api_error", err) diff --git a/aws/table_aws_guardduty_filter.go b/aws/table_aws_guardduty_filter.go index f6062651f..7c8ed1b60 100644 --- a/aws/table_aws_guardduty_filter.go +++ b/aws/table_aws_guardduty_filter.go @@ -29,14 +29,22 @@ func tableAwsGuardDutyFilter(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidInputException", "NoSuchEntityException", "BadRequestException"}), }, Hydrate: getAwsGuardDutyFilter, + Tags: map[string]string{"service": "guardduty", "action": "GetFilter"}, }, List: &plugin.ListConfig{ ParentHydrate: listGuardDutyDetectors, Hydrate: listAwsGuardDutyFilters, + Tags: map[string]string{"service": "guardduty", "action": "ListFilters"}, KeyColumns: []*plugin.KeyColumn{ {Name: "detector_id", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsGuardDutyFilter, + Tags: map[string]string{"service": "guardduty", "action": "GetFilter"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(guarddutyv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -139,6 +147,9 @@ func listAwsGuardDutyFilters(ctx context.Context, d *plugin.QueryData, h *plugin }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_guardduty_filter.listAwsGuardDutyFilters", "api_error", err) diff --git a/aws/table_aws_guardduty_finding.go b/aws/table_aws_guardduty_finding.go index 7edc18434..210894879 100644 --- a/aws/table_aws_guardduty_finding.go +++ b/aws/table_aws_guardduty_finding.go @@ -28,6 +28,7 @@ func tableAwsGuardDutyFinding(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listGuardDutyDetectors, Hydrate: listGuardDutyFindings, + Tags: map[string]string{"service": "guardduty", "action": "ListFindings"}, KeyColumns: []*plugin.KeyColumn{ {Name: "detector_id", Require: plugin.Optional}, {Name: "id", Require: plugin.Optional, Operators: []string{"=", "<>"}}, @@ -165,6 +166,9 @@ func listGuardDutyFindings(ctx context.Context, d *plugin.QueryData, h *plugin.H var findingIds [][]string for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_guardduty_finding.listGuardDutyFindings", "api_error", err) @@ -175,6 +179,9 @@ func listGuardDutyFindings(ctx context.Context, d *plugin.QueryData, h *plugin.H // Using this pattern as the GetFindings API supports an array of findings for _, ids := range findingIds { + // apply rate limiting + d.WaitForListRateLimit(ctx) + param := &guardduty.GetFindingsInput{ DetectorId: aws.String(detectorId), FindingIds: ids, diff --git a/aws/table_aws_guardduty_ipset.go b/aws/table_aws_guardduty_ipset.go index 750ff1576..5bc9b8b8d 100644 --- a/aws/table_aws_guardduty_ipset.go +++ b/aws/table_aws_guardduty_ipset.go @@ -29,14 +29,22 @@ func tableAwsGuardDutyIPSet(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidInputException", "NoSuchEntityException", "BadRequestException"}), }, Hydrate: getAwsGuardDutyIPSet, + Tags: map[string]string{"service": "guardduty", "action": "GetIPSet"}, }, List: &plugin.ListConfig{ ParentHydrate: listGuardDutyDetectors, Hydrate: listAwsGuardDutyIPSets, + Tags: map[string]string{"service": "guardduty", "action": "ListIPSets"}, KeyColumns: []*plugin.KeyColumn{ {Name: "detector_id", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsGuardDutyIPSet, + Tags: map[string]string{"service": "guardduty", "action": "GetIPSet"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(guarddutyv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -141,6 +149,9 @@ func listAwsGuardDutyIPSets(ctx context.Context, d *plugin.QueryData, h *plugin. }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_guardduty_ipset.getAwsGuardDutyIPSet", "api_error", err) diff --git a/aws/table_aws_guardduty_member.go b/aws/table_aws_guardduty_member.go index 4a63f1f6b..57e89a943 100644 --- a/aws/table_aws_guardduty_member.go +++ b/aws/table_aws_guardduty_member.go @@ -26,10 +26,12 @@ func tableAwsGuardDutyMember(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidInputException", "BadRequestException"}), }, Hydrate: getGuardDutyMember, + Tags: map[string]string{"service": "guardduty", "action": "GetMembers"}, }, List: &plugin.ListConfig{ ParentHydrate: listGuardDutyDetectors, Hydrate: listGuardDutyMembers, + Tags: map[string]string{"service": "guardduty", "action": "ListMembers"}, KeyColumns: []*plugin.KeyColumn{ {Name: "detector_id", Require: plugin.Optional}, }, @@ -129,6 +131,9 @@ func listGuardDutyMembers(ctx context.Context, d *plugin.QueryData, h *plugin.Hy }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aaws_guardduty_member.listGuardDutyMembers", "api_error", err) diff --git a/aws/table_aws_guardduty_publishing_destination.go b/aws/table_aws_guardduty_publishing_destination.go index dd896e81e..763dd782f 100644 --- a/aws/table_aws_guardduty_publishing_destination.go +++ b/aws/table_aws_guardduty_publishing_destination.go @@ -35,14 +35,22 @@ func tableAwsGuardDutyPublishingDestination(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidInputException", "NoSuchEntityException", "BadRequestException"}), }, Hydrate: getGuardDutyPublishingDestination, + Tags: map[string]string{"service": "guardduty", "action": "DescribePublishingDestination"}, }, List: &plugin.ListConfig{ ParentHydrate: listGuardDutyDetectors, + Tags: map[string]string{"service": "guardduty", "action": "ListPublishingDestinations"}, Hydrate: listGuardDutyPublishingDestinations, KeyColumns: []*plugin.KeyColumn{ {Name: "detector_id", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getGuardDutyPublishingDestination, + Tags: map[string]string{"service": "guardduty", "action": "DescribePublishingDestination"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(guarddutyv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -149,6 +157,9 @@ func listGuardDutyPublishingDestinations(ctx context.Context, d *plugin.QueryDat }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_guardduty_publishing_destination.listGuardDutyPublishingDestinations", "api_error", err) diff --git a/aws/table_aws_guardduty_threat_intel_set.go b/aws/table_aws_guardduty_threat_intel_set.go index 295472449..d7aed2f0f 100644 --- a/aws/table_aws_guardduty_threat_intel_set.go +++ b/aws/table_aws_guardduty_threat_intel_set.go @@ -31,14 +31,22 @@ func tableAwsGuardDutyThreatIntelSet(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidInputException", "BadRequestException"}), }, Hydrate: getGuardDutyThreatIntelSet, + Tags: map[string]string{"service": "guardduty", "action": "GetThreatIntelSet"}, }, List: &plugin.ListConfig{ ParentHydrate: listGuardDutyDetectors, Hydrate: listGuardDutyThreatIntelSets, + Tags: map[string]string{"service": "guardduty", "action": "ListThreatIntelSets"}, KeyColumns: []*plugin.KeyColumn{ {Name: "detector_id", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getGuardDutyThreatIntelSet, + Tags: map[string]string{"service": "guardduty", "action": "GetThreatIntelSet"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(guarddutyv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -144,6 +152,9 @@ func listGuardDutyThreatIntelSets(ctx context.Context, d *plugin.QueryData, h *p }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_guardduty_ipset.getAwsGuardDutyIPSet", "api_error", err) diff --git a/aws/table_aws_health_affected_entity.go b/aws/table_aws_health_affected_entity.go index e29126987..2619b7407 100644 --- a/aws/table_aws_health_affected_entity.go +++ b/aws/table_aws_health_affected_entity.go @@ -21,6 +21,7 @@ func tableAwsHealthAffectedEntity(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listHealthEvents, Hydrate: listHealthAffectedEntities, + Tags: map[string]string{"service": "health", "action": "DescribeAffectedEntities"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"SubscriptionRequiredException"}), }, @@ -126,6 +127,9 @@ func listHealthAffectedEntities(ctx context.Context, d *plugin.QueryData, h *plu // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_health_affected_entity.listHealthAffectedEntities", "api_error", err) diff --git a/aws/table_aws_health_event.go b/aws/table_aws_health_event.go index 2446c6a61..3ddea231b 100644 --- a/aws/table_aws_health_event.go +++ b/aws/table_aws_health_event.go @@ -20,6 +20,7 @@ func tableAwsHealthEvent(_ context.Context) *plugin.Table { Description: "AWS Health Event", List: &plugin.ListConfig{ Hydrate: listHealthEvents, + Tags: map[string]string{"service": "health", "action": "DescribeEvents"}, KeyColumns: []*plugin.KeyColumn{ {Name: "arn", Require: plugin.Optional}, {Name: "availability_zone", Require: plugin.Optional}, @@ -136,6 +137,9 @@ func listHealthEvents(ctx context.Context, d *plugin.QueryData, h *plugin.Hydrat // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_health_event.listHealthEvents", "api_error", err) diff --git a/aws/table_aws_iam_access_advisor.go b/aws/table_aws_iam_access_advisor.go index 4ba98feb0..8da9b0c7b 100644 --- a/aws/table_aws_iam_access_advisor.go +++ b/aws/table_aws_iam_access_advisor.go @@ -37,6 +37,7 @@ func tableAwsIamAccessAdvisor(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ KeyColumns: plugin.SingleColumn("principal_arn"), Hydrate: listAccessAdvisor, + Tags: map[string]string{"service": "iam", "action": "GetServiceLastAccessedDetails"}, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { @@ -147,6 +148,9 @@ func listAccessAdvisor(ctx context.Context, d *plugin.QueryData, h *plugin.Hydra retryNumber := 0 for { + // apply rate limiting + d.WaitForListRateLimit(ctx) + resp, err := svc.GetServiceLastAccessedDetails(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_iam_access_advisor.listAccessAdvisor", "list_advisoer_details_error", err) diff --git a/aws/table_aws_iam_access_key.go b/aws/table_aws_iam_access_key.go index 5f9933a8d..0aad1002d 100644 --- a/aws/table_aws_iam_access_key.go +++ b/aws/table_aws_iam_access_key.go @@ -20,10 +20,17 @@ func tableAwsIamAccessKey(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listIamUsers, Hydrate: listUserAccessKeys, + Tags: map[string]string{"service": "iam", "action": "ListAccessKeys"}, KeyColumns: []*plugin.KeyColumn{ {Name: "user_name", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getIamAccessKeyLastUsed, + Tags: map[string]string{"service": "iam", "action": "GetAccessKeyLastUsed"}, + }, + }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { Name: "access_key_id", @@ -117,6 +124,9 @@ func listUserAccessKeys(ctx context.Context, d *plugin.QueryData, h *plugin.Hydr }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_iam_access_key.listUserAccessKeys", "api_error", err) diff --git a/aws/table_aws_iam_account_password_policy.go b/aws/table_aws_iam_account_password_policy.go index d8dcbebc9..866d8a29b 100644 --- a/aws/table_aws_iam_account_password_policy.go +++ b/aws/table_aws_iam_account_password_policy.go @@ -18,6 +18,7 @@ func tableAwsIamAccountPasswordPolicy(_ context.Context) *plugin.Table { Description: "AWS IAM Account Password Policy", List: &plugin.ListConfig{ Hydrate: listAccountPasswordPolicies, + Tags: map[string]string{"service": "iam", "action": "GetAccountPasswordPolicy"}, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { diff --git a/aws/table_aws_iam_account_summary.go b/aws/table_aws_iam_account_summary.go index 34dcb5116..871377729 100644 --- a/aws/table_aws_iam_account_summary.go +++ b/aws/table_aws_iam_account_summary.go @@ -53,6 +53,7 @@ func tableAwsIamAccountSummary(_ context.Context) *plugin.Table { DefaultTransform: transform.FromGo(), List: &plugin.ListConfig{ Hydrate: listAccountSummary, + Tags: map[string]string{"service": "iam", "action": "GetAccountSummary"}, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { diff --git a/aws/table_aws_iam_credential_report.go b/aws/table_aws_iam_credential_report.go index dc4b7bf3e..24cb703e1 100644 --- a/aws/table_aws_iam_credential_report.go +++ b/aws/table_aws_iam_credential_report.go @@ -46,6 +46,7 @@ func tableAwsIamCredentialReport(_ context.Context) *plugin.Table { Description: "AWS IAM Credential Report", List: &plugin.ListConfig{ Hydrate: listCredentialReports, + Tags: map[string]string{"service": "iam", "action": "GetCredentialReport"}, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { diff --git a/aws/table_aws_iam_group.go b/aws/table_aws_iam_group.go index ee8cd1e3a..46caa659f 100644 --- a/aws/table_aws_iam_group.go +++ b/aws/table_aws_iam_group.go @@ -28,13 +28,29 @@ func tableAwsIamGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationError", "NoSuchEntity", "InvalidParameter"}), }, Hydrate: getIamGroup, + Tags: map[string]string{"service": "iam", "action": "GetGroup"}, }, List: &plugin.ListConfig{ Hydrate: listIamGroups, + Tags: map[string]string{"service": "iam", "action": "ListGroups"}, KeyColumns: []*plugin.KeyColumn{ {Name: "path", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsIamGroupAttachedPolicies, + Tags: map[string]string{"service": "iam", "action": "ListAttachedGroupPolicies"}, + }, + { + Func: getAwsIamGroupUsers, + Tags: map[string]string{"service": "iam", "action": "GetGroup"}, + }, + { + Func: listAwsIamGroupInlinePolicies, + Tags: map[string]string{"service": "iam", "action": "ListGroupPolicies"}, + }, + }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { Name: "name", @@ -143,6 +159,9 @@ func listIamGroups(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateDa }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aaws_iam_group.listIamGroups", "api_error", err) diff --git a/aws/table_aws_iam_open_id_connect_provider.go b/aws/table_aws_iam_open_id_connect_provider.go index 5e80cf23a..56cbfd1c2 100644 --- a/aws/table_aws_iam_open_id_connect_provider.go +++ b/aws/table_aws_iam_open_id_connect_provider.go @@ -20,14 +20,22 @@ func tableAwsIamOpenIdConnectProvider(ctx context.Context) *plugin.Table { Description: "AWS IAM OpenID Connect Provider", List: &plugin.ListConfig{ Hydrate: listIamOpenIdConnectProviders, + Tags: map[string]string{"service": "iam", "action": "GetOpenIDConnectProvider"}, }, Get: &plugin.GetConfig{ KeyColumns: plugin.AllColumns([]string{"arn"}), Hydrate: getIamOpenIdConnectProvider, + Tags: map[string]string{"service": "iam", "action": "ListOpenIDConnectProviders"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchEntity", "InvalidInput"}), }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getIamOpenIdConnectProvider, + Tags: map[string]string{"service": "iam", "action": "ListOpenIDConnectProviders"}, + }, + }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { Name: "arn", diff --git a/aws/table_aws_iam_policy.go b/aws/table_aws_iam_policy.go index f37351160..71ebd7331 100644 --- a/aws/table_aws_iam_policy.go +++ b/aws/table_aws_iam_policy.go @@ -20,17 +20,29 @@ func tableAwsIamPolicy(_ context.Context) *plugin.Table { Name: "aws_iam_policy", Description: "AWS IAM Policy", Get: &plugin.GetConfig{ + Tags: map[string]string{"service": "iam", "action": "GetPolicy"}, KeyColumns: plugin.AllColumns([]string{"arn"}), Hydrate: getIamPolicy, }, List: &plugin.ListConfig{ Hydrate: listIamPolicies, + Tags: map[string]string{"service": "iam", "action": "ListPolicies"}, KeyColumns: plugin.KeyColumnSlice{ {Name: "is_aws_managed", Require: plugin.Optional, Operators: []string{"<>", "="}}, {Name: "is_attached", Require: plugin.Optional, Operators: []string{"<>", "="}}, {Name: "path", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getPolicyVersion, + Tags: map[string]string{"service": "iam", "action": "GetPolicyVersion"}, + }, + { + Func: getIamPolicy, + Tags: map[string]string{"service": "iam", "action": "GetPolicy"}, + }, + }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { Name: "name", @@ -171,6 +183,9 @@ func listIamPolicies(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrate params.MaxItems = aws.Int32(maxItems) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_iam_policy.listIamPolicies", "api_error", err) diff --git a/aws/table_aws_iam_policy_attachment.go b/aws/table_aws_iam_policy_attachment.go index 629e9482c..dacf632e8 100644 --- a/aws/table_aws_iam_policy_attachment.go +++ b/aws/table_aws_iam_policy_attachment.go @@ -21,6 +21,7 @@ func tableAwsIamPolicyAttachment(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listIamPolicies, Hydrate: listIamPolicyAttachments, + Tags: map[string]string{"service": "iam", "action": "ListEntitiesForPolicy"}, KeyColumns: []*plugin.KeyColumn{ {Name: "is_attached", Require: plugin.Optional, Operators: []string{"<>", "="}}, }, @@ -96,6 +97,9 @@ func listIamPolicyAttachments(ctx context.Context, d *plugin.QueryData, h *plugi }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_iam_policy_attachment.listIamPolicyAttachments", "api_error", err) diff --git a/aws/table_aws_iam_policy_simulator.go b/aws/table_aws_iam_policy_simulator.go index 0819ba00f..468d3cec6 100644 --- a/aws/table_aws_iam_policy_simulator.go +++ b/aws/table_aws_iam_policy_simulator.go @@ -18,6 +18,7 @@ func tableAwsIamPolicySimulator(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ KeyColumns: plugin.AllColumns([]string{"principal_arn", "action", "resource_arn"}), Hydrate: listIamPolicySimulation, + Tags: map[string]string{"service": "iam", "action": "SimulatePrincipalPolicy"}, }, Columns: []*plugin.Column{ // "Key" Columns diff --git a/aws/table_aws_iam_role.go b/aws/table_aws_iam_role.go index a7deb786a..58838c609 100644 --- a/aws/table_aws_iam_role.go +++ b/aws/table_aws_iam_role.go @@ -25,16 +25,32 @@ func tableAwsIamRole(ctx context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.AnyColumn([]string{"name", "arn"}), Hydrate: getIamRole, + Tags: map[string]string{"service": "iam", "action": "GetRole"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationError", "NoSuchEntity", "InvalidParameter"}), }, }, List: &plugin.ListConfig{ Hydrate: listIamRoles, + Tags: map[string]string{"service": "iam", "action": "ListRoles"}, KeyColumns: []*plugin.KeyColumn{ {Name: "path", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsIamInstanceProfileData, + Tags: map[string]string{"service": "iam", "action": "ListInstanceProfilesForRole"}, + }, + { + Func: getAwsIamRoleAttachedPolicies, + Tags: map[string]string{"service": "iam", "action": "ListAttachedRolePolicies"}, + }, + { + Func: listAwsIamRoleInlinePolicies, + Tags: map[string]string{"service": "iam", "action": "ListRolePolicies"}, + }, + }, Columns: awsGlobalRegionColumns([]*plugin.Column{ // "Key" Columns { @@ -218,6 +234,9 @@ func listIamRoles(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateDat }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_iam_role.listIamRoles", "api_error", err) @@ -288,6 +307,9 @@ func getAwsIamInstanceProfileData(ctx context.Context, d *plugin.QueryData, h *p }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_iam_policy.getAwsIamInstanceProfileData", "api_error", err) @@ -320,6 +342,9 @@ func getAwsIamRoleAttachedPolicies(ctx context.Context, d *plugin.QueryData, h * var attachedPolicyArns []string for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_iam_policy.getAwsIamRoleAttachedPolicies", "api_error", err) @@ -351,6 +376,9 @@ func listAwsIamRoleInlinePolicies(ctx context.Context, d *plugin.QueryData, h *p var policyNames []string for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_iam_policy.listAwsIamRoleInlinePolicies", "api_error", err) diff --git a/aws/table_aws_iam_saml_provider.go b/aws/table_aws_iam_saml_provider.go index 329c1173d..b98552313 100644 --- a/aws/table_aws_iam_saml_provider.go +++ b/aws/table_aws_iam_saml_provider.go @@ -21,12 +21,20 @@ func tableAwsIamSamlProvider(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.AllColumns([]string{"arn"}), Hydrate: getIamSamlProvider, + Tags: map[string]string{"service": "iam", "action": "GetSAMLProvider"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchEntity"}), }, }, List: &plugin.ListConfig{ Hydrate: listIamSamlProviders, + Tags: map[string]string{"service": "iam", "action": "ListSAMLProviders"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getIamSamlProvider, + Tags: map[string]string{"service": "iam", "action": "GetSAMLProvider"}, + }, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { diff --git a/aws/table_aws_iam_server_certificate.go b/aws/table_aws_iam_server_certificate.go index e14e9d0f3..a1fd2e5c6 100644 --- a/aws/table_aws_iam_server_certificate.go +++ b/aws/table_aws_iam_server_certificate.go @@ -20,6 +20,7 @@ func tableAwsIamServerCertificate(_ context.Context) *plugin.Table { Description: "AWS IAM Server Certificate", List: &plugin.ListConfig{ Hydrate: listIamServerCertificates, + Tags: map[string]string{"service": "iam", "action": "ListServerCertificates"}, KeyColumns: []*plugin.KeyColumn{ {Name: "path", Require: plugin.Optional}, }, @@ -27,6 +28,13 @@ func tableAwsIamServerCertificate(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ Hydrate: getIamServerCertificate, KeyColumns: plugin.AllColumns([]string{"name"}), + Tags: map[string]string{"service": "iam", "action": "GetServerCertificate"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getIamServerCertificate, + Tags: map[string]string{"service": "iam", "action": "GetServerCertificate"}, + }, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { @@ -144,6 +152,9 @@ func listIamServerCertificates(ctx context.Context, d *plugin.QueryData, _ *plug }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_iam_server_certificate.listIamServerCertificates", "api_error", err) diff --git a/aws/table_aws_iam_service_specific_credential.go b/aws/table_aws_iam_service_specific_credential.go index 0f879d6f3..cc5144d80 100644 --- a/aws/table_aws_iam_service_specific_credential.go +++ b/aws/table_aws_iam_service_specific_credential.go @@ -20,6 +20,7 @@ func tableAwsIamUserServiceSpecificCredential(ctx context.Context) *plugin.Table List: &plugin.ListConfig{ ParentHydrate: listIamUsers, Hydrate: listAwsIamUserServiceSpecificCredentials, + Tags: map[string]string{"service": "iam", "action": "ListServiceSpecificCredentials"}, KeyColumns: []*plugin.KeyColumn{ {Name: "service_name", Require: plugin.Optional}, {Name: "user_name", Require: plugin.Optional}, diff --git a/aws/table_aws_iam_user.go b/aws/table_aws_iam_user.go index c102019ee..25532c64c 100644 --- a/aws/table_aws_iam_user.go +++ b/aws/table_aws_iam_user.go @@ -29,13 +29,41 @@ func tableAwsIamUser(ctx context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationError", "NoSuchEntity", "InvalidParameter"}), }, Hydrate: getIamUser, + Tags: map[string]string{"service": "iam", "action": "GetUser"}, }, List: &plugin.ListConfig{ Hydrate: listIamUsers, + Tags: map[string]string{"service": "iam", "action": "ListUsers"}, KeyColumns: []*plugin.KeyColumn{ {Name: "path", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsIamUserLoginProfile, + Tags: map[string]string{"service": "iam", "action": "GetLoginProfile"}, + }, + { + Func: getAwsIamUserData, + Tags: map[string]string{"service": "iam", "action": "GetUser"}, + }, + { + Func: getAwsIamUserAttachedPolicies, + Tags: map[string]string{"service": "iam", "action": "ListAttachedUserPolicies"}, + }, + { + Func: getAwsIamUserGroups, + Tags: map[string]string{"service": "iam", "action": "ListGroupsForUser"}, + }, + { + Func: getAwsIamUserMfaDevices, + Tags: map[string]string{"service": "iam", "action": "ListMFADevices"}, + }, + { + Func: listAwsIamUserInlinePolicies, + Tags: map[string]string{"service": "iam", "action": "ListUserPolicies"}, + }, + }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { Name: "name", @@ -196,6 +224,9 @@ func listIamUsers(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateDat }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_iam_role.listIamRoles", "api_error", err) diff --git a/aws/table_aws_iam_virtual_mfa_device.go b/aws/table_aws_iam_virtual_mfa_device.go index db097ea38..266a726c5 100644 --- a/aws/table_aws_iam_virtual_mfa_device.go +++ b/aws/table_aws_iam_virtual_mfa_device.go @@ -20,10 +20,17 @@ func tableAwsIamVirtualMfaDevice(_ context.Context) *plugin.Table { Description: "AWS IAM Virtual MFA device", List: &plugin.ListConfig{ Hydrate: listIamVirtualMFADevices, + Tags: map[string]string{"service": "iam", "action": "ListVirtualMFADevices"}, KeyColumns: []*plugin.KeyColumn{ {Name: "assignment_status", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getIamMfaDeviceTags, + Tags: map[string]string{"service": "iam", "action": "ListMFADeviceTags"}, + }, + }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { Name: "serial_number", @@ -142,6 +149,9 @@ func listIamVirtualMFADevices(ctx context.Context, d *plugin.QueryData, _ *plugi }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_iam_virtual_mfa_device.listIamVirtualMFADevices", "api_error", err) diff --git a/aws/table_aws_identitystore_group.go b/aws/table_aws_identitystore_group.go index a5264371a..b3a52e364 100644 --- a/aws/table_aws_identitystore_group.go +++ b/aws/table_aws_identitystore_group.go @@ -24,10 +24,12 @@ func tableAwsIdentityStoreGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "ValidationException"}), }, Hydrate: getIdentityStoreGroup, + Tags: map[string]string{"service": "identitystore", "action": "DescribeGroup"}, }, List: &plugin.ListConfig{ KeyColumns: plugin.AllColumns([]string{"identity_store_id"}), Hydrate: listIdentityStoreGroups, + Tags: map[string]string{"service": "identitystore", "action": "ListGroups"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, @@ -106,6 +108,9 @@ func listIdentityStoreGroups(ctx context.Context, d *plugin.QueryData, _ *plugin }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_identitystore_group.listIdentityStoreGroups", "api_error", err) diff --git a/aws/table_aws_identitystore_group_membership.go b/aws/table_aws_identitystore_group_membership.go index 7577359ed..ba24fcbfc 100644 --- a/aws/table_aws_identitystore_group_membership.go +++ b/aws/table_aws_identitystore_group_membership.go @@ -30,6 +30,7 @@ func tableAwsIdentityStoreGroupMembership(_ context.Context) *plugin.Table { }, ParentHydrate: listIdentityStoreGroups, Hydrate: listIdentityStoreGroupMemberships, + Tags: map[string]string{"service": "identitystore", "action": "ListGroupMemberships"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, @@ -107,6 +108,9 @@ func listIdentityStoreGroupMemberships(ctx context.Context, d *plugin.QueryData, }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_identitystore_group_membership.listIdentityStoreGroupMemberships", "api_error", err) diff --git a/aws/table_aws_identitystore_user.go b/aws/table_aws_identitystore_user.go index dd8ecccb6..8e7094a8e 100644 --- a/aws/table_aws_identitystore_user.go +++ b/aws/table_aws_identitystore_user.go @@ -24,10 +24,12 @@ func tableAwsIdentityStoreUser(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "ValidationException"}), }, Hydrate: getIdentityStoreUser, + Tags: map[string]string{"service": "identitystore", "action": "DescribeUser"}, }, List: &plugin.ListConfig{ KeyColumns: plugin.AllColumns([]string{"identity_store_id"}), Hydrate: listIdentityStoreUsers, + Tags: map[string]string{"service": "identitystore", "action": "ListUsers"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, @@ -99,6 +101,9 @@ func listIdentityStoreUsers(ctx context.Context, d *plugin.QueryData, _ *plugin. }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_identitystore_user.listIdentityStoreUsers", "api_error", err) diff --git a/aws/table_aws_inspector2_coverage.go b/aws/table_aws_inspector2_coverage.go index dfc846144..22ff7fb5b 100644 --- a/aws/table_aws_inspector2_coverage.go +++ b/aws/table_aws_inspector2_coverage.go @@ -23,6 +23,7 @@ func tableAwsInspector2Coverage(_ context.Context) *plugin.Table { Description: "AWS Inspector2 Coverage", List: &plugin.ListConfig{ Hydrate: listInspector2Coverage, + Tags: map[string]string{"service": "inspector2", "action": "ListCoverage"}, KeyColumns: plugin.KeyColumnSlice{ {Name: "source_account_id", Operators: []string{"=", "<>"}, Require: plugin.Optional}, {Name: "ec2_instance_tags", Operators: []string{"="}, Require: plugin.Optional, CacheMatch: "exact"}, @@ -336,6 +337,9 @@ func listInspector2Coverage(ctx context.Context, d *plugin.QueryData, _ *plugin. // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_inspector2_coverage.listInspector2Coverage", "api_error", err) diff --git a/aws/table_aws_inspector2_coverage_statistics.go b/aws/table_aws_inspector2_coverage_statistics.go index 4d233182b..44c736984 100644 --- a/aws/table_aws_inspector2_coverage_statistics.go +++ b/aws/table_aws_inspector2_coverage_statistics.go @@ -35,6 +35,7 @@ func tableAwsInspector2CoverageStatistics(_ context.Context) *plugin.Table { Description: "AWS Inspector2 Coverage Statistics", List: &plugin.ListConfig{ Hydrate: listInspector2CoverageStatistics, + Tags: map[string]string{"service": "inspector2", "action": "ListCoverageStatistics"}, }, GetMatrixItemFunc: SupportedRegionMatrix(inspector2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -77,6 +78,9 @@ func listInspector2CoverageStatistics(ctx context.Context, d *plugin.QueryData, // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_inspector2_coverage_statistics.listInspector2CoverageStatistics", "api_error", err) diff --git a/aws/table_aws_inspector2_finding.go b/aws/table_aws_inspector2_finding.go index 36a76aa96..c205a7c92 100644 --- a/aws/table_aws_inspector2_finding.go +++ b/aws/table_aws_inspector2_finding.go @@ -24,6 +24,7 @@ func tableAwsInspector2Finding(_ context.Context) *plugin.Table { Description: "AWS Inspector2 Finding", List: &plugin.ListConfig{ Hydrate: listInspector2Finding, + Tags: map[string]string{"service": "inspector2", "action": "ListFindings"}, KeyColumns: plugin.KeyColumnSlice{ // The AWS CLI supports EQUALS, PREFIX, and NOT_EQUALS... we can't represent PREFIX. {Name: "finding_account_id", Operators: []string{"=", "<>"}, Require: plugin.Optional}, @@ -424,6 +425,9 @@ func listInspector2Finding(ctx context.Context, d *plugin.QueryData, _ *plugin.H // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_inspector2_finding.listInspector2Finding", "api_error", err) diff --git a/aws/table_aws_inspector2_member.go b/aws/table_aws_inspector2_member.go index bd9215850..e719abd7c 100644 --- a/aws/table_aws_inspector2_member.go +++ b/aws/table_aws_inspector2_member.go @@ -21,6 +21,7 @@ func tableAwsInspector2Member(_ context.Context) *plugin.Table { Description: "AWS Inspector2 Member", List: &plugin.ListConfig{ Hydrate: listInspector2Member, + Tags: map[string]string{"service": "inspector2", "action": "ListMembers"}, KeyColumns: []*plugin.KeyColumn{ { Name: "only_associated", @@ -104,14 +105,14 @@ func listInspector2Member(ctx context.Context, d *plugin.QueryData, _ *plugin.Hy MaxResults: aws.Int32(maxLimit), } -if d.EqualsQuals["only_associated"] != nil { - onlyAssociated := getQualsValueByColumn(d.Quals, "only_associated", "boolean") - if onlyAssociated.(string) == "true" { - input.OnlyAssociated = aws.Bool(true) - } else { - input.OnlyAssociated = aws.Bool(false) + if d.EqualsQuals["only_associated"] != nil { + onlyAssociated := getQualsValueByColumn(d.Quals, "only_associated", "boolean") + if onlyAssociated.(string) == "true" { + input.OnlyAssociated = aws.Bool(true) + } else { + input.OnlyAssociated = aws.Bool(false) + } } -} paginator := inspector2.NewListMembersPaginator(svc, input, func(o *inspector2.ListMembersPaginatorOptions) { o.Limit = maxLimit @@ -120,6 +121,9 @@ if d.EqualsQuals["only_associated"] != nil { // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_inspector2_member.listInspector2Member", "api_error", err) diff --git a/aws/table_aws_inspector_assessment_run.go b/aws/table_aws_inspector_assessment_run.go index 019481080..ff1c0f04f 100644 --- a/aws/table_aws_inspector_assessment_run.go +++ b/aws/table_aws_inspector_assessment_run.go @@ -22,6 +22,7 @@ func tableAwsInspectorAssessmentRun(_ context.Context) *plugin.Table { Description: "AWS Inspector Assessment Run", List: &plugin.ListConfig{ Hydrate: listInspectorAssessmentRuns, + Tags: map[string]string{"service": "inspector", "action": "ListAssessmentRuns"}, KeyColumns: plugin.KeyColumnSlice{ {Name: "assessment_template_arn", Require: plugin.Optional}, {Name: "name", Require: plugin.Optional}, @@ -179,6 +180,9 @@ func listInspectorAssessmentRuns(ctx context.Context, d *plugin.QueryData, _ *pl // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_inspector_assessment_run.listInspectorAssessmentRuns", "api_error", err) diff --git a/aws/table_aws_inspector_assessment_target.go b/aws/table_aws_inspector_assessment_target.go index 8867cf1e0..6e63f1dfc 100644 --- a/aws/table_aws_inspector_assessment_target.go +++ b/aws/table_aws_inspector_assessment_target.go @@ -23,9 +23,11 @@ func tableAwsInspectorAssessmentTarget(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("arn"), Hydrate: getInspectorAssessmentTarget, + Tags: map[string]string{"service": "inspector", "action": "ListAssessmentTargets"}, }, List: &plugin.ListConfig{ Hydrate: listInspectorAssessmentTargets, + Tags: map[string]string{"service": "inspector", "action": "ListAssessmentTargets"}, }, GetMatrixItemFunc: SupportedRegionMatrix(inspectorv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -121,6 +123,9 @@ func listInspectorAssessmentTargets(ctx context.Context, d *plugin.QueryData, _ // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_inspector_assessment_target.listInspectorAssessmentTargets", "api_error", err) diff --git a/aws/table_aws_inspector_assessment_template.go b/aws/table_aws_inspector_assessment_template.go index eb9a29c99..a306b42e3 100644 --- a/aws/table_aws_inspector_assessment_template.go +++ b/aws/table_aws_inspector_assessment_template.go @@ -26,6 +26,7 @@ func tableAwsInspectorAssessmentTemplate(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{}), }, Hydrate: getInspectorAssessmentTemplate, + Tags: map[string]string{"service": "inspector", "action": "DescribeAssessmentTemplates"}, }, List: &plugin.ListConfig{ Hydrate: listInspectorAssessmentTemplates, @@ -33,6 +34,21 @@ func tableAwsInspectorAssessmentTemplate(_ context.Context) *plugin.Table { {Name: "name", Require: plugin.Optional}, {Name: "assessment_target_arn", Require: plugin.Optional}, }, + Tags: map[string]string{"service": "inspector", "action": "ListAssessmentTemplates"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: listAwsInspectorAssessmentEventSubscriptions, + Tags: map[string]string{"service": "inspector", "action": "ListEventSubscriptions"}, + }, + { + Func: getInspectorAssessmentTemplate, + Tags: map[string]string{"service": "inspector", "action": "DescribeAssessmentTemplates"}, + }, + { + Func: getAwsInspectorAssessmentTemplateTags, + Tags: map[string]string{"service": "inspector", "action": "ListTagsForResource"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(inspectorv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -180,6 +196,9 @@ func listInspectorAssessmentTemplates(ctx context.Context, d *plugin.QueryData, // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_inspector_assessment_template.listInspectorAssessmentTemplates", "api_error", err) @@ -303,6 +322,9 @@ func listAwsInspectorAssessmentEventSubscriptions(ctx context.Context, d *plugin // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_inspector_assessment_template.listAwsInspectorAssessmentEventSubscriptions", "api_error", err) diff --git a/aws/table_aws_inspector_exclusion.go b/aws/table_aws_inspector_exclusion.go index 2ed791412..8aa2717ac 100644 --- a/aws/table_aws_inspector_exclusion.go +++ b/aws/table_aws_inspector_exclusion.go @@ -28,6 +28,7 @@ func tableAwsInspectorExclusion(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listInspectorAssessmentRuns, Hydrate: listInspectorExclusions, + Tags: map[string]string{"service": "inspector", "action": "DescribeExclusions"}, KeyColumns: []*plugin.KeyColumn{ {Name: "assessment_run_arn", Require: plugin.Optional}, }, @@ -123,6 +124,9 @@ func listInspectorExclusions(ctx context.Context, d *plugin.QueryData, h *plugin // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_inspector_exclusion.listInspectorExclusions", "api_error", err) diff --git a/aws/table_aws_inspector_finding.go b/aws/table_aws_inspector_finding.go index b0492e137..ce9dcf78b 100644 --- a/aws/table_aws_inspector_finding.go +++ b/aws/table_aws_inspector_finding.go @@ -23,6 +23,7 @@ func tableAwsInspectorFinding(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("arn"), Hydrate: getInspectorFinding, + Tags: map[string]string{"service": "inspector", "action": "ListFindings"}, }, List: &plugin.ListConfig{ Hydrate: listInspectorFindings, @@ -34,6 +35,7 @@ func tableAwsInspectorFinding(_ context.Context) *plugin.Table { {Name: "auto_scaling_group", Require: plugin.Optional, Operators: []string{"="}}, {Name: "severity", Require: plugin.Optional, Operators: []string{"="}}, }, + Tags: map[string]string{"service": "inspector", "action": "DescribeFindings"}, }, GetMatrixItemFunc: SupportedRegionMatrix(inspectorv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -227,6 +229,9 @@ func listInspectorFindings(ctx context.Context, d *plugin.QueryData, _ *plugin.H // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_inspector_finding.listInspectorFindings", "api_error", err) diff --git a/aws/table_aws_kinesis_consumer.go b/aws/table_aws_kinesis_consumer.go index 459ec9d41..ad4ea0679 100644 --- a/aws/table_aws_kinesis_consumer.go +++ b/aws/table_aws_kinesis_consumer.go @@ -26,12 +26,20 @@ func tableAwsKinesisConsumer(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, Hydrate: getAwsKinesisConsumer, + Tags: map[string]string{"service": "kinesis", "action": "DescribeStreamConsumer"}, }, List: &plugin.ListConfig{ ParentHydrate: listStreams, Hydrate: listKinesisConsumers, + Tags: map[string]string{"service": "kinesis", "action": "ListStreamConsumers"}, }, GetMatrixItemFunc: SupportedRegionMatrix(kinesisv1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsKinesisConsumer, + Tags: map[string]string{"service": "kinesis", "action": "DescribeStreamConsumer"}, + }, + }, Columns: awsRegionalColumns([]*plugin.Column{ { Name: "consumer_name", @@ -128,6 +136,9 @@ func listKinesisConsumers(ctx context.Context, d *plugin.QueryData, h *plugin.Hy }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_kinesis_consumer.listKinesisConsumers", "api_error", err) diff --git a/aws/table_aws_kinesis_firehose_delivery_stream.go b/aws/table_aws_kinesis_firehose_delivery_stream.go index 1faea9463..5442c4dfd 100644 --- a/aws/table_aws_kinesis_firehose_delivery_stream.go +++ b/aws/table_aws_kinesis_firehose_delivery_stream.go @@ -26,14 +26,26 @@ func tableAwsKinesisFirehoseDeliveryStream(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationException", "InvalidParameter", "ResourceNotFoundException"}), }, Hydrate: describeFirehoseDeliveryStream, + Tags: map[string]string{"service": "firehose", "action": "DescribeDeliveryStream"}, }, List: &plugin.ListConfig{ Hydrate: listFirehoseDeliveryStreams, + Tags: map[string]string{"service": "firehose", "action": "ListDeliveryStreams"}, KeyColumns: []*plugin.KeyColumn{ {Name: "delivery_stream_type", Require: plugin.Optional}, }, }, GetMatrixItemFunc: SupportedRegionMatrix(kinesisv1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: describeFirehoseDeliveryStream, + Tags: map[string]string{"service": "firehose", "action": "DescribeDeliveryStream"}, + }, + { + Func: listFirehoseDeliveryStreamTags, + Tags: map[string]string{"service": "firehose", "action": "ListTagsForDeliveryStream"}, + }, + }, Columns: awsRegionalColumns([]*plugin.Column{ { Name: "delivery_stream_name", diff --git a/aws/table_aws_kinesis_stream.go b/aws/table_aws_kinesis_stream.go index dbd0db20a..dc7ff563e 100644 --- a/aws/table_aws_kinesis_stream.go +++ b/aws/table_aws_kinesis_stream.go @@ -26,11 +26,27 @@ func tableAwsKinesisStream(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "InvalidParameter"}), }, Hydrate: describeStream, + Tags: map[string]string{"service": "kinesis", "action": "DescribeStream"}, }, List: &plugin.ListConfig{ Hydrate: listStreams, + Tags: map[string]string{"service": "kinesis", "action": "ListStreams"}, }, GetMatrixItemFunc: SupportedRegionMatrix(kinesisv1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: describeStream, + Tags: map[string]string{"service": "kinesis", "action": "DescribeStream"}, + }, + { + Func: describeStreamSummary, + Tags: map[string]string{"service": "kinesis", "action": "DescribeStreamSummary"}, + }, + { + Func: getAwsKinesisStreamTags, + Tags: map[string]string{"service": "kinesis", "action": "ListTagsForStream"}, + }, + }, Columns: awsRegionalColumns([]*plugin.Column{ { Name: "stream_name", @@ -182,6 +198,9 @@ func listStreams(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateData // API doesn't support aws-sdk-go-v2 paginator as of date for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.ListStreams(ctx, input) if err != nil { plugin.Logger(ctx).Error("aws_kinesis_stream.listStreams", "api_error", err) diff --git a/aws/table_aws_kinesis_video_stream.go b/aws/table_aws_kinesis_video_stream.go index dc95a69d5..721af00e8 100644 --- a/aws/table_aws_kinesis_video_stream.go +++ b/aws/table_aws_kinesis_video_stream.go @@ -26,11 +26,19 @@ func tableAwsKinesisVideoStream(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, Hydrate: getKinesisVideoStream, + Tags: map[string]string{"service": "kinesisvideo", "action": "DescribeStream"}, }, List: &plugin.ListConfig{ Hydrate: listKinesisVideoStreams, + Tags: map[string]string{"service": "kinesisvideo", "action": "ListStreams"}, }, GetMatrixItemFunc: SupportedRegionMatrix(kinesisv1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: listKinesisVideoStreamTags, + Tags: map[string]string{"service": "kinesisvideo", "action": "ListTagsForStream"}, + }, + }, Columns: awsRegionalColumns([]*plugin.Column{ { Name: "stream_name", @@ -141,6 +149,9 @@ func listKinesisVideoStreams(ctx context.Context, d *plugin.QueryData, _ *plugin }) // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_kinesis_video_stream.listKinesisVideoStreams", "api_error", err) diff --git a/aws/table_aws_kinesisanalyticsv2_application.go b/aws/table_aws_kinesisanalyticsv2_application.go index 421b1c4bb..2b2fc1e11 100644 --- a/aws/table_aws_kinesisanalyticsv2_application.go +++ b/aws/table_aws_kinesisanalyticsv2_application.go @@ -26,11 +26,23 @@ func tableAwsKinesisAnalyticsV2Application(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, Hydrate: getKinesisAnalyticsV2Application, + Tags: map[string]string{"service": "kinesisanalytics", "action": "DescribeApplication"}, }, List: &plugin.ListConfig{ Hydrate: listKinesisAnalyticsV2Applications, + Tags: map[string]string{"service": "kinesisanalytics", "action": "ListApplications"}, }, GetMatrixItemFunc: SupportedRegionMatrix(kinesisanalyticsv2v1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getKinesisAnalyticsV2Application, + Tags: map[string]string{"service": "kinesisanalytics", "action": "DescribeApplication"}, + }, + { + Func: getKinesisAnalyticsV2ApplicationTags, + Tags: map[string]string{"service": "kinesisanalytics", "action": "ListTagsForResource"}, + }, + }, Columns: awsRegionalColumns([]*plugin.Column{ { Name: "application_name", @@ -160,6 +172,9 @@ func listKinesisAnalyticsV2Applications(ctx context.Context, d *plugin.QueryData // API doesn't support aws-sdk-go-v2 paginator as of data for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.ListApplications(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_kinesisanalyticsv2_application.listKinesisAnalyticsV2Applications", "api_error", err) diff --git a/aws/table_aws_kms_alias.go b/aws/table_aws_kms_alias.go index c40a23043..24c98c049 100644 --- a/aws/table_aws_kms_alias.go +++ b/aws/table_aws_kms_alias.go @@ -23,6 +23,7 @@ func tableAwsKmsAlias(ctx context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listKmsKeys, Hydrate: listKmsAliases, + Tags: map[string]string{"service": "kms", "action": "ListAliases"}, }, GetMatrixItemFunc: SupportedRegionMatrix(kmsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -112,6 +113,9 @@ func listKmsAliases(ctx context.Context, d *plugin.QueryData, h *plugin.HydrateD }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_kms_key_alias.listKmsAliases", "api_error", err) diff --git a/aws/table_aws_kms_key.go b/aws/table_aws_kms_key.go index bc1b44bc8..361370262 100644 --- a/aws/table_aws_kms_key.go +++ b/aws/table_aws_kms_key.go @@ -28,14 +28,38 @@ func tableAwsKmsKey(ctx context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("id"), Hydrate: getKmsKey, + Tags: map[string]string{"service": "kms", "action": "DescribeKey"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFoundException", "InvalidParameter"}), }, }, List: &plugin.ListConfig{ Hydrate: listKmsKeys, + Tags: map[string]string{"service": "kms", "action": "ListKeys"}, }, GetMatrixItemFunc: SupportedRegionMatrix(kmsv1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsKmsKeyData, + Tags: map[string]string{"service": "kms", "action": "DescribeKey"}, + }, + { + Func: getAwsKmsKeyAliases, + Tags: map[string]string{"service": "kms", "action": "ListAliases"}, + }, + { + Func: getAwsKmsKeyRotationStatus, + Tags: map[string]string{"service": "kms", "action": "GetKeyRotationStatus"}, + }, + { + Func: getAwsKmsKeyPolicy, + Tags: map[string]string{"service": "kms", "action": "GetKeyPolicy"}, + }, + { + Func: getAwsKmsKeyTagging, + Tags: map[string]string{"service": "kms", "action": "ListResourceTags"}, + }, + }, Columns: awsRegionalColumns([]*plugin.Column{ { Name: "id", @@ -220,6 +244,9 @@ func listKmsKeys(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateData }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_kms_key.listKmsKeys", "api_error", err) @@ -368,6 +395,9 @@ func getAwsKmsKeyTagging(ctx context.Context, d *plugin.QueryData, h *plugin.Hyd }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_kms_key.getAwsKmsKeyTagging", "api_error", err) @@ -414,6 +444,9 @@ func getAwsKmsKeyAliases(ctx context.Context, d *plugin.QueryData, h *plugin.Hyd }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_kms_key.getAwsKmsKeyAliases", "api_error", err) diff --git a/aws/table_aws_lambda_alias.go b/aws/table_aws_lambda_alias.go index 624305b04..197a8b7dd 100644 --- a/aws/table_aws_lambda_alias.go +++ b/aws/table_aws_lambda_alias.go @@ -29,16 +29,28 @@ func tableAwsLambdaAlias(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameter", "ResourceNotFoundException"}), }, Hydrate: getLambdaAlias, + Tags: map[string]string{"service": "lambda", "action": "GetAlias"}, }, List: &plugin.ListConfig{ ParentHydrate: listAwsLambdaFunctions, Hydrate: listLambdaAliases, + Tags: map[string]string{"service": "lambda", "action": "ListAliases"}, KeyColumns: []*plugin.KeyColumn{ {Name: "function_version", Require: plugin.Optional}, {Name: "function_name", Require: plugin.Optional}, }, }, GetMatrixItemFunc: SupportedRegionMatrix(lambdav1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getLambdaAliasPolicy, + Tags: map[string]string{"service": "lambda", "action": "GetPolicy"}, + }, + { + Func: getLambdaAliasUrlConfig, + Tags: map[string]string{"service": "lambda", "action": "GetFunctionUrlConfig"}, + }, + }, Columns: awsRegionalColumns([]*plugin.Column{ { Name: "name", @@ -175,6 +187,9 @@ func listLambdaAliases(ctx context.Context, d *plugin.QueryData, h *plugin.Hydra }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_lambda_function.listAwsLambdaFunctions", "api_error", err) diff --git a/aws/table_aws_lambda_function.go b/aws/table_aws_lambda_function.go index 4da2f4926..67c681b9d 100644 --- a/aws/table_aws_lambda_function.go +++ b/aws/table_aws_lambda_function.go @@ -25,11 +25,27 @@ func tableAwsLambdaFunction(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("name"), Hydrate: getAwsLambdaFunction, + Tags: map[string]string{"service": "lambda", "action": "GetFunction"}, }, List: &plugin.ListConfig{ Hydrate: listAwsLambdaFunctions, + Tags: map[string]string{"service": "lambda", "action": "ListFunctions"}, }, GetMatrixItemFunc: SupportedRegionMatrix(lambdav1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsLambdaFunction, + Tags: map[string]string{"service": "lambda", "action": "GetFunction"}, + }, + { + Func: getFunctionPolicy, + Tags: map[string]string{"service": "lambda", "action": "GetPolicy"}, + }, + { + Func: getLambdaFunctionUrlConfig, + Tags: map[string]string{"service": "lambda", "action": "GetFunctionUrlConfig"}, + }, + }, Columns: awsRegionalColumns([]*plugin.Column{ { Name: "name", @@ -313,6 +329,9 @@ func listAwsLambdaFunctions(ctx context.Context, d *plugin.QueryData, _ *plugin. }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_lambda_function.listAwsLambdaFunctions", "api_error", err) diff --git a/aws/table_aws_lambda_function_metric_duration_daily.go b/aws/table_aws_lambda_function_metric_duration_daily.go index 143a5cf38..53e9828c6 100644 --- a/aws/table_aws_lambda_function_metric_duration_daily.go +++ b/aws/table_aws_lambda_function_metric_duration_daily.go @@ -18,6 +18,7 @@ func tableAwsLambdaFunctionMetricDurationDaily(_ context.Context) *plugin.Table List: &plugin.ListConfig{ ParentHydrate: listAwsLambdaFunctions, Hydrate: listLambdaFunctionMetricDurationDaily, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_lambda_function_metric_errors_daily.go b/aws/table_aws_lambda_function_metric_errors_daily.go index 47f12fb84..9b5eb494b 100644 --- a/aws/table_aws_lambda_function_metric_errors_daily.go +++ b/aws/table_aws_lambda_function_metric_errors_daily.go @@ -18,6 +18,7 @@ func tableAwsLambdaFunctionMetricErrorsDaily(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listAwsLambdaFunctions, Hydrate: listLambdaFunctionMetricErrorsDaily, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_lambda_function_metric_invocations_daily.go b/aws/table_aws_lambda_function_metric_invocations_daily.go index 2363f04b3..01bf492b9 100644 --- a/aws/table_aws_lambda_function_metric_invocations_daily.go +++ b/aws/table_aws_lambda_function_metric_invocations_daily.go @@ -18,6 +18,7 @@ func tableAwsLambdaFunctionMetricInvocationsDaily(_ context.Context) *plugin.Tab List: &plugin.ListConfig{ ParentHydrate: listAwsLambdaFunctions, Hydrate: listLambdaFunctionMetricInvocationsDaily, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_lambda_layer.go b/aws/table_aws_lambda_layer.go index 06d073b38..8eb8654cb 100644 --- a/aws/table_aws_lambda_layer.go +++ b/aws/table_aws_lambda_layer.go @@ -18,6 +18,7 @@ func tableAwsLambdaLayer(_ context.Context) *plugin.Table { Description: "AWS Lambda Layer", List: &plugin.ListConfig{ Hydrate: listLambdaLayers, + Tags: map[string]string{"service": "lambda", "action": "ListLayers"}, }, GetMatrixItemFunc: SupportedRegionMatrix(lambdav1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -129,6 +130,9 @@ func listLambdaLayers(ctx context.Context, d *plugin.QueryData, h *plugin.Hydrat }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_lambda_function.listAwsLambdaFunctions", "api_error", err) diff --git a/aws/table_aws_lambda_layer_version.go b/aws/table_aws_lambda_layer_version.go index 7ce940ea4..ab2a179c6 100644 --- a/aws/table_aws_lambda_layer_version.go +++ b/aws/table_aws_lambda_layer_version.go @@ -28,15 +28,27 @@ func tableAwsLambdaLayerVersion(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "InvalidParameter", "InvalidParameterValueException"}), }, Hydrate: getLambdaLayerVersion, + Tags: map[string]string{"service": "lambda", "action": "GetLayerVersion"}, }, List: &plugin.ListConfig{ Hydrate: listLambdaLayerVersions, ParentHydrate: listLambdaLayers, + Tags: map[string]string{"service": "lambda", "action": "ListLayerVersions"}, KeyColumns: []*plugin.KeyColumn{ {Name: "layer_name", Require: plugin.Optional}, }, }, GetMatrixItemFunc: SupportedRegionMatrix(lambdav1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getLambdaLayerVersionPolicy, + Tags: map[string]string{"service": "lambda", "action": "GetLayerVersionPolicy"}, + }, + { + Func: getLambdaLayerVersion, + Tags: map[string]string{"service": "lambda", "action": "GetLayerVersion"}, + }, + }, Columns: awsRegionalColumns([]*plugin.Column{ { Name: "layer_name", @@ -181,6 +193,9 @@ func listLambdaLayerVersions(ctx context.Context, d *plugin.QueryData, h *plugin }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_lambda_function.listAwsLambdaFunctions", "api_error", err) diff --git a/aws/table_aws_lambda_version.go b/aws/table_aws_lambda_version.go index 641f4ecca..bc74ec2d1 100644 --- a/aws/table_aws_lambda_version.go +++ b/aws/table_aws_lambda_version.go @@ -28,15 +28,23 @@ func tableAwsLambdaVersion(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameter", "ResourceNotFoundException"}), }, Hydrate: getFunctionVersion, + Tags: map[string]string{"service": "lambda", "action": "ListVersionsByFunction"}, }, List: &plugin.ListConfig{ ParentHydrate: listAwsLambdaFunctions, Hydrate: listLambdaVersions, + Tags: map[string]string{"service": "lambda", "action": "ListVersionsByFunction"}, KeyColumns: []*plugin.KeyColumn{ {Name: "function_name", Require: plugin.Optional}, }, }, GetMatrixItemFunc: SupportedRegionMatrix(lambdav1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getFunctionVersionPolicy, + Tags: map[string]string{"service": "lambda", "action": "GetPolicy"}, + }, + }, Columns: awsRegionalColumns([]*plugin.Column{ { Name: "version", @@ -230,6 +238,9 @@ func listLambdaVersions(ctx context.Context, d *plugin.QueryData, h *plugin.Hydr }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_lambda_function.listAwsLambdaFunctions", "api_error", err) @@ -283,6 +294,9 @@ func getFunctionVersion(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydr }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_lambda_function.getFunctionVersion", "api_error", err) diff --git a/aws/table_aws_lightsail_instance.go b/aws/table_aws_lightsail_instance.go index b38ea6a35..ed9074da1 100644 --- a/aws/table_aws_lightsail_instance.go +++ b/aws/table_aws_lightsail_instance.go @@ -23,12 +23,20 @@ func tableAwsLightsailInstance(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("name"), Hydrate: getLightsailInstance, + Tags: map[string]string{"service": "lightsail", "action": "GetInstance"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidResourceName", "DoesNotExist"}), }, }, List: &plugin.ListConfig{ Hydrate: listLightsailInstances, + Tags: map[string]string{"service": "lightsail", "action": "GetInstances"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getLightsailInstance, + Tags: map[string]string{"service": "lightsail", "action": "GetInstance"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(lightsailv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -190,6 +198,9 @@ func listLightsailInstances(ctx context.Context, d *plugin.QueryData, _ *plugin. // List call for { + // apply rate limiting + d.WaitForListRateLimit(ctx) + resp, err := svc.GetInstances(ctx, input) if err != nil { diff --git a/aws/table_aws_macie2_classification_job.go b/aws/table_aws_macie2_classification_job.go index a5aa295c3..860617f6f 100644 --- a/aws/table_aws_macie2_classification_job.go +++ b/aws/table_aws_macie2_classification_job.go @@ -26,15 +26,23 @@ func tableAwsMacie2ClassificationJob(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationException", "InvalidParameter"}), }, Hydrate: getMacie2ClassificationJob, + Tags: map[string]string{"service": "macie2", "action": "DescribeClassificationJob"}, }, List: &plugin.ListConfig{ Hydrate: listMacie2ClassificationJobs, + Tags: map[string]string{"service": "macie2", "action": "ListClassificationJobs"}, KeyColumns: []*plugin.KeyColumn{ {Name: "name", Require: plugin.Optional, Operators: []string{"=", "<>"}}, {Name: "job_status", Require: plugin.Optional, Operators: []string{"=", "<>"}}, {Name: "job_type", Require: plugin.Optional, Operators: []string{"=", "<>"}}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getMacie2ClassificationJob, + Tags: map[string]string{"service": "macie2", "action": "DescribeClassificationJob"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(macie2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -197,6 +205,9 @@ func listMacie2ClassificationJobs(ctx context.Context, d *plugin.QueryData, _ *p }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { // Throws "AccessDeniedException: Macie is not enabled." when AWS Macie is not enabled in a region diff --git a/aws/table_aws_media_store_container.go b/aws/table_aws_media_store_container.go index 7baa25040..8d4d7a085 100644 --- a/aws/table_aws_media_store_container.go +++ b/aws/table_aws_media_store_container.go @@ -28,13 +28,25 @@ func tableAwsMediaStoreContainer(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameter", "ContainerNotFoundException", "ContainerInUseException"}), }, Hydrate: getMediaStoreContainer, + Tags: map[string]string{"service": "mediastore", "action": "DescribeContainer"}, }, List: &plugin.ListConfig{ Hydrate: listMediaStoreContainers, + Tags: map[string]string{"service": "mediastore", "action": "ListContainers"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ContainerInUseException"}), }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getMediaStoreContainerPolicy, + Tags: map[string]string{"service": "mediastore", "action": "GetContainerPolicy"}, + }, + { + Func: listMediaStoreContainerTags, + Tags: map[string]string{"service": "mediastore", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(mediastorev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -155,6 +167,9 @@ func listMediaStoreContainers(ctx context.Context, d *plugin.QueryData, h *plugi // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_media_store_container.listMediaStoreContainers", "api_error", err) diff --git a/aws/table_aws_mgn_application.go b/aws/table_aws_mgn_application.go index 8d0a5ebcf..19e8f52ea 100644 --- a/aws/table_aws_mgn_application.go +++ b/aws/table_aws_mgn_application.go @@ -24,6 +24,7 @@ func tableAwsMGNApplication(_ context.Context) *plugin.Table { Description: "AWS MGN Application", List: &plugin.ListConfig{ Hydrate: ListAwsMGNApplications, + Tags: map[string]string{"service": "mgn", "action": "ListApplications"}, IgnoreConfig: &plugin.IgnoreConfig{ // UninitializedAccountException - This error comes up when the service is not enabled for the account. ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"UninitializedAccountException"}), @@ -144,6 +145,9 @@ func ListAwsMGNApplications(ctx context.Context, d *plugin.QueryData, h *plugin. // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_mgn_application.ListAwsMGNApplications", "api_error", err) diff --git a/aws/table_aws_msk_cluster.go b/aws/table_aws_msk_cluster.go index 163430230..ecfcb15e5 100644 --- a/aws/table_aws_msk_cluster.go +++ b/aws/table_aws_msk_cluster.go @@ -23,12 +23,24 @@ func tableAwsMSKCluster(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("arn"), Hydrate: getKafkaCluster(string(types.ClusterTypeProvisioned)), + Tags: map[string]string{"service": "kafka", "action": "DescribeCluster"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFoundException"}), }, }, List: &plugin.ListConfig{ Hydrate: listKafkaClusters(string(types.ClusterTypeProvisioned)), + Tags: map[string]string{"service": "kafka", "action": "ListClusters"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getKafkaClusterConfiguration, + Tags: map[string]string{"service": "kafka", "action": "DescribeConfiguration"}, + }, + { + Func: getKafkaClusterOperation, + Tags: map[string]string{"service": "kafka", "action": "DescribeClusterOperation"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(kafkav1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -156,6 +168,9 @@ func listKafkaClusters(clusterType string) func(ctx context.Context, d *plugin.Q }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_msk_cluster.listKafkaClusters", "api_error", err) diff --git a/aws/table_aws_msk_serverless_cluster.go b/aws/table_aws_msk_serverless_cluster.go index 503433a97..a50d28831 100644 --- a/aws/table_aws_msk_serverless_cluster.go +++ b/aws/table_aws_msk_serverless_cluster.go @@ -21,12 +21,20 @@ func tableAwsMSKServerlessCluster(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("arn"), Hydrate: getKafkaCluster(string(types.ClusterTypeServerless)), + Tags: map[string]string{"service": "kafka", "action": "DescribeCluster"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFoundException"}), }, }, List: &plugin.ListConfig{ Hydrate: listKafkaClusters(string(types.ClusterTypeServerless)), + Tags: map[string]string{"service": "kafka", "action": "ListClusters"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getKafkaClusterOperation, + Tags: map[string]string{"service": "kafka", "action": "DescribeClusterOperation"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(kafkav1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ diff --git a/aws/table_aws_neptune_db_cluster.go b/aws/table_aws_neptune_db_cluster.go index a85e199b0..8ed37316e 100644 --- a/aws/table_aws_neptune_db_cluster.go +++ b/aws/table_aws_neptune_db_cluster.go @@ -23,12 +23,20 @@ func tableAwsNeptuneDBCluster(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("db_cluster_identifier"), Hydrate: getNeptuneDBCluster, + Tags: map[string]string{"service": "neptune", "action": "DescribeDBClusters"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"DBClusterNotFoundFault"}), }, }, List: &plugin.ListConfig{ Hydrate: listNeptuneDBClusters, + Tags: map[string]string{"service": "neptune", "action": "DescribeDBClusters"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getNeptuneDBClusterTags, + Tags: map[string]string{"service": "neptune", "action": "ListTagsForResource"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(neptunev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -285,6 +293,9 @@ func listNeptuneDBClusters(ctx context.Context, d *plugin.QueryData, _ *plugin.H }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_neptune_db_cluster.listNeptuneDBClusters", "api_error", err) diff --git a/aws/table_aws_neptune_db_cluster_snapshot.go b/aws/table_aws_neptune_db_cluster_snapshot.go index 0a0186300..96666595d 100644 --- a/aws/table_aws_neptune_db_cluster_snapshot.go +++ b/aws/table_aws_neptune_db_cluster_snapshot.go @@ -23,17 +23,25 @@ func tableAwsNeptuneDBClusterSnapshot(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("db_cluster_snapshot_identifier"), Hydrate: getNeptuneDBClusterSnapshot, + Tags: map[string]string{"service": "neptune", "action": "DescribeDBClusterSnapshots"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"DBClusterSnapshotNotFoundFault"}), }, }, List: &plugin.ListConfig{ Hydrate: listNeptuneDBClusterSnapshots, + Tags: map[string]string{"service": "neptune", "action": "DescribeDBClusterSnapshots"}, KeyColumns: []*plugin.KeyColumn{ {Name: "db_cluster_identifier", Require: plugin.Optional}, {Name: "snapshot_type", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getNeptuneDBClusterSnapshotAttributes, + Tags: map[string]string{"service": "neptune", "action": "DescribeDBClusterSnapshotAttributes"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(neptunev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -207,6 +215,9 @@ func listNeptuneDBClusterSnapshots(ctx context.Context, d *plugin.QueryData, _ * }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_neptune_db_cluster_snapshot.listNeptuneDBClusterSnapshots", "api_error", err) @@ -301,4 +312,4 @@ func getNeptuneDBClusterSnapshotAttributes(ctx context.Context, d *plugin.QueryD } return attributes, nil -} \ No newline at end of file +} diff --git a/aws/table_aws_networkfirewall_firewall.go b/aws/table_aws_networkfirewall_firewall.go index f8d2cc7d8..44361cc58 100644 --- a/aws/table_aws_networkfirewall_firewall.go +++ b/aws/table_aws_networkfirewall_firewall.go @@ -26,6 +26,7 @@ func tableAwsNetworkFirewallFirewall(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "InvalidRequestException", "ValidationException"}), }, Hydrate: getNetworkFirewallFirewall, + Tags: map[string]string{"service": "network-firewall", "action": "DescribeFirewall"}, }, List: &plugin.ListConfig{ KeyColumns: plugin.OptionalColumns([]string{"vpc_id"}), @@ -33,6 +34,13 @@ func tableAwsNetworkFirewallFirewall(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidRequestException", "ValidationException"}), }, Hydrate: listNetworkFirewallFirewalls, + Tags: map[string]string{"service": "network-firewall", "action": "ListFirewalls"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getNetworkFirewallFirewall, + Tags: map[string]string{"service": "network-firewall", "action": "DescribeFirewall"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(networkfirewallv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -196,6 +204,9 @@ func listNetworkFirewallFirewalls(ctx context.Context, d *plugin.QueryData, _ *p // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_networkfirewall_firewall.listNetworkFirewallFirewalls", "api_error", err) diff --git a/aws/table_aws_networkfirewall_firewall_policy.go b/aws/table_aws_networkfirewall_firewall_policy.go index a46165dad..d6f992cd2 100644 --- a/aws/table_aws_networkfirewall_firewall_policy.go +++ b/aws/table_aws_networkfirewall_firewall_policy.go @@ -23,9 +23,17 @@ func tableAwsNetworkFirewallPolicy(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.AnyColumn([]string{"arn", "name"}), Hydrate: getNetworkFirewallPolicy, + Tags: map[string]string{"service": "network-firewall", "action": "DescribeFirewallPolicy"}, }, List: &plugin.ListConfig{ Hydrate: listNetworkFirewallPolicies, + Tags: map[string]string{"service": "network-firewall", "action": "ListFirewallPolicies"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getNetworkFirewallPolicy, + Tags: map[string]string{"service": "network-firewall", "action": "DescribeFirewallPolicy"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(networkfirewallv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -174,6 +182,9 @@ func listNetworkFirewallPolicies(ctx context.Context, d *plugin.QueryData, _ *pl // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_networkfirewall_firewall_policy.listNetworkFirewallPolicies", "api_error", err) diff --git a/aws/table_aws_networkfirewall_rule_group.go b/aws/table_aws_networkfirewall_rule_group.go index 50bd3d4c3..58d2f9f23 100644 --- a/aws/table_aws_networkfirewall_rule_group.go +++ b/aws/table_aws_networkfirewall_rule_group.go @@ -23,9 +23,17 @@ func tableAwsNetworkFirewallRuleGroup(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.AnyColumn([]string{"arn", "rule_group_name"}), Hydrate: getNetworkFirewallRuleGroup, + Tags: map[string]string{"service": "network-firewall", "action": "DescribeRuleGroup"}, }, List: &plugin.ListConfig{ Hydrate: listNetworkFirewallRuleGroups, + Tags: map[string]string{"service": "network-firewall", "action": "ListRuleGroups"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getNetworkFirewallRuleGroup, + Tags: map[string]string{"service": "network-firewall", "action": "DescribeRuleGroup"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(networkfirewallv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -181,6 +189,9 @@ func listNetworkFirewallRuleGroups(ctx context.Context, d *plugin.QueryData, _ * // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_networkfirewall_rule_group.listNetworkFirewallRuleGroups", "api_error", err) diff --git a/aws/table_aws_oam_link.go b/aws/table_aws_oam_link.go index d354f4d23..fff88119a 100644 --- a/aws/table_aws_oam_link.go +++ b/aws/table_aws_oam_link.go @@ -24,9 +24,17 @@ func tableAwsOAMLink(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterException", "ResourceNotFoundException"}), }, Hydrate: getAwsOAMLink, + Tags: map[string]string{"service": "oam", "action": "GetLink"}, }, List: &plugin.ListConfig{ Hydrate: listAwsOAMLinks, + Tags: map[string]string{"service": "oam", "action": "ListLinks"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsOAMLink, + Tags: map[string]string{"service": "oam", "action": "GetLink"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(oamv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -113,6 +121,9 @@ func listAwsOAMLinks(ctx context.Context, d *plugin.QueryData, h *plugin.Hydrate // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_oam_link.listAwsOAMLinks", "api_error", err) diff --git a/aws/table_aws_oam_sink.go b/aws/table_aws_oam_sink.go index fc6e00887..4d970a5fc 100644 --- a/aws/table_aws_oam_sink.go +++ b/aws/table_aws_oam_sink.go @@ -24,9 +24,17 @@ func tableAwsOAMSink(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValue", "ResourceNotFoundException"}), }, Hydrate: getAwsOAMSink, + Tags: map[string]string{"service": "oam", "action": "GetSink"}, }, List: &plugin.ListConfig{ Hydrate: listAwsOAMSinks, + Tags: map[string]string{"service": "oam", "action": "ListSinks"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: listAwsOAMSinkTags, + Tags: map[string]string{"service": "oam", "action": "ListTagsForResource"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(oamv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -102,6 +110,9 @@ func listAwsOAMSinks(ctx context.Context, d *plugin.QueryData, h *plugin.Hydrate // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_oam_sink.listAwsOAMSinks", "api_error", err) diff --git a/aws/table_aws_opensearch_domain.go b/aws/table_aws_opensearch_domain.go index 4fac5b5fe..b3824ab9c 100644 --- a/aws/table_aws_opensearch_domain.go +++ b/aws/table_aws_opensearch_domain.go @@ -23,13 +23,20 @@ func tableAwsOpenSearchDomain(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, Hydrate: getOpenSearchDomain, + Tags: map[string]string{"service": "es", "action": "DescribeDomain"}, }, List: &plugin.ListConfig{ Hydrate: listOpenSearchDomains, + Tags: map[string]string{"service": "es", "action": "ListDomainNames"}, }, HydrateConfig: []plugin.HydrateConfig{ + { + Func: getOpenSearchDomain, + Tags: map[string]string{"service": "es", "action": "DescribeDomain"}, + }, { Func: listOpenSearchDomainTags, + Tags: map[string]string{"service": "es", "action": "ListTags"}, Depends: []plugin.HydrateFunc{getOpenSearchDomain}, }, }, diff --git a/aws/table_aws_organizations_account.go b/aws/table_aws_organizations_account.go index 659fd17b5..0d3dbe92b 100644 --- a/aws/table_aws_organizations_account.go +++ b/aws/table_aws_organizations_account.go @@ -21,9 +21,17 @@ func tableAwsOrganizationsAccount(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"AccountNotFoundException", "InvalidInputException"}), }, Hydrate: getOrganizationsAccount, + Tags: map[string]string{"service": "organizations", "action": "DescribeAccount"}, }, List: &plugin.ListConfig{ Hydrate: listOrganizationsAccounts, + Tags: map[string]string{"service": "organizations", "action": "ListAccounts"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getOrganizationsAccountTags, + Tags: map[string]string{"service": "organizations", "action": "ListTagsForResource"}, + }, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { @@ -127,6 +135,9 @@ func listOrganizationsAccounts(ctx context.Context, d *plugin.QueryData, _ *plug }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_organizations_account.listOrganizationsAccounts", "api_error", err) @@ -199,6 +210,9 @@ func getOrganizationsResourceTags(ctx context.Context, d *plugin.QueryData, reso }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_organizations_account.getOrganizationsResourceTags", "api_error", err) diff --git a/aws/table_aws_organizations_policy.go b/aws/table_aws_organizations_policy.go index bd9c574ea..944594a95 100644 --- a/aws/table_aws_organizations_policy.go +++ b/aws/table_aws_organizations_policy.go @@ -22,14 +22,22 @@ func tableAwsOrganizationsPolicy(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"PolicyNotFoundException", "InvalidInputException"}), }, Hydrate: getOrganizationsPolicy, + Tags: map[string]string{"service": "organizations", "action": "DescribePolicy"}, }, List: &plugin.ListConfig{ Hydrate: listOrganizationsPolicies, + Tags: map[string]string{"service": "organizations", "action": "ListPolicies"}, KeyColumns: plugin.SingleColumn("type"), IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidInputException"}), }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getOrganizationsPolicy, + Tags: map[string]string{"service": "organizations", "action": "DescribePolicy"}, + }, + }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { Name: "name", @@ -131,6 +139,9 @@ func listOrganizationsPolicies(ctx context.Context, d *plugin.QueryData, _ *plug }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_organizations_policy.listOrganizationsPolicies", "api_error", err) diff --git a/aws/table_aws_organizations_policy_target.go b/aws/table_aws_organizations_policy_target.go index 84ea4736e..13389b51d 100644 --- a/aws/table_aws_organizations_policy_target.go +++ b/aws/table_aws_organizations_policy_target.go @@ -21,14 +21,22 @@ func tableAwsOrganizationsPolicyTarget(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"PolicyNotFoundException", "InvalidInputException"}), }, Hydrate: getOrganizationsPolicy, + Tags: map[string]string{"service": "organizations", "action": "DescribePolicy"}, }, List: &plugin.ListConfig{ Hydrate: listOrganizationsPolicyTragets, + Tags: map[string]string{"service": "organizations", "action": "ListPoliciesForTarget"}, KeyColumns: plugin.AllColumns([]string{"type", "target_id"}), IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidInputException", "TargetNotFoundException"}), }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getOrganizationsPolicy, + Tags: map[string]string{"service": "organizations", "action": "DescribePolicy"}, + }, + }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { Name: "name", @@ -138,6 +146,9 @@ func listOrganizationsPolicyTragets(ctx context.Context, d *plugin.QueryData, _ }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_organizations_policy_target.listOrganizationsPolicies", "api_error", err) diff --git a/aws/table_aws_pinpoint_app.go b/aws/table_aws_pinpoint_app.go index 0622acbc8..c2f77cd02 100644 --- a/aws/table_aws_pinpoint_app.go +++ b/aws/table_aws_pinpoint_app.go @@ -27,9 +27,17 @@ func tableAwsPinpointApp(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFoundException"}), }, Hydrate: getPinpointApp, + Tags: map[string]string{"service": "mobiletargeting", "action": "GetApp"}, }, List: &plugin.ListConfig{ Hydrate: listPinpointApps, + Tags: map[string]string{"service": "mobiletargeting", "action": "GetApps"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getPinpointApplicationSettings, + Tags: map[string]string{"service": "mobiletargeting", "action": "GetApplicationSettings"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(pinpointv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -129,6 +137,9 @@ func listPinpointApps(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrat // API doesn't support aws-g0-sdk-v2 paginator as of date for { + // apply rate limiting + d.WaitForListRateLimit(ctx) + apps, err := svc.GetApps(ctx, input) if err != nil { plugin.Logger(ctx).Error("aws_pinpoint_app.listPinpointApps", "api_error", err) diff --git a/aws/table_aws_pipes_pipe.go b/aws/table_aws_pipes_pipe.go index fbe7943f5..8b7caad57 100644 --- a/aws/table_aws_pipes_pipe.go +++ b/aws/table_aws_pipes_pipe.go @@ -24,9 +24,11 @@ func tableAwsPipes(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFoundException"}), }, Hydrate: getAwsPipe, + Tags: map[string]string{"service": "pipes", "action": "DescribePipe"}, }, List: &plugin.ListConfig{ Hydrate: listAwsPipes, + Tags: map[string]string{"service": "pipes", "action": "ListPipes"}, KeyColumns: []*plugin.KeyColumn{ {Name: "current_state", Require: plugin.Optional}, {Name: "desired_state", Require: plugin.Optional}, @@ -34,6 +36,12 @@ func tableAwsPipes(_ context.Context) *plugin.Table { {Name: "target_prefix", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsPipe, + Tags: map[string]string{"service": "pipes", "action": "DescribePipe"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(pipesv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -191,6 +199,9 @@ func listAwsPipes(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateDat // API doesn't support aws-go-sdk-v2 paginator as of date for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := svc.ListPipes(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_pipes_pipe.listAwsPipes", "api_error", err) diff --git a/aws/table_aws_pricing_product.go b/aws/table_aws_pricing_product.go index 672c515e4..a430ccf78 100644 --- a/aws/table_aws_pricing_product.go +++ b/aws/table_aws_pricing_product.go @@ -22,6 +22,7 @@ func tableAwsPricingProduct(_ context.Context) *plugin.Table { Description: "AWS Pricing Product", List: &plugin.ListConfig{ Hydrate: listPricingProduct, + Tags: map[string]string{"service": "pricing", "action": "GetProducts"}, KeyColumns: []*plugin.KeyColumn{ {Name: "service_code", Require: plugin.Required}, {Name: "filters", Require: plugin.Optional, CacheMatch: "exact"}, @@ -160,6 +161,9 @@ func listPricingProduct(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydr }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_pricing_product.listPricingProduct", "api_error", err) diff --git a/aws/table_aws_pricing_service_attribute.go b/aws/table_aws_pricing_service_attribute.go index 47137252c..26f42070f 100644 --- a/aws/table_aws_pricing_service_attribute.go +++ b/aws/table_aws_pricing_service_attribute.go @@ -19,10 +19,17 @@ func tableAwsPricingServiceAttribute(_ context.Context) *plugin.Table { Description: "AWS Pricing Service Attribute", List: &plugin.ListConfig{ Hydrate: listPricingServiceAttributes, + Tags: map[string]string{"service": "pricing", "action": "DescribeServices"}, KeyColumns: []*plugin.KeyColumn{ {Name: "service_code", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: listAttributeValues, + Tags: map[string]string{"service": "pricing", "action": "GetAttributeValues"}, + }, + }, Columns: awsAccountColumns([]*plugin.Column{ { Name: "service_code", @@ -90,6 +97,9 @@ func listPricingServiceAttributes(ctx context.Context, d *plugin.QueryData, _ *p // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_pricing_service_attribute.listPricingServiceAttributes", "api_error", err) @@ -153,6 +163,9 @@ func listAttributeValues(ctx context.Context, d *plugin.QueryData, h *plugin.Hyd // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_pricing_service_attribute.listAttributeValues", "api_error", err) diff --git a/aws/table_aws_ram_principal_association.go b/aws/table_aws_ram_principal_association.go index ad8029f7e..cbbe4e27b 100644 --- a/aws/table_aws_ram_principal_association.go +++ b/aws/table_aws_ram_principal_association.go @@ -17,6 +17,13 @@ func tableAwsRAMPrincipalAssociation(_ context.Context) *plugin.Table { Description: "AWS RAM Principal Association", List: &plugin.ListConfig{ Hydrate: listResourceShareAssociations(associationType), + Tags: map[string]string{"service": "ram", "action": "GetResourceShareAssociations"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getResourceSharePermissions, + Tags: map[string]string{"service": "ram", "action": "ListResourceSharePermissions"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(ramv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ diff --git a/aws/table_aws_ram_resource_association.go b/aws/table_aws_ram_resource_association.go index d8c31989d..8cdb41fb1 100644 --- a/aws/table_aws_ram_resource_association.go +++ b/aws/table_aws_ram_resource_association.go @@ -21,6 +21,13 @@ func tableAwsRAMResourceAssociation(_ context.Context) *plugin.Table { Description: "AWS RAM Resource Association", List: &plugin.ListConfig{ Hydrate: listResourceShareAssociations(associationType), + Tags: map[string]string{"service": "ram", "action": "GetResourceShareAssociations"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getResourceSharePermissions, + Tags: map[string]string{"service": "ram", "action": "ListResourceSharePermissions"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(ramv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -130,6 +137,9 @@ func listResourceShareAssociations(associationType string) func(ctx context.Cont // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ram_resource_association.listResourceShareAssociations", "api_error", err) @@ -175,6 +185,9 @@ func getResourceSharePermissions(ctx context.Context, d *plugin.QueryData, h *pl // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ram_resource_association.getResourceSharePermissions", "api_error", err) diff --git a/aws/table_aws_rds_db_cluster.go b/aws/table_aws_rds_db_cluster.go index 338c4edd1..3cec27f6c 100644 --- a/aws/table_aws_rds_db_cluster.go +++ b/aws/table_aws_rds_db_cluster.go @@ -26,14 +26,22 @@ func tableAwsRDSDBCluster(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"DBClusterNotFoundFault"}), }, Hydrate: getRDSDBCluster, + Tags: map[string]string{"service": "rds", "action": "DescribeDBClusters"}, }, List: &plugin.ListConfig{ Hydrate: listRDSDBClusters, + Tags: map[string]string{"service": "rds", "action": "DescribeDBClusters"}, KeyColumns: []*plugin.KeyColumn{ {Name: "clone_group_id", Require: plugin.Optional}, {Name: "engine", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getRDSDBClusterPendingMaintenanceAction, + Tags: map[string]string{"service": "rds", "action": "DescribePendingMaintenanceActions"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(rdsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -385,6 +393,9 @@ func listRDSDBClusters(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydra // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_rds_db_cluster.listRDSDBClusters", "api_error", err) diff --git a/aws/table_aws_rds_db_cluster_parameter_group.go b/aws/table_aws_rds_db_cluster_parameter_group.go index 8690d3cc1..1adea8d9e 100644 --- a/aws/table_aws_rds_db_cluster_parameter_group.go +++ b/aws/table_aws_rds_db_cluster_parameter_group.go @@ -26,9 +26,21 @@ func tableAwsRDSDBClusterParameterGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"DBParameterGroupNotFound"}), }, Hydrate: getRDSDBClusterParameterGroup, + Tags: map[string]string{"service": "rds", "action": "DescribeDBClusterParameterGroups"}, }, List: &plugin.ListConfig{ Hydrate: listRDSDBClusterParameterGroups, + Tags: map[string]string{"service": "rds", "action": "DescribeDBClusterParameterGroups"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsRDSClusterParameterGroupParameters, + Tags: map[string]string{"service": "rds", "action": "DescribeDBClusterParameters"}, + }, + { + Func: getAwsRDSClusterParameterGroupTags, + Tags: map[string]string{"service": "rds", "action": "ListTagsForResource"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(rdsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -129,6 +141,9 @@ func listRDSDBClusterParameterGroups(ctx context.Context, d *plugin.QueryData, _ // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_rds_db_cluster_parameter_group.listRDSDBClusterParameterGroups", "api_error", err) @@ -200,6 +215,9 @@ func getAwsRDSClusterParameterGroupParameters(ctx context.Context, d *plugin.Que // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_rds_db_cluster_parameter_group.getAwsRDSClusterParameterGroupParameters", "api_error", err) diff --git a/aws/table_aws_rds_db_cluster_snapshot.go b/aws/table_aws_rds_db_cluster_snapshot.go index 5e7eb8358..472a4c501 100644 --- a/aws/table_aws_rds_db_cluster_snapshot.go +++ b/aws/table_aws_rds_db_cluster_snapshot.go @@ -26,9 +26,11 @@ func tableAwsRDSDBClusterSnapshot(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"DBSnapshotNotFound", "DBClusterSnapshotNotFoundFault"}), }, Hydrate: getRDSDBClusterSnapshot, + Tags: map[string]string{"service": "rds", "action": "DescribeDBClusterSnapshots"}, }, List: &plugin.ListConfig{ Hydrate: listRDSDBClusterSnapshots, + Tags: map[string]string{"service": "rds", "action": "DescribeDBClusterSnapshots"}, KeyColumns: []*plugin.KeyColumn{ {Name: "db_cluster_identifier", Require: plugin.Optional}, {Name: "db_cluster_snapshot_identifier", Require: plugin.Optional}, @@ -36,6 +38,12 @@ func tableAwsRDSDBClusterSnapshot(_ context.Context) *plugin.Table { {Name: "type", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsRDSDBClusterSnapshotAttributes, + Tags: map[string]string{"service": "rds", "action": "DescribeDBClusterSnapshotAttributes"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(rdsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -227,6 +235,9 @@ func listRDSDBClusterSnapshots(ctx context.Context, d *plugin.QueryData, _ *plug // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_rds_db_cluster_snapshot.listRDSDBClusterSnapshots", "api_error", err) diff --git a/aws/table_aws_rds_db_event_subscription.go b/aws/table_aws_rds_db_event_subscription.go index 97ef09a95..886643299 100644 --- a/aws/table_aws_rds_db_event_subscription.go +++ b/aws/table_aws_rds_db_event_subscription.go @@ -27,9 +27,11 @@ func tableAwsRDSDBEventSubscription(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"SubscriptionNotFound"}), }, Hydrate: getRDSDBEventSubscription, + Tags: map[string]string{"service": "rds", "action": "DescribeEventSubscriptions"}, }, List: &plugin.ListConfig{ Hydrate: listRDSDBEventSubscriptions, + Tags: map[string]string{"service": "rds", "action": "DescribeEventSubscriptions"}, }, GetMatrixItemFunc: SupportedRegionMatrix(rdsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -137,6 +139,9 @@ func listRDSDBEventSubscriptions(ctx context.Context, d *plugin.QueryData, _ *pl // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_rds_db_event_subscription.listRDSDBEventSubscriptions", "api_error", err) diff --git a/aws/table_aws_rds_db_instance.go b/aws/table_aws_rds_db_instance.go index 4d051d415..f0a6ab82b 100644 --- a/aws/table_aws_rds_db_instance.go +++ b/aws/table_aws_rds_db_instance.go @@ -26,15 +26,27 @@ func tableAwsRDSDBInstance(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"DBInstanceNotFound"}), }, Hydrate: getRDSDBInstance, + Tags: map[string]string{"service": "rds", "action": "DescribeDBInstances"}, }, List: &plugin.ListConfig{ Hydrate: listRDSDBInstances, + Tags: map[string]string{"service": "rds", "action": "DescribeDBInstances"}, KeyColumns: []*plugin.KeyColumn{ {Name: "db_cluster_identifier", Require: plugin.Optional}, {Name: "resource_id", Require: plugin.Optional}, {Name: "engine", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getRDSDBInstancePendingMaintenanceAction, + Tags: map[string]string{"service": "rds", "action": "DescribePendingMaintenanceActions"}, + }, + { + Func: getRDSDBInstanceCertificate, + Tags: map[string]string{"service": "rds", "action": "DescribeCertificates"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(rdsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -480,6 +492,9 @@ func listRDSDBInstances(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydr // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_rds_db_instance.listRDSDBInstances", "api_error", err) diff --git a/aws/table_aws_rds_db_instance_automated_backup.go b/aws/table_aws_rds_db_instance_automated_backup.go index 3d2e97f86..2e4addd38 100644 --- a/aws/table_aws_rds_db_instance_automated_backup.go +++ b/aws/table_aws_rds_db_instance_automated_backup.go @@ -26,9 +26,11 @@ func tableAwsRDSDBInstanceAutomatedBackup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"DBInstanceAutomatedBackupNotFound"}), }, Hydrate: getRDSDBInstanceAutomatedBackup, + Tags: map[string]string{"service": "rds", "action": "DescribeDBInstanceAutomatedBackups"}, }, List: &plugin.ListConfig{ Hydrate: listRDSDBInstanceAutomatedBackups, + Tags: map[string]string{"service": "rds", "action": "DescribeDBInstanceAutomatedBackups"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValue"}), }, @@ -238,6 +240,9 @@ func listRDSDBInstanceAutomatedBackups(ctx context.Context, d *plugin.QueryData, // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_rds_db_instance_automated_backup.listRDSDBInstanceAutomatedBackups", "api_error", err) diff --git a/aws/table_aws_rds_db_instance_metric_connections.go b/aws/table_aws_rds_db_instance_metric_connections.go index 44d8a31c8..8240e1dc7 100644 --- a/aws/table_aws_rds_db_instance_metric_connections.go +++ b/aws/table_aws_rds_db_instance_metric_connections.go @@ -18,6 +18,7 @@ func tableAwsRdsInstanceMetricConnections(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listRDSDBInstances, Hydrate: listRdsInstanceMetricConnections, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_rds_db_instance_metric_connections_daily.go b/aws/table_aws_rds_db_instance_metric_connections_daily.go index ba09c8fd1..dfe3518b6 100644 --- a/aws/table_aws_rds_db_instance_metric_connections_daily.go +++ b/aws/table_aws_rds_db_instance_metric_connections_daily.go @@ -18,6 +18,7 @@ func tableAwsRdsInstanceMetricConnectionsDaily(_ context.Context) *plugin.Table List: &plugin.ListConfig{ ParentHydrate: listRDSDBInstances, Hydrate: listRdsInstanceMetricConnectionsDaily, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_rds_db_instance_metric_connections_hourly.go b/aws/table_aws_rds_db_instance_metric_connections_hourly.go index 86766ce4f..f9acc404b 100644 --- a/aws/table_aws_rds_db_instance_metric_connections_hourly.go +++ b/aws/table_aws_rds_db_instance_metric_connections_hourly.go @@ -18,6 +18,7 @@ func tableAwsRdsInstanceMetricConnectionsHourly(_ context.Context) *plugin.Table List: &plugin.ListConfig{ ParentHydrate: listRDSDBInstances, Hydrate: listRdsInstanceMetricConnectionsHourly, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_rds_db_instance_metric_cpu_utilization.go b/aws/table_aws_rds_db_instance_metric_cpu_utilization.go index aad4280c1..b25e47d7c 100644 --- a/aws/table_aws_rds_db_instance_metric_cpu_utilization.go +++ b/aws/table_aws_rds_db_instance_metric_cpu_utilization.go @@ -18,6 +18,7 @@ func tableAwsRdsInstanceMetricCpuUtilization(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listRDSDBInstances, Hydrate: listRdsInstanceMetricCpuUtilization, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_rds_db_instance_metric_cpu_utilization_daily.go b/aws/table_aws_rds_db_instance_metric_cpu_utilization_daily.go index 70bd45581..382968b80 100644 --- a/aws/table_aws_rds_db_instance_metric_cpu_utilization_daily.go +++ b/aws/table_aws_rds_db_instance_metric_cpu_utilization_daily.go @@ -18,6 +18,7 @@ func tableAwsRdsInstanceMetricCpuUtilizationDaily(_ context.Context) *plugin.Tab List: &plugin.ListConfig{ ParentHydrate: listRDSDBInstances, Hydrate: listRdsInstanceMetricCpuUtilizationDaily, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_rds_db_instance_metric_cpu_utilization_hourly.go b/aws/table_aws_rds_db_instance_metric_cpu_utilization_hourly.go index 89149de5d..77b5a08f3 100644 --- a/aws/table_aws_rds_db_instance_metric_cpu_utilization_hourly.go +++ b/aws/table_aws_rds_db_instance_metric_cpu_utilization_hourly.go @@ -18,6 +18,7 @@ func tableAwsRdsInstanceMetricCpuUtilizationHourly(_ context.Context) *plugin.Ta List: &plugin.ListConfig{ ParentHydrate: listRDSDBInstances, Hydrate: listRdsInstanceMetricCpuUtilizationHourly, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_rds_db_instance_metric_read_iops.go b/aws/table_aws_rds_db_instance_metric_read_iops.go index 745669b7a..b1923eb04 100644 --- a/aws/table_aws_rds_db_instance_metric_read_iops.go +++ b/aws/table_aws_rds_db_instance_metric_read_iops.go @@ -18,6 +18,7 @@ func tableAwsRdsInstanceMetricReadIops(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listRDSDBInstances, Hydrate: listRdsInstanceMetricReadIops, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_rds_db_instance_metric_read_iops_daily.go b/aws/table_aws_rds_db_instance_metric_read_iops_daily.go index 491f47b75..afa715b0c 100644 --- a/aws/table_aws_rds_db_instance_metric_read_iops_daily.go +++ b/aws/table_aws_rds_db_instance_metric_read_iops_daily.go @@ -18,6 +18,7 @@ func tableAwsRdsInstanceMetricReadIopsDaily(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listRDSDBInstances, Hydrate: listRdsInstanceMetricReadIopsDaily, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_rds_db_instance_metric_read_iops_hourly.go b/aws/table_aws_rds_db_instance_metric_read_iops_hourly.go index 0b433bb3c..56855444f 100644 --- a/aws/table_aws_rds_db_instance_metric_read_iops_hourly.go +++ b/aws/table_aws_rds_db_instance_metric_read_iops_hourly.go @@ -18,6 +18,7 @@ func tableAwsRdsInstanceMetricReadIopsHourly(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listRDSDBInstances, Hydrate: listRdsInstanceMetricReadIopsHourly, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_rds_db_instance_metric_write_iops.go b/aws/table_aws_rds_db_instance_metric_write_iops.go index a5b5cc32e..d0df606ac 100644 --- a/aws/table_aws_rds_db_instance_metric_write_iops.go +++ b/aws/table_aws_rds_db_instance_metric_write_iops.go @@ -18,6 +18,7 @@ func tableAwsRdsInstanceMetricWriteIops(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listRDSDBInstances, Hydrate: listRdsInstanceMetricWriteIops, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_rds_db_instance_metric_write_iops_daily.go b/aws/table_aws_rds_db_instance_metric_write_iops_daily.go index aa3fb2a08..f26df35f0 100644 --- a/aws/table_aws_rds_db_instance_metric_write_iops_daily.go +++ b/aws/table_aws_rds_db_instance_metric_write_iops_daily.go @@ -18,6 +18,7 @@ func tableAwsRdsInstanceMetricWriteIopsDaily(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listRDSDBInstances, Hydrate: listRdsInstanceMetricWriteIopsDaily, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_rds_db_instance_metric_write_iops_hourly.go b/aws/table_aws_rds_db_instance_metric_write_iops_hourly.go index e8dce3684..68af18ec6 100644 --- a/aws/table_aws_rds_db_instance_metric_write_iops_hourly.go +++ b/aws/table_aws_rds_db_instance_metric_write_iops_hourly.go @@ -18,6 +18,7 @@ func tableAwsRdsInstanceMetricWriteIopsHourly(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listRDSDBInstances, Hydrate: listRdsInstanceMetricWriteIopsHourly, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_rds_db_option_group.go b/aws/table_aws_rds_db_option_group.go index bd0471b9e..0478336e8 100644 --- a/aws/table_aws_rds_db_option_group.go +++ b/aws/table_aws_rds_db_option_group.go @@ -26,14 +26,22 @@ func tableAwsRDSDBOptionGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"OptionGroupNotFoundFault"}), }, Hydrate: getRDSDBOptionGroup, + Tags: map[string]string{"service": "rds", "action": "DescribeOptionGroups"}, }, List: &plugin.ListConfig{ Hydrate: listRDSDBOptionGroups, + Tags: map[string]string{"service": "rds", "action": "DescribeOptionGroups"}, KeyColumns: []*plugin.KeyColumn{ {Name: "engine_name", Require: plugin.Optional}, {Name: "major_engine_version", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsRDSOptionGroupTags, + Tags: map[string]string{"service": "rds", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(rdsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -156,6 +164,9 @@ func listRDSDBOptionGroups(ctx context.Context, d *plugin.QueryData, _ *plugin.H // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { logger.Error("aws_rds_db_option_group.listRDSDBOptionGroups", "api_error", err) diff --git a/aws/table_aws_rds_db_parameter_group.go b/aws/table_aws_rds_db_parameter_group.go index da9842d5b..740b4a635 100644 --- a/aws/table_aws_rds_db_parameter_group.go +++ b/aws/table_aws_rds_db_parameter_group.go @@ -26,9 +26,21 @@ func tableAwsRDSDBParameterGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"DBParameterGroupNotFound"}), }, Hydrate: getRDSDBParameterGroup, + Tags: map[string]string{"service": "rds", "action": "DescribeDBParameterGroups"}, }, List: &plugin.ListConfig{ Hydrate: listRDSDBParameterGroups, + Tags: map[string]string{"service": "rds", "action": "DescribeDBParameterGroups"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getRDSParameterGroupParameters, + Tags: map[string]string{"service": "rds", "action": "DescribeDBParameters"}, + }, + { + Func: getRDSParameterGroupTags, + Tags: map[string]string{"service": "rds", "action": "ListTagsForResource"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(rdsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -129,6 +141,9 @@ func listRDSDBParameterGroups(ctx context.Context, d *plugin.QueryData, _ *plugi // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_rds_db_parameter_group.listRDSDBParameterGroups", "api_error", err) @@ -198,6 +213,9 @@ func getRDSParameterGroupParameters(ctx context.Context, d *plugin.QueryData, h }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_rds_db_parameter_group.getRDSParameterGroupParameters", "api_error", err) diff --git a/aws/table_aws_rds_db_proxy.go b/aws/table_aws_rds_db_proxy.go index b17ebd239..12b066f82 100644 --- a/aws/table_aws_rds_db_proxy.go +++ b/aws/table_aws_rds_db_proxy.go @@ -26,13 +26,21 @@ func tableAwsRDSDBProxy(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"DBProxyNotFoundFault"}), }, Hydrate: getRDSDBProxy, + Tags: map[string]string{"service": "rds", "action": "DescribeDBProxies"}, }, List: &plugin.ListConfig{ Hydrate: listRDSDBProxies, + Tags: map[string]string{"service": "rds", "action": "DescribeDBProxies"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidAction"}), }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getRDSDBProxyTags, + Tags: map[string]string{"service": "rds", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(rdsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -175,6 +183,9 @@ func listRDSDBProxies(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrat // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_rds_db_proxy.listRDSDBProxies", "api_error", err) diff --git a/aws/table_aws_rds_db_snapshot.go b/aws/table_aws_rds_db_snapshot.go index 2bb29a324..c88296407 100644 --- a/aws/table_aws_rds_db_snapshot.go +++ b/aws/table_aws_rds_db_snapshot.go @@ -26,9 +26,11 @@ func tableAwsRDSDBSnapshot(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"DBSnapshotNotFound"}), }, Hydrate: getRDSDBSnapshot, + Tags: map[string]string{"service": "rds", "action": "DescribeDBSnapshots"}, }, List: &plugin.ListConfig{ Hydrate: listRDSDBSnapshots, + Tags: map[string]string{"service": "rds", "action": "DescribeDBSnapshots"}, KeyColumns: []*plugin.KeyColumn{ {Name: "db_instance_identifier", Require: plugin.Optional}, {Name: "dbi_resource_id", Require: plugin.Optional}, @@ -36,6 +38,12 @@ func tableAwsRDSDBSnapshot(_ context.Context) *plugin.Table { {Name: "type", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsRDSDBSnapshotAttributes, + Tags: map[string]string{"service": "rds", "action": "DescribeDBSnapshotAttributes"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(rdsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -262,6 +270,9 @@ func listRDSDBSnapshots(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydr // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_rds_db_snapshot.listRDSDBSnapshots", "api_error", err) diff --git a/aws/table_aws_rds_db_subnet_group.go b/aws/table_aws_rds_db_subnet_group.go index 95cf36fbe..8b6e57703 100644 --- a/aws/table_aws_rds_db_subnet_group.go +++ b/aws/table_aws_rds_db_subnet_group.go @@ -26,9 +26,17 @@ func tableAwsRDSDBSubnetGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"DBSubnetGroupNotFoundFault"}), }, Hydrate: getRDSDBSubnetGroup, + Tags: map[string]string{"service": "rds", "action": "DescribeDBSubnetGroups"}, }, List: &plugin.ListConfig{ Hydrate: listRDSDBSubnetGroups, + Tags: map[string]string{"service": "rds", "action": "DescribeDBSubnetGroups"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getRDSDBSubnetGroupTags, + Tags: map[string]string{"service": "rds", "action": "ListTagsForResource"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(rdsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -133,6 +141,9 @@ func listRDSDBSubnetGroups(ctx context.Context, d *plugin.QueryData, _ *plugin.H // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_rds_db_subnet_group.listRDSDBSubnetGroups", "api_error", err) diff --git a/aws/table_aws_rds_reserved_db_instance.go b/aws/table_aws_rds_reserved_db_instance.go index 2a182280d..63d42ee18 100644 --- a/aws/table_aws_rds_reserved_db_instance.go +++ b/aws/table_aws_rds_reserved_db_instance.go @@ -26,9 +26,11 @@ func tableAwsRDSReservedDBInstance(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ReservedDBInstanceNotFound"}), }, Hydrate: getRDSReservedDBInstance, + Tags: map[string]string{"service": "rds", "action": "DescribeReservedDBInstances"}, }, List: &plugin.ListConfig{ Hydrate: listRDSReservedDBInstances, + Tags: map[string]string{"service": "rds", "action": "DescribeReservedDBInstances"}, KeyColumns: []*plugin.KeyColumn{ {Name: "class", Require: plugin.Optional}, {Name: "duration", Require: plugin.Optional}, @@ -210,6 +212,9 @@ func listRDSReservedDBInstances(ctx context.Context, d *plugin.QueryData, _ *plu // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_rds_reserved_db_instance.listRDSReservedDBInstances", "api_error", err) diff --git a/aws/table_aws_redshift_cluster.go b/aws/table_aws_redshift_cluster.go index 686c9d073..2337009bb 100644 --- a/aws/table_aws_redshift_cluster.go +++ b/aws/table_aws_redshift_cluster.go @@ -26,9 +26,21 @@ func tableAwsRedshiftCluster(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ClusterNotFound"}), }, Hydrate: getRedshiftCluster, + Tags: map[string]string{"service": "redshift", "action": "DescribeClusters"}, }, List: &plugin.ListConfig{ Hydrate: listRedshiftClusters, + Tags: map[string]string{"service": "redshift", "action": "DescribeClusters"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getRedshiftLoggingDetails, + Tags: map[string]string{"service": "redshift", "action": "DescribeLoggingStatus"}, + }, + { + Func: getClusterScheduledActions, + Tags: map[string]string{"service": "redshift", "action": "DescribeScheduledActions"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(redshiftv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -357,6 +369,9 @@ func listRedshiftClusters(ctx context.Context, d *plugin.QueryData, _ *plugin.Hy }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_redshift_cluster.listRedshiftClusters", "api_error", err) diff --git a/aws/table_aws_redshift_cluster_metric_cpu_utilization_daily.go b/aws/table_aws_redshift_cluster_metric_cpu_utilization_daily.go index 54d00b27f..0c69fd280 100644 --- a/aws/table_aws_redshift_cluster_metric_cpu_utilization_daily.go +++ b/aws/table_aws_redshift_cluster_metric_cpu_utilization_daily.go @@ -18,6 +18,7 @@ func tableAwsRedshiftClusterMetricCpuUtilizationDaily(_ context.Context) *plugin List: &plugin.ListConfig{ ParentHydrate: listRedshiftClusters, Hydrate: listRedshiftClusterMetricCpuUtilizationDaily, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_redshift_event_subscription.go b/aws/table_aws_redshift_event_subscription.go index 788be7a36..3bb80ecb7 100644 --- a/aws/table_aws_redshift_event_subscription.go +++ b/aws/table_aws_redshift_event_subscription.go @@ -25,9 +25,11 @@ func tableAwsRedshiftEventSubscription(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"SubscriptionNotFound"}), }, Hydrate: getRedshiftEventSubscription, + Tags: map[string]string{"service": "redshift", "action": "DescribeEventSubscriptions"}, }, List: &plugin.ListConfig{ Hydrate: listRedshiftEventSubscriptions, + Tags: map[string]string{"service": "redshift", "action": "DescribeEventSubscriptions"}, }, GetMatrixItemFunc: SupportedRegionMatrix(redshiftv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -144,6 +146,9 @@ func listRedshiftEventSubscriptions(ctx context.Context, d *plugin.QueryData, _ }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_redshift_event_subscription.listRedshiftEventSubscriptions", "api_error", err) diff --git a/aws/table_aws_redshift_parameter_group.go b/aws/table_aws_redshift_parameter_group.go index f08347136..f784d8898 100644 --- a/aws/table_aws_redshift_parameter_group.go +++ b/aws/table_aws_redshift_parameter_group.go @@ -25,9 +25,17 @@ func tableAwsRedshiftParameterGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ClusterParameterGroupNotFound"}), }, Hydrate: getRedshiftParameterGroup, + Tags: map[string]string{"service": "redshift", "action": "DescribeClusterParameterGroups"}, }, List: &plugin.ListConfig{ Hydrate: listRedshiftParameterGroups, + Tags: map[string]string{"service": "redshift", "action": "DescribeClusterParameterGroups"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getRedshiftParameters, + Tags: map[string]string{"service": "redshift", "action": "DescribeClusterParameters"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(redshiftv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -118,6 +126,9 @@ func listRedshiftParameterGroups(ctx context.Context, d *plugin.QueryData, _ *pl }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_redshift_parameter_group.listRedshiftParameterGroups", "api_error", err) diff --git a/aws/table_aws_redshift_snapshot.go b/aws/table_aws_redshift_snapshot.go index ddd2dfeae..d6892fafd 100644 --- a/aws/table_aws_redshift_snapshot.go +++ b/aws/table_aws_redshift_snapshot.go @@ -26,9 +26,11 @@ func tableAwsRedshiftSnapshot(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ClusterSnapshotNotFound"}), }, Hydrate: getRedshiftSnapshot, + Tags: map[string]string{"service": "redshift", "action": "DescribeClusterSnapshots"}, }, List: &plugin.ListConfig{ Hydrate: listRedshiftSnapshots, + Tags: map[string]string{"service": "redshift", "action": "DescribeClusterSnapshots"}, KeyColumns: []*plugin.KeyColumn{ {Name: "cluster_identifier", Require: plugin.Optional}, {Name: "owner_account", Require: plugin.Optional}, @@ -285,6 +287,9 @@ func listRedshiftSnapshots(ctx context.Context, d *plugin.QueryData, _ *plugin.H }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_redshift_snapshot.listRedshiftSnapshots", "api_error", err) diff --git a/aws/table_aws_redshift_subnet_group.go b/aws/table_aws_redshift_subnet_group.go index 799bc9543..535be1018 100644 --- a/aws/table_aws_redshift_subnet_group.go +++ b/aws/table_aws_redshift_subnet_group.go @@ -26,9 +26,11 @@ func tableAwsRedshiftSubnetGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ClusterSubnetGroupNotFoundFault"}), }, Hydrate: getRedshiftSubnetGroup, + Tags: map[string]string{"service": "redshift", "action": "DescribeClusterSubnetGroups"}, }, List: &plugin.ListConfig{ Hydrate: listRedshiftSubnetGroups, + Tags: map[string]string{"service": "redshift", "action": "DescribeClusterSubnetGroups"}, }, GetMatrixItemFunc: SupportedRegionMatrix(redshiftv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -121,6 +123,9 @@ func listRedshiftSubnetGroups(ctx context.Context, d *plugin.QueryData, _ *plugi }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_redshift_subnet_group.listRedshiftSubnetGroups", "api_error", err) diff --git a/aws/table_aws_redshiftserverless_namespace.go b/aws/table_aws_redshiftserverless_namespace.go index 6cab3f393..2607f1a32 100644 --- a/aws/table_aws_redshiftserverless_namespace.go +++ b/aws/table_aws_redshiftserverless_namespace.go @@ -23,9 +23,17 @@ func tableAwsRedshiftServerlessNamespace(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("namespace_name"), Hydrate: getRedshiftServerlessNamespace, + Tags: map[string]string{"service": "redshift-serverless", "action": "GetNamespace"}, }, List: &plugin.ListConfig{ Hydrate: listRedshiftServerlessNamespaces, + Tags: map[string]string{"service": "redshift-serverless", "action": "ListNamespaces"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getNamespaceTags, + Tags: map[string]string{"service": "redshift-serverless", "action": "ListTagsForResource"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(redshiftserverlessv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -155,6 +163,9 @@ func listRedshiftServerlessNamespaces(ctx context.Context, d *plugin.QueryData, }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_redshiftserverless_namespace.listRedshiftServerlessNamespaces", "api_error", err) diff --git a/aws/table_aws_redshiftserverless_workgroup.go b/aws/table_aws_redshiftserverless_workgroup.go index 9127a5ad5..4ffcb9e23 100644 --- a/aws/table_aws_redshiftserverless_workgroup.go +++ b/aws/table_aws_redshiftserverless_workgroup.go @@ -26,9 +26,17 @@ func tableAwsRedshiftServerlessWorkgroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, Hydrate: getRedshiftServerlessWorkgroup, + Tags: map[string]string{"service": "redshift-serverless", "action": "GetWorkgroup"}, }, List: &plugin.ListConfig{ Hydrate: listRedshiftServerlessWorkgroups, + Tags: map[string]string{"service": "redshift-serverless", "action": "ListWorkgroups"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getWorkgroupTags, + Tags: map[string]string{"service": "redshift-serverless", "action": "ListTagsForResource"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(redshiftserverlessv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -168,6 +176,9 @@ func listRedshiftServerlessWorkgroups(ctx context.Context, d *plugin.QueryData, }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_redshiftserverless_workgroup.listRedshiftServerlessWorkgroups", "api_error", err) diff --git a/aws/table_aws_region.go b/aws/table_aws_region.go index 39d44a741..7f2ced511 100644 --- a/aws/table_aws_region.go +++ b/aws/table_aws_region.go @@ -15,6 +15,7 @@ func tableAwsRegion(_ context.Context) *plugin.Table { Description: "AWS Region", List: &plugin.ListConfig{ Hydrate: listAwsRegions, + Tags: map[string]string{"service": "ec2", "action": "DescribeRegions"}, }, // Get is not implemented because the API is not paged anyway, so // the List has the same cost but better caching benefit. diff --git a/aws/table_aws_resource_explorer_index.go b/aws/table_aws_resource_explorer_index.go index 8ea0db770..8eef11d81 100644 --- a/aws/table_aws_resource_explorer_index.go +++ b/aws/table_aws_resource_explorer_index.go @@ -18,6 +18,7 @@ func tableAWSResourceExplorerIndex(_ context.Context) *plugin.Table { Description: "AWS Resource Explorer Index", List: &plugin.ListConfig{ Hydrate: listAWSExplorerIndexes, + Tags: map[string]string{"service": "resource-explorer-2", "action": "ListIndexes"}, IgnoreConfig: &plugin.IgnoreConfig{ // ValidationException error thrown for below cases in the table // 1. Type of the index type passed as input is not a valid value @@ -85,6 +86,9 @@ func listAWSExplorerIndexes(ctx context.Context, d *plugin.QueryData, h *plugin. }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_resource_explorer_index.listAWSExplorerIndexes", "api_error", err) diff --git a/aws/table_aws_resource_explorer_search.go b/aws/table_aws_resource_explorer_search.go index efea6adb1..efdf104ec 100644 --- a/aws/table_aws_resource_explorer_search.go +++ b/aws/table_aws_resource_explorer_search.go @@ -22,6 +22,7 @@ func tableAWSResourceExplorerSearch(_ context.Context) *plugin.Table { Description: "AWS Resource Explorer Search", List: &plugin.ListConfig{ Hydrate: awsResourceExplorerSearch, + Tags: map[string]string{"service": "resource-explorer-2", "action": "Search"}, KeyColumns: plugin.KeyColumnSlice{ {Name: "query", Require: plugin.Optional, CacheMatch: "exact"}, {Name: "view_arn", Require: plugin.Optional, CacheMatch: "exact"}, @@ -195,6 +196,9 @@ func awsResourceExplorerSearch(ctx context.Context, d *plugin.QueryData, h *plug }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_resource_explorer_search.awsResourceExplorerSearch", "search_api_error", err) diff --git a/aws/table_aws_resource_explorer_supported_resource_type.go b/aws/table_aws_resource_explorer_supported_resource_type.go index adbd8fde2..2f04a629f 100644 --- a/aws/table_aws_resource_explorer_supported_resource_type.go +++ b/aws/table_aws_resource_explorer_supported_resource_type.go @@ -17,6 +17,7 @@ func tableAWSResourceExplorerSupportedResourceType(_ context.Context) *plugin.Ta Description: "AWS Resource Explorer Supported Resource Type", List: &plugin.ListConfig{ Hydrate: listAWSExplorerSupportedTypes, + Tags: map[string]string{"service": "resource-explorer-2", "action": "ListSupportedResourceTypes"}, }, Columns: awsAccountColumns([]*plugin.Column{ { @@ -59,6 +60,9 @@ func listAWSExplorerSupportedTypes(ctx context.Context, d *plugin.QueryData, h * }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_resource_explorer_supported_resource_type.listAWSExplorerSupportedTypes", "api_error", err) diff --git a/aws/table_aws_route53_domain.go b/aws/table_aws_route53_domain.go index 199fba9b9..ac971565a 100644 --- a/aws/table_aws_route53_domain.go +++ b/aws/table_aws_route53_domain.go @@ -21,9 +21,21 @@ func tableAwsRoute53Domain(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("domain_name"), Hydrate: getRoute53Domain, + Tags: map[string]string{"service": "route53domains", "action": "GetDomainDetail"}, }, List: &plugin.ListConfig{ Hydrate: listRoute53Domains, + Tags: map[string]string{"service": "route53domains", "action": "ListDomains"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getRoute53Domain, + Tags: map[string]string{"service": "route53domains", "action": "GetDomainDetail"}, + }, + { + Func: getRoute53DomainTags, + Tags: map[string]string{"service": "route53domains", "action": "ListTagsForDomain"}, + }, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { @@ -229,6 +241,9 @@ func listRoute53Domains(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydr }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_route53_domain.listRoute53Domains", "api_error", err) diff --git a/aws/table_aws_route53_health_check.go b/aws/table_aws_route53_health_check.go index c9efa13f4..4377cbe5e 100644 --- a/aws/table_aws_route53_health_check.go +++ b/aws/table_aws_route53_health_check.go @@ -20,12 +20,24 @@ func tableAwsRoute53HealthCheck(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("id"), Hydrate: getHealthCheck, + Tags: map[string]string{"service": "route53", "action": "GetHealthCheck"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchHealthCheck"}), }, }, List: &plugin.ListConfig{ Hydrate: listHealthChecks, + Tags: map[string]string{"service": "route53", "action": "ListHealthChecks"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getHealthCheckStatus, + Tags: map[string]string{"service": "route53", "action": "GetHealthCheckStatus"}, + }, + { + Func: getHealthCheckTags, + Tags: map[string]string{"service": "route53", "action": "ListTagsForResource"}, + }, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { @@ -137,6 +149,9 @@ func listHealthChecks(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrat }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_route53_health_check.listHealthChecks", "api_error", err) diff --git a/aws/table_aws_route53_query_log.go b/aws/table_aws_route53_query_log.go index 93a76b385..486e66d5b 100644 --- a/aws/table_aws_route53_query_log.go +++ b/aws/table_aws_route53_query_log.go @@ -20,6 +20,7 @@ func tableAwsRoute53QueryLog(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("id"), Hydrate: getRoute53QueryLog, + Tags: map[string]string{"service": "route53", "action": "GetQueryLoggingConfig"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchQueryLoggingConfig"}), }, @@ -29,6 +30,7 @@ func tableAwsRoute53QueryLog(_ context.Context) *plugin.Table { {Name: "hosted_zone_id", Require: plugin.Optional}, }, Hydrate: listRoute53QueryLogs, + Tags: map[string]string{"service": "route53", "action": "ListQueryLoggingConfigs"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchHostedZone"}), }, @@ -104,6 +106,9 @@ func listRoute53QueryLogs(ctx context.Context, d *plugin.QueryData, _ *plugin.Hy }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_route53_query_log.listRoute53QueryLogs", "api_error", err) diff --git a/aws/table_aws_route53_record.go b/aws/table_aws_route53_record.go index 5a1845748..d75bf185d 100644 --- a/aws/table_aws_route53_record.go +++ b/aws/table_aws_route53_record.go @@ -28,6 +28,7 @@ func tableAwsRoute53Record(_ context.Context) *plugin.Table { }, ParentHydrate: listHostedZones, Hydrate: listRoute53Records, + Tags: map[string]string{"service": "route53", "action": "ListResourceRecordSets"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchHostedZone"}), }, @@ -194,6 +195,9 @@ func listRoute53Records(ctx context.Context, d *plugin.QueryData, h *plugin.Hydr // Paginator is not supported in AWS SDK v2 as of 2022/11/04 // So we use generic pagination handling instead for { + // apply rate limiting + d.WaitForListRateLimit(ctx) + op, err := svc.ListResourceRecordSets(ctx, input) if err != nil { plugin.Logger(ctx).Error("aws_route53_record.listRoute53Records", "api_error", err) diff --git a/aws/table_aws_route53_resolver_endpoint.go b/aws/table_aws_route53_resolver_endpoint.go index 1c514d428..28f986e5b 100644 --- a/aws/table_aws_route53_resolver_endpoint.go +++ b/aws/table_aws_route53_resolver_endpoint.go @@ -28,9 +28,11 @@ func tableAwsRoute53ResolverEndpoint(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, Hydrate: getAwsRoute53ResolverEndpoint, + Tags: map[string]string{"service": "route53resolver", "action": "GetResolverEndpoint"}, }, List: &plugin.ListConfig{ Hydrate: listAwsRoute53ResolverEndpoint, + Tags: map[string]string{"service": "route53resolver", "action": "ListResolverEndpoints"}, KeyColumns: []*plugin.KeyColumn{ {Name: "creator_request_id", Require: plugin.Optional}, {Name: "direction", Require: plugin.Optional}, @@ -40,6 +42,16 @@ func tableAwsRoute53ResolverEndpoint(_ context.Context) *plugin.Table { {Name: "name", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: listResolverEndpointIPAddresses, + Tags: map[string]string{"service": "route53resolver", "action": "ListResolverEndpointIpAddresses"}, + }, + { + Func: getAwsRoute53ResolverEndpointTags, + Tags: map[string]string{"service": "route53resolver", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(route53resolverv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -182,6 +194,9 @@ func listAwsRoute53ResolverEndpoint(ctx context.Context, d *plugin.QueryData, _ }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_route53_resolver_endpoint.listAwsRoute53ResolverEndpoint", "api_error", err) diff --git a/aws/table_aws_route53_resolver_query_log_config.go b/aws/table_aws_route53_resolver_query_log_config.go index d15576cb0..5a32c6edb 100644 --- a/aws/table_aws_route53_resolver_query_log_config.go +++ b/aws/table_aws_route53_resolver_query_log_config.go @@ -22,6 +22,7 @@ func tableAwsRoute53ResolverQueryLogConfig(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("id"), Hydrate: getRoute53ResolverQueryLogConfig, + Tags: map[string]string{"service": "route53resolver", "action": "GetResolverQueryLogConfig"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, @@ -35,6 +36,7 @@ func tableAwsRoute53ResolverQueryLogConfig(_ context.Context) *plugin.Table { {Name: "status", Require: plugin.Optional}, }, Hydrate: listRoute53ResolverQueryLogConfigs, + Tags: map[string]string{"service": "route53resolver", "action": "ListResolverQueryLogConfigs"}, }, Columns: awsRegionalColumns([]*plugin.Column{ { @@ -149,6 +151,9 @@ func listRoute53ResolverQueryLogConfigs(ctx context.Context, d *plugin.QueryData }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_route53_resolver_query_log_config.listRoute53ResolverQueryLogConfigs", "api_error", err) diff --git a/aws/table_aws_route53_resolver_rule.go b/aws/table_aws_route53_resolver_rule.go index b4fc64105..fd67cf140 100644 --- a/aws/table_aws_route53_resolver_rule.go +++ b/aws/table_aws_route53_resolver_rule.go @@ -27,9 +27,11 @@ func tableAwsRoute53ResolverRule(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, Hydrate: getAwsRoute53ResolverRule, + Tags: map[string]string{"service": "route53resolver", "action": "GetResolverRule"}, }, List: &plugin.ListConfig{ Hydrate: listAwsRoute53ResolverRules, + Tags: map[string]string{"service": "route53resolver", "action": "ListResolverRules"}, KeyColumns: []*plugin.KeyColumn{ {Name: "creator_request_id", Require: plugin.Optional}, {Name: "domain_name", Require: plugin.Optional}, @@ -38,6 +40,16 @@ func tableAwsRoute53ResolverRule(_ context.Context) *plugin.Table { {Name: "status", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: listResolverRuleAssociation, + Tags: map[string]string{"service": "route53resolver", "action": "ListResolverRuleAssociations"}, + }, + { + Func: getAwsRoute53ResolverRuleTags, + Tags: map[string]string{"service": "route53resolver", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(route53resolverv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -190,6 +202,9 @@ func listAwsRoute53ResolverRules(ctx context.Context, d *plugin.QueryData, _ *pl }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_route53_resolver_rule.listAwsRoute53ResolverRules", "api_error", err) diff --git a/aws/table_aws_route53_traffic_policy.go b/aws/table_aws_route53_traffic_policy.go index a36e31897..8e6cbfb0f 100644 --- a/aws/table_aws_route53_traffic_policy.go +++ b/aws/table_aws_route53_traffic_policy.go @@ -23,9 +23,17 @@ func tableAwsRoute53TrafficPolicy(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchTrafficPolicy"}), }, Hydrate: getTrafficPolicy, + Tags: map[string]string{"service": "route53", "action": "GetTrafficPolicy"}, }, List: &plugin.ListConfig{ Hydrate: listTrafficPolicies, + Tags: map[string]string{"service": "route53", "action": "ListTrafficPolicies"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getTrafficPolicy, + Tags: map[string]string{"service": "route53", "action": "GetTrafficPolicy"}, + }, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { @@ -109,6 +117,10 @@ func listTrafficPolicies(ctx context.Context, d *plugin.QueryData, _ *plugin.Hyd // List call pagesLeft := true for pagesLeft { + + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.ListTrafficPolicies(ctx, input) if err != nil { plugin.Logger(ctx).Error("aws_route53_traffic_policy.listTrafficPolicies", "api_error", err) @@ -167,6 +179,9 @@ func listTrafficPolicyVersionsAsync(ctx context.Context, d *plugin.QueryData, sv // List call pagesLeft := true for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.ListTrafficPolicyVersions(ctx, input) if err != nil { plugin.Logger(ctx).Error("aws_route53_traffic_policy.listTrafficPolicyVersionsAsync", "ListTrafficPolicyVersions_api_error", err) diff --git a/aws/table_aws_route53_traffic_policy_instance.go b/aws/table_aws_route53_traffic_policy_instance.go index 72eb23019..b0308b6eb 100644 --- a/aws/table_aws_route53_traffic_policy_instance.go +++ b/aws/table_aws_route53_traffic_policy_instance.go @@ -19,12 +19,14 @@ func tableAwsRoute53TrafficPolicyInstance(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.AllColumns([]string{"id"}), Hydrate: getTrafficPolicyInstance, + Tags: map[string]string{"service": "route53", "action": "GetTrafficPolicyInstance"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchTrafficPolicyInstance"}), }, }, List: &plugin.ListConfig{ Hydrate: listTrafficPolicyInstances, + Tags: map[string]string{"service": "route53", "action": "ListTrafficPolicyInstances"}, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { @@ -122,6 +124,9 @@ func listTrafficPolicyInstances(ctx context.Context, d *plugin.QueryData, _ *plu // List call pagesLeft := true for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.ListTrafficPolicyInstances(ctx, input) if err != nil { plugin.Logger(ctx).Error("aws_route53_traffic_policy_instance.listTrafficPolicyInstances", "api_err", err) diff --git a/aws/table_aws_route53_zone.go b/aws/table_aws_route53_zone.go index 03e29cc25..f8a5a140e 100644 --- a/aws/table_aws_route53_zone.go +++ b/aws/table_aws_route53_zone.go @@ -22,12 +22,32 @@ func tableAwsRoute53Zone(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("id"), Hydrate: getHostedZone, + Tags: map[string]string{"service": "route53", "action": "GetHostedZone"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchHostedZone"}), }, }, List: &plugin.ListConfig{ Hydrate: listHostedZones, + Tags: map[string]string{"service": "route53", "action": "ListHostedZones"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getHostedZone, + Tags: map[string]string{"service": "route53", "action": "GetHostedZone"}, + }, + { + Func: getHostedZoneTags, + Tags: map[string]string{"service": "route53", "action": "ListTagsForResource"}, + }, + { + Func: getHostedZoneQueryLoggingConfigs, + Tags: map[string]string{"service": "route53", "action": "ListQueryLoggingConfigs"}, + }, + { + Func: getHostedZoneDNSSEC, + Tags: map[string]string{"service": "route53", "action": "GetDNSSEC"}, + }, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { @@ -176,6 +196,9 @@ func listHostedZones(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrate }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_route53_zone.listHostedZones", "api_error", err) diff --git a/aws/table_aws_s3_access_point.go b/aws/table_aws_s3_access_point.go index 1929a42c8..cb268fa21 100644 --- a/aws/table_aws_s3_access_point.go +++ b/aws/table_aws_s3_access_point.go @@ -25,6 +25,7 @@ func tableAwsS3AccessPoint(_ context.Context) *plugin.Table { Description: "AWS S3 Access Point", List: &plugin.ListConfig{ Hydrate: listS3AccessPoints, + Tags: map[string]string{"service": "s3", "action": "ListAccessPoints"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchAccessPoint", "InvalidParameter", "InvalidRequest"}), }, @@ -35,10 +36,25 @@ func tableAwsS3AccessPoint(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.AllColumns([]string{"name", "region"}), Hydrate: getS3AccessPoint, + Tags: map[string]string{"service": "s3", "action": "GetAccessPoint"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchAccessPoint", "InvalidParameter", "InvalidRequest"}), }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getS3AccessPoint, + Tags: map[string]string{"service": "s3", "action": "GetAccessPoint"}, + }, + { + Func: getS3AccessPointPolicyStatus, + Tags: map[string]string{"service": "s3", "action": "GetAccessPointPolicyStatus"}, + }, + { + Func: getS3AccessPointPolicy, + Tags: map[string]string{"service": "s3", "action": "GetAccessPointPolicy"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(s3controlv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -200,6 +216,9 @@ func listS3AccessPoints(ctx context.Context, d *plugin.QueryData, h *plugin.Hydr }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_s3_access_point.listS3AccessPoints", "api_error", err) diff --git a/aws/table_aws_s3_account_settings.go b/aws/table_aws_s3_account_settings.go index 732403c5e..99f77c38a 100644 --- a/aws/table_aws_s3_account_settings.go +++ b/aws/table_aws_s3_account_settings.go @@ -22,6 +22,12 @@ func tableAwsS3AccountSettings(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ Hydrate: listS3Account, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAccountBucketPublicAccessBlock, + Tags: map[string]string{"service": "s3", "action": "GetAccountPublicAccessBlock"}, + }, + }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { Name: "block_public_acls", diff --git a/aws/table_aws_s3_bucket.go b/aws/table_aws_s3_bucket.go index 16ec9eeca..6f047c065 100644 --- a/aws/table_aws_s3_bucket.go +++ b/aws/table_aws_s3_bucket.go @@ -19,6 +19,7 @@ func tableAwsS3Bucket(_ context.Context) *plugin.Table { Description: "AWS S3 Bucket", List: &plugin.ListConfig{ Hydrate: listS3Buckets, + Tags: map[string]string{"service": "s3", "action": "ListBucket"}, }, // Note: No Get for S3 buckets, since it must list all the buckets // anyway just to get the creation_date which is only available via the @@ -27,58 +28,72 @@ func tableAwsS3Bucket(_ context.Context) *plugin.Table { { Func: getBucketIsPublic, Depends: []plugin.HydrateFunc{getBucketLocation}, + Tags: map[string]string{"service": "s3", "action": "GetBucketPolicyStatus"}, }, { Func: getBucketVersioning, Depends: []plugin.HydrateFunc{getBucketLocation}, + Tags: map[string]string{"service": "s3", "action": "GetBucketVersioning"}, }, { Func: getBucketEncryption, Depends: []plugin.HydrateFunc{getBucketLocation}, + Tags: map[string]string{"service": "s3", "action": "GetBucketEncryption"}, }, { Func: getBucketPublicAccessBlock, Depends: []plugin.HydrateFunc{getBucketLocation}, + Tags: map[string]string{"service": "s3", "action": "GetPublicAccessBlock"}, }, { Func: getBucketACL, Depends: []plugin.HydrateFunc{getBucketLocation}, + Tags: map[string]string{"service": "s3", "action": "GetBucketAcl"}, }, { Func: getBucketLifecycle, Depends: []plugin.HydrateFunc{getBucketLocation}, + Tags: map[string]string{"service": "s3", "action": "GetLifecycleConfiguration"}, }, { Func: getBucketLogging, Depends: []plugin.HydrateFunc{getBucketLocation}, + Tags: map[string]string{"service": "s3", "action": "GetBucketLogging"}, }, { Func: getBucketPolicy, Depends: []plugin.HydrateFunc{getBucketLocation}, + Tags: map[string]string{"service": "s3", "action": "GetBucketPolicy"}, }, { Func: getBucketReplication, Depends: []plugin.HydrateFunc{getBucketLocation}, + Tags: map[string]string{"service": "s3", "action": "GetBucketReplication"}, }, { Func: getBucketTagging, Depends: []plugin.HydrateFunc{getBucketLocation}, + Tags: map[string]string{"service": "s3", "action": "GetBucketTagging"}, }, { Func: getObjectLockConfiguration, Depends: []plugin.HydrateFunc{getBucketLocation}, + Tags: map[string]string{"service": "s3", "action": "GetObjectLockConfiguration"}, }, { Func: getS3BucketEventNotificationConfigurations, Depends: []plugin.HydrateFunc{getBucketLocation}, + Tags: map[string]string{"service": "s3", "action": "GetBucketNotificationConfiguration"}, }, { Func: getS3BucketObjectOwnershipControl, Depends: []plugin.HydrateFunc{getBucketLocation}, + Tags: map[string]string{"service": "s3", "action": "GetBucketOwnershipControls"}, }, { Func: getBucketWebsite, Depends: []plugin.HydrateFunc{getBucketLocation}, + Tags: map[string]string{"service": "s3", "action": "GetBucketWebsite"}, }, }, Columns: awsAccountColumns([]*plugin.Column{ diff --git a/aws/table_aws_s3_bucket_intelligent_tiering_configuration.go b/aws/table_aws_s3_bucket_intelligent_tiering_configuration.go index ede9809af..52e6476e3 100644 --- a/aws/table_aws_s3_bucket_intelligent_tiering_configuration.go +++ b/aws/table_aws_s3_bucket_intelligent_tiering_configuration.go @@ -21,6 +21,7 @@ func tableAwsS3BucketIntelligentTieringConfiguration(_ context.Context) *plugin. Description: "AWS S3 Bucket Intelligent Tiering Configuration", Get: &plugin.GetConfig{ Hydrate: getBucketIntelligentTieringConfiguration, + Tags: map[string]string{"service": "s3", "action": "GetIntelligentTieringConfiguration"}, KeyColumns: plugin.AllColumns([]string{"bucket_name", "id"}), IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchConfiguration"}), @@ -29,6 +30,7 @@ func tableAwsS3BucketIntelligentTieringConfiguration(_ context.Context) *plugin. List: &plugin.ListConfig{ ParentHydrate: listS3Buckets, Hydrate: listBucketIntelligentTieringConfigurations, + Tags: map[string]string{"service": "s3", "action": "ListBucketIntelligentTieringConfigurations"}, KeyColumns: []*plugin.KeyColumn{ {Name: "bucket_name", Require: plugin.Optional, CacheMatch: "exact"}, }, @@ -107,6 +109,9 @@ func listBucketIntelligentTieringConfigurations(ctx context.Context, d *plugin.Q pageLeft := true for pageLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + op, err := svc.ListBucketIntelligentTieringConfigurations(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_s3_bucket_intelligent_tiering_configuration.listBucketIntelligentTieringConfigurations", "api_error", err) diff --git a/aws/table_aws_s3_multi_region_access_point.go b/aws/table_aws_s3_multi_region_access_point.go index 8133e9c50..98d4d0174 100644 --- a/aws/table_aws_s3_multi_region_access_point.go +++ b/aws/table_aws_s3_multi_region_access_point.go @@ -20,6 +20,7 @@ func tableAwsS3MultiRegionAccessPoint(_ context.Context) *plugin.Table { Description: "AWS S3 Multi Region Access Point", List: &plugin.ListConfig{ Hydrate: listS3MultiRegionAccessPoints, + Tags: map[string]string{"service": "s3", "action": "ListMultiRegionAccessPoints"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameter", "InvalidRequest"}), }, @@ -30,6 +31,7 @@ func tableAwsS3MultiRegionAccessPoint(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.AllColumns([]string{"name", "account_id"}), Hydrate: getS3MultiRegionAccessPoint, + Tags: map[string]string{"service": "s3", "action": "GetMultiRegionAccessPoint"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchMultiRegionAccessPoint", "InvalidParameter", "InvalidRequest"}), }, @@ -133,6 +135,9 @@ func listS3MultiRegionAccessPoints(ctx context.Context, d *plugin.QueryData, h * }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_s3_multi_region_access_point.listS3MultiRegionAccessPoints", "api_error", err) diff --git a/aws/table_aws_s3_object.go b/aws/table_aws_s3_object.go index 517497bb7..e95dd8520 100644 --- a/aws/table_aws_s3_object.go +++ b/aws/table_aws_s3_object.go @@ -22,11 +22,34 @@ func tableAwsS3Object(_ context.Context) *plugin.Table { Description: "List AWS S3 Objects in S3 buckets by bucket name.", List: &plugin.ListConfig{ Hydrate: listS3Objects, + Tags: map[string]string{"service": "s3", "action": "ListObjectsV2"}, KeyColumns: []*plugin.KeyColumn{ {Name: "bucket_name", Require: plugin.Required, CacheMatch: "exact"}, {Name: "prefix", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getS3Object, + Tags: map[string]string{"service": "s3", "action": "GetObject"}, + }, + { + Func: getS3ObjectAttributes, + Tags: map[string]string{"service": "s3", "action": "GetObjectAttributes"}, + }, + { + Func: getS3ObjectACL, + Tags: map[string]string{"service": "s3", "action": "GetObjectAcl"}, + }, + { + Func: getS3ObjectTagging, + Tags: map[string]string{"service": "s3", "action": "GetObjectTagging"}, + }, + { + Func: getBucketLocationForObjects, + Tags: map[string]string{"service": "s3", "action": "GetBucketLocation"}, + }, + }, Columns: awsAccountColumns([]*plugin.Column{ { Name: "key", @@ -407,6 +430,9 @@ func listS3Objects(ctx context.Context, d *plugin.QueryData, h *plugin.HydrateDa // execute list call for { + // apply rate limiting + d.WaitForListRateLimit(ctx) + objects, err := svc.ListObjectsV2(ctx, input) if err != nil { plugin.Logger(ctx).Error("aws_s3_object.ListObjectsV2", "api_error", err) diff --git a/aws/table_aws_sagemaker_app.go b/aws/table_aws_sagemaker_app.go index 398c56e1f..8852cdf49 100644 --- a/aws/table_aws_sagemaker_app.go +++ b/aws/table_aws_sagemaker_app.go @@ -28,15 +28,23 @@ func tableAwsSageMakerApp(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationException", "NotFoundException", "ResourceNotFound"}), }, Hydrate: getSageMakerApp, + Tags: map[string]string{"service": "sagemaker", "action": "DescribeApp"}, }, List: &plugin.ListConfig{ ParentHydrate: listAwsSageMakerDomains, Hydrate: listSageMakerApps, + Tags: map[string]string{"service": "sagemaker", "action": "ListApps"}, KeyColumns: []*plugin.KeyColumn{ {Name: "user_profile_name", Require: plugin.Optional}, {Name: "domain_id", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getSageMakerApp, + Tags: map[string]string{"service": "sagemaker", "action": "DescribeApp"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(sagemakerv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -172,6 +180,9 @@ func listSageMakerApps(ctx context.Context, d *plugin.QueryData, h *plugin.Hydra // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_sagemaker_app.listSageMakerApps", "api_error", err) diff --git a/aws/table_aws_sagemaker_domain.go b/aws/table_aws_sagemaker_domain.go index 78e97c1d1..759dba797 100644 --- a/aws/table_aws_sagemaker_domain.go +++ b/aws/table_aws_sagemaker_domain.go @@ -26,9 +26,21 @@ func tableAwsSageMakerDomain(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationException", "NotFoundException", "ResourceNotFound"}), }, Hydrate: getAwsSageMakerDomain, + Tags: map[string]string{"service": "sagemaker", "action": "DescribeDomain"}, }, List: &plugin.ListConfig{ Hydrate: listAwsSageMakerDomains, + Tags: map[string]string{"service": "sagemaker", "action": "ListDomains"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsSageMakerDomain, + Tags: map[string]string{"service": "sagemaker", "action": "DescribeDomain"}, + }, + { + Func: listAwsSageMakerDomainTags, + Tags: map[string]string{"service": "sagemaker", "action": "ListTags"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(sagemakerv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -208,6 +220,9 @@ func listAwsSageMakerDomains(ctx context.Context, d *plugin.QueryData, _ *plugin // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_sagemaker_domain.listAwsSageMakerDomains", "api_error", err) @@ -290,6 +305,9 @@ func listAwsSageMakerDomainTags(ctx context.Context, d *plugin.QueryData, h *plu pagesLeft := true tags := []types.Tag{} for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + keyTags, err := svc.ListTags(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_sagemaker_domain.listAwsSageMakerDomainTags", "api_error", err) diff --git a/aws/table_aws_sagemaker_endpoint_configuration.go b/aws/table_aws_sagemaker_endpoint_configuration.go index 7129dd0be..08791b85c 100644 --- a/aws/table_aws_sagemaker_endpoint_configuration.go +++ b/aws/table_aws_sagemaker_endpoint_configuration.go @@ -26,13 +26,25 @@ func tableAwsSageMakerEndpointConfiguration(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationException", "NotFoundException"}), }, Hydrate: getSagemakerEndpointConfiguration, + Tags: map[string]string{"service": "sagemaker", "action": "DescribeEndpointConfig"}, }, List: &plugin.ListConfig{ Hydrate: listSagemakerEndpointConfigurations, + Tags: map[string]string{"service": "sagemaker", "action": "ListEndpointConfigs"}, KeyColumns: []*plugin.KeyColumn{ {Name: "creation_time", Require: plugin.Optional, Operators: []string{">", ">=", "<", "<="}}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getSagemakerEndpointConfiguration, + Tags: map[string]string{"service": "sagemaker", "action": "DescribeEndpointConfig"}, + }, + { + Func: listSageMakerEndpointConfigurationTags, + Tags: map[string]string{"service": "sagemaker", "action": "ListTags"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(sagemakerv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -152,6 +164,9 @@ func listSagemakerEndpointConfigurations(ctx context.Context, d *plugin.QueryDat // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_sagemaker_endpoint_configuration.listSagemakerEndpointConfigurations", "api_error", err) @@ -230,6 +245,10 @@ func listSageMakerEndpointConfigurationTags(ctx context.Context, d *plugin.Query pagesLeft := true tags := []types.Tag{} for pagesLeft { + + // apply rate limiting + d.WaitForListRateLimit(ctx) + keyTags, err := svc.ListTags(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_sagemaker_endpoint_configuration.listSageMakerEndpointConfigurationTags", "api_error", err) diff --git a/aws/table_aws_sagemaker_model.go b/aws/table_aws_sagemaker_model.go index b4d6b3e9f..eb149a6b2 100644 --- a/aws/table_aws_sagemaker_model.go +++ b/aws/table_aws_sagemaker_model.go @@ -26,13 +26,25 @@ func tableAwsSageMakerModel(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationException", "NotFoundException", "RecordNotFound"}), }, Hydrate: getAwsSageMakerModel, + Tags: map[string]string{"service": "sagemaker", "action": "DescribeModel"}, }, List: &plugin.ListConfig{ Hydrate: listAwsSageMakerModels, + Tags: map[string]string{"service": "sagemaker", "action": "ListModels"}, KeyColumns: []*plugin.KeyColumn{ {Name: "creation_time", Require: plugin.Optional, Operators: []string{">", ">=", "<", "<="}}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsSageMakerModel, + Tags: map[string]string{"service": "sagemaker", "action": "DescribeModel"}, + }, + { + Func: listAwsSageMakerModelTags, + Tags: map[string]string{"service": "sagemaker", "action": "ListTags"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(sagemakerv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -171,6 +183,9 @@ func listAwsSageMakerModels(ctx context.Context, d *plugin.QueryData, _ *plugin. // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_sagemaker_model.listAwsSageMakerModels", "api_error", err) @@ -253,6 +268,9 @@ func listAwsSageMakerModelTags(ctx context.Context, d *plugin.QueryData, h *plug pagesLeft := true tags := []types.Tag{} for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + keyTags, err := svc.ListTags(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_sagemaker_model.listAwsSageMakerModelTags", "api_error", err) diff --git a/aws/table_aws_sagemaker_notebook_instance.go b/aws/table_aws_sagemaker_notebook_instance.go index 7deaefaaa..dae961d5b 100644 --- a/aws/table_aws_sagemaker_notebook_instance.go +++ b/aws/table_aws_sagemaker_notebook_instance.go @@ -26,15 +26,27 @@ func tableAwsSageMakerNotebookInstance(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationException", "NotFoundException", "RecordNotFound"}), }, Hydrate: getAwsSageMakerNotebookInstance, + Tags: map[string]string{"service": "sagemaker", "action": "DescribeNotebookInstance"}, }, List: &plugin.ListConfig{ Hydrate: listAwsSageMakerNotebookInstances, + Tags: map[string]string{"service": "sagemaker", "action": "ListNotebookInstances"}, KeyColumns: []*plugin.KeyColumn{ {Name: "default_code_repository", Require: plugin.Optional}, {Name: "notebook_instance_lifecycle_config_name", Require: plugin.Optional}, {Name: "notebook_instance_status", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsSageMakerNotebookInstance, + Tags: map[string]string{"service": "sagemaker", "action": "DescribeNotebookInstance"}, + }, + { + Func: listAwsSageMakerNotebookInstanceTags, + Tags: map[string]string{"service": "sagemaker", "action": "ListTags"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(sagemakerv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -238,6 +250,9 @@ func listAwsSageMakerNotebookInstances(ctx context.Context, d *plugin.QueryData, // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_sagemaker_notebook_instance.listAwsSageMakerNotebookInstances", "api_error", err) @@ -312,6 +327,9 @@ func listAwsSageMakerNotebookInstanceTags(ctx context.Context, d *plugin.QueryDa pagesLeft := true tags := []types.Tag{} for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + keyTags, err := svc.ListTags(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_sagemaker_notebook_instance.listAwsSageMakerNotebookInstanceTags", "api_error", err) diff --git a/aws/table_aws_sagemaker_training_job.go b/aws/table_aws_sagemaker_training_job.go index 9dd995813..2028cf161 100644 --- a/aws/table_aws_sagemaker_training_job.go +++ b/aws/table_aws_sagemaker_training_job.go @@ -24,15 +24,27 @@ func tableAwsSageMakerTrainingJob(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationException", "NotFoundException", "RecordNotFound"}), }, Hydrate: getAwsSageMakerTrainingJob, + Tags: map[string]string{"service": "sagemaker", "action": "DescribeTrainingJob"}, }, List: &plugin.ListConfig{ Hydrate: listAwsSageMakerTrainingJobs, + Tags: map[string]string{"service": "sagemaker", "action": "ListTrainingJobs"}, KeyColumns: []*plugin.KeyColumn{ {Name: "creation_time", Require: plugin.Optional, Operators: []string{">", ">=", "<", "<="}}, {Name: "last_modified_time", Require: plugin.Optional, Operators: []string{">", ">=", "<", "<="}}, {Name: "training_job_status", Require: plugin.Optional, Operators: []string{">", ">=", "<", "<="}}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsSageMakerTrainingJob, + Tags: map[string]string{"service": "sagemaker", "action": "DescribeTrainingJob"}, + }, + { + Func: getAwsSageMakerTrainingJobTags, + Tags: map[string]string{"service": "sagemaker", "action": "ListTags"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(sagemakerv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -365,6 +377,9 @@ func listAwsSageMakerTrainingJobs(ctx context.Context, d *plugin.QueryData, _ *p // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_sagemaker_training_job.listAwsSageMakerTrainingJobs", "api_error", err) @@ -438,6 +453,9 @@ func getAwsSageMakerTrainingJobTags(ctx context.Context, d *plugin.QueryData, h pagesLeft := true tags := []types.Tag{} for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + keyTags, err := svc.ListTags(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_sagemaker_training_job.getAwsSageMakerTrainingJobTags", "api_error", err) diff --git a/aws/table_aws_secretsmanager_secret.go b/aws/table_aws_secretsmanager_secret.go index 30ad8dabf..753ea4ca7 100644 --- a/aws/table_aws_secretsmanager_secret.go +++ b/aws/table_aws_secretsmanager_secret.go @@ -26,15 +26,23 @@ func tableAwsSecretsManagerSecret(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationException", "InvalidParameter", "ResourceNotFoundException"}), }, Hydrate: describeSecretsManagerSecret, + Tags: map[string]string{"service": "secretsmanager", "action": "DescribeSecret"}, }, List: &plugin.ListConfig{ Hydrate: listSecretsManagerSecrets, + Tags: map[string]string{"service": "secretsmanager", "action": "ListSecrets"}, KeyColumns: []*plugin.KeyColumn{ {Name: "name", Require: plugin.Optional}, {Name: "description", Require: plugin.Optional}, {Name: "primary_region", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: describeSecretsManagerSecret, + Tags: map[string]string{"service": "sagemaker", "action": "DescribeSecret"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(secretsmanagerv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -209,6 +217,9 @@ func listSecretsManagerSecrets(ctx context.Context, d *plugin.QueryData, _ *plug // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_secretsmanager_secret.listSecretsManagerSecrets", "api_error", err) diff --git a/aws/table_aws_securityhub_action_target.go b/aws/table_aws_securityhub_action_target.go index 659ddd614..d6019d96d 100644 --- a/aws/table_aws_securityhub_action_target.go +++ b/aws/table_aws_securityhub_action_target.go @@ -22,12 +22,14 @@ func tableAwsSecurityHubActionTarget(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("arn"), Hydrate: getSecurityHubActionTarget, + Tags: map[string]string{"service": "securityhub", "action": "DescribeActionTargets"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidInputException"}), }, }, List: &plugin.ListConfig{ Hydrate: listSecurityHubActionTargets, + Tags: map[string]string{"service": "securityhub", "action": "DescribeActionTargets"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, @@ -108,6 +110,9 @@ func listSecurityHubActionTargets(ctx context.Context, d *plugin.QueryData, _ *p }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { if strings.Contains(err.Error(), "not subscribed") { diff --git a/aws/table_aws_securityhub_finding.go b/aws/table_aws_securityhub_finding.go index ffd88a43b..34d7e9cc2 100644 --- a/aws/table_aws_securityhub_finding.go +++ b/aws/table_aws_securityhub_finding.go @@ -24,12 +24,14 @@ func tableAwsSecurityHubFinding(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("id"), Hydrate: getSecurityHubFinding, + Tags: map[string]string{"service": "securityhub", "action": "GetFindings"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidAccessException"}), }, }, List: &plugin.ListConfig{ Hydrate: listSecurityHubFindings, + Tags: map[string]string{"service": "securityhub", "action": "GetFindings"}, KeyColumns: plugin.KeyColumnSlice{ {Name: "company_name", Require: plugin.Optional, Operators: []string{"=", "<>"}}, {Name: "compliance_status", Require: plugin.Optional, Operators: []string{"=", "<>"}}, @@ -304,6 +306,9 @@ func listSecurityHubFindings(ctx context.Context, d *plugin.QueryData, _ *plugin }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { // Handle error for accounts that are not subscribed to AWS Security Hub diff --git a/aws/table_aws_securityhub_finding_aggregator.go b/aws/table_aws_securityhub_finding_aggregator.go index ecad7f458..00626a845 100644 --- a/aws/table_aws_securityhub_finding_aggregator.go +++ b/aws/table_aws_securityhub_finding_aggregator.go @@ -23,14 +23,22 @@ func tableAwsSecurityHubFindingAggregator(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("arn"), Hydrate: getSecurityHubFindingAggregator, + Tags: map[string]string{"service": "securityhub", "action": "GetFindingAggregator"}, }, List: &plugin.ListConfig{ Hydrate: listSecurityHubFindingAggregators, + Tags: map[string]string{"service": "securityhub", "action": "ListFindingAggregators"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidAccessException"}), }, }, GetMatrixItemFunc: SupportedRegionMatrix(securityhubv1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getSecurityHubFindingAggregator, + Tags: map[string]string{"service": "securityhub", "action": "GetFindingAggregator"}, + }, + }, Columns: awsRegionalColumns([]*plugin.Column{ { Name: "arn", @@ -106,6 +114,9 @@ func listSecurityHubFindingAggregators(ctx context.Context, d *plugin.QueryData, }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { // Handle error for accounts that are not subscribed to AWS Security Hub diff --git a/aws/table_aws_securityhub_hub.go b/aws/table_aws_securityhub_hub.go index e81d3f256..4d123d610 100644 --- a/aws/table_aws_securityhub_hub.go +++ b/aws/table_aws_securityhub_hub.go @@ -25,11 +25,23 @@ func tableAwsSecurityHub(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidAccessException", "ResourceNotFoundException"}), }, Hydrate: getSecurityHub, + Tags: map[string]string{"service": "securityhub", "action": "DescribeHub"}, }, List: &plugin.ListConfig{ Hydrate: listSecurityHubs, + Tags: map[string]string{"service": "securityhub", "action": "DescribeHub"}, }, GetMatrixItemFunc: SupportedRegionMatrix(securityhubv1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getSecurityHubAdministratorAccount, + Tags: map[string]string{"service": "securityhub", "action": "GetAdministratorAccount"}, + }, + { + Func: getSecurityHubTags, + Tags: map[string]string{"service": "securityhub", "action": "ListTagsForResource"}, + }, + }, Columns: awsRegionalColumns([]*plugin.Column{ { Name: "hub_arn", diff --git a/aws/table_aws_securityhub_insight.go b/aws/table_aws_securityhub_insight.go index cd11527fe..dc5e702c9 100644 --- a/aws/table_aws_securityhub_insight.go +++ b/aws/table_aws_securityhub_insight.go @@ -22,12 +22,14 @@ func tableAwsSecurityHubInsight(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("arn"), Hydrate: getSecurityHubInsight, + Tags: map[string]string{"service": "securityhub", "action": "GetInsights"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "InvalidInputException"}), }, }, List: &plugin.ListConfig{ Hydrate: listSecurityHubInsights, + Tags: map[string]string{"service": "securityhub", "action": "GetInsights"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, @@ -111,6 +113,9 @@ func listSecurityHubInsights(ctx context.Context, d *plugin.QueryData, _ *plugin }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { // Handle error for accounts that are not subscribed to AWS Security Hub diff --git a/aws/table_aws_securityhub_member.go b/aws/table_aws_securityhub_member.go index 0013ebfa8..2f71b4f50 100644 --- a/aws/table_aws_securityhub_member.go +++ b/aws/table_aws_securityhub_member.go @@ -28,6 +28,7 @@ func tableAwsSecurityHubMember(_ context.Context) *plugin.Table { Description: "AWS Securityhub Member", List: &plugin.ListConfig{ Hydrate: listSecurityHubMembers, + Tags: map[string]string{"service": "securityhub", "action": "ListMembers"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidInputException", "BadRequestException"}), }, @@ -149,6 +150,9 @@ func listSecurityHubMembers(ctx context.Context, d *plugin.QueryData, _ *plugin. }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_securityhub_member.listSecurityHubMembers", "api_error", err) diff --git a/aws/table_aws_securityhub_product.go b/aws/table_aws_securityhub_product.go index fabf50d82..f0fe5f7d9 100644 --- a/aws/table_aws_securityhub_product.go +++ b/aws/table_aws_securityhub_product.go @@ -25,9 +25,11 @@ func tableAwsSecurityhubProduct(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidInputException"}), }, Hydrate: getSecurityHubProduct, + Tags: map[string]string{"service": "securityhub", "action": "DescribeProducts"}, }, List: &plugin.ListConfig{ Hydrate: listSecurityHubProducts, + Tags: map[string]string{"service": "securityhub", "action": "DescribeProducts"}, }, GetMatrixItemFunc: SupportedRegionMatrix(securityhubv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -133,6 +135,9 @@ func listSecurityHubProducts(ctx context.Context, d *plugin.QueryData, _ *plugin }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { // Handle error for accounts that are not subscribed to AWS Security Hub diff --git a/aws/table_aws_securityhub_standards_control.go b/aws/table_aws_securityhub_standards_control.go index 2b8e18e45..3759fdf80 100644 --- a/aws/table_aws_securityhub_standards_control.go +++ b/aws/table_aws_securityhub_standards_control.go @@ -27,6 +27,7 @@ func tableAwsSecurityHubStandardsControl(_ context.Context) *plugin.Table { }, ParentHydrate: listSecurityHubStandardsSubcriptions, Hydrate: listSecurityHubStandardsControls, + Tags: map[string]string{"service": "securityhub", "action": "DescribeStandardsControls"}, }, GetMatrixItemFunc: SupportedRegionMatrix(securityhubv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -155,6 +156,9 @@ func listSecurityHubStandardsControls(ctx context.Context, d *plugin.QueryData, }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { if strings.Contains(err.Error(), "ResourceNotFoundException") || strings.Contains(err.Error(), "not subscribed") { diff --git a/aws/table_aws_securityhub_standards_subscription.go b/aws/table_aws_securityhub_standards_subscription.go index 2ae45258c..3e40a8262 100644 --- a/aws/table_aws_securityhub_standards_subscription.go +++ b/aws/table_aws_securityhub_standards_subscription.go @@ -23,8 +23,15 @@ func tableAwsSecurityHubStandardsSubscription(_ context.Context) *plugin.Table { Description: "AWS Security Hub Standards Subscription", List: &plugin.ListConfig{ Hydrate: listSecurityHubStandardsSubcriptions, + Tags: map[string]string{"service": "securityhub", "action": "GetEnabledStandards"}, }, GetMatrixItemFunc: SupportedRegionMatrix(securityhubv1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: GetEnabledStandards, + Tags: map[string]string{"service": "securityhub", "action": "GetEnabledStandards"}, + }, + }, Columns: awsRegionalColumns([]*plugin.Column{ { Name: "name", @@ -133,6 +140,9 @@ func listSecurityHubStandardsSubcriptions(ctx context.Context, d *plugin.QueryDa }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_securityhub_standards_subscription.listSecurityHubStandardsSubcriptions", "api_error", err) diff --git a/aws/table_aws_securitylake_data_lake.go b/aws/table_aws_securitylake_data_lake.go index 8e9e2bf7b..257f7e073 100644 --- a/aws/table_aws_securitylake_data_lake.go +++ b/aws/table_aws_securitylake_data_lake.go @@ -20,6 +20,7 @@ func tableAwsSecurityLakeDataLake(_ context.Context) *plugin.Table { Description: "AWS Security Lake Data Lake", List: &plugin.ListConfig{ Hydrate: getSecurityLakeDataLake, + Tags: map[string]string{"service": "securitylake", "action": "ListDataLakes"}, }, GetMatrixItemFunc: SupportedRegionMatrix(securitylakev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ diff --git a/aws/table_aws_securitylake_subscriber.go b/aws/table_aws_securitylake_subscriber.go index 8e8553b64..a1cdd5a91 100644 --- a/aws/table_aws_securitylake_subscriber.go +++ b/aws/table_aws_securitylake_subscriber.go @@ -25,9 +25,11 @@ func tableAwsSecurityLakeSubscriber(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, Hydrate: getSecurityLakeSubscriber, + Tags: map[string]string{"service": "securitylake", "action": "GetSubscriber"}, }, List: &plugin.ListConfig{ Hydrate: listSecurityLakeSubscribers, + Tags: map[string]string{"service": "securitylake", "action": "ListSubscribers"}, }, GetMatrixItemFunc: SupportedRegionMatrix(securitylakev1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -157,6 +159,9 @@ func listSecurityLakeSubscribers(ctx context.Context, d *plugin.QueryData, _ *pl }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_securitylake_subscriber.listSecurityLakeSubscribers", "api_error", err) diff --git a/aws/table_aws_serverlessapplicationrepository_application.go b/aws/table_aws_serverlessapplicationrepository_application.go index 92a822f2c..4f4fe6fd3 100644 --- a/aws/table_aws_serverlessapplicationrepository_application.go +++ b/aws/table_aws_serverlessapplicationrepository_application.go @@ -26,9 +26,21 @@ func tableAwsServerlessApplicationRepositoryApplication(_ context.Context) *plug ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameter", "NotFoundException"}), }, Hydrate: getServerlessApplicationRepositoryApplication, + Tags: map[string]string{"service": "serverlessrepo", "action": "GetApplication"}, }, List: &plugin.ListConfig{ Hydrate: listServerlessApplicationRepositoryApplications, + Tags: map[string]string{"service": "serverlessrepo", "action": "ListApplications"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getServerlessApplicationRepositoryApplicationPolicy, + Tags: map[string]string{"service": "serverlessrepo", "action": "GetApplicationPolicy"}, + }, + { + Func: getServerlessApplicationRepositoryApplication, + Tags: map[string]string{"service": "serverlessrepo", "action": "GetApplication"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(serverlessapplicationrepositoryv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -167,6 +179,9 @@ func listServerlessApplicationRepositoryApplications(ctx context.Context, d *plu // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_serverlessapplicationrepository_application.listServerlessApplicationRepositoryApplications", "api_error", err) diff --git a/aws/table_aws_service_discovery_instance.go b/aws/table_aws_service_discovery_instance.go index 2041f14f6..c66689b0b 100644 --- a/aws/table_aws_service_discovery_instance.go +++ b/aws/table_aws_service_discovery_instance.go @@ -25,10 +25,12 @@ func tableAwsServiceDiscoveryInstance(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InstanceNotFound"}), }, Hydrate: getServiceDiscoveryInstance, + Tags: map[string]string{"service": "servicediscovery", "action": "GetInstance"}, }, List: &plugin.ListConfig{ ParentHydrate: listServiceDiscoveryServices, Hydrate: listServiceDiscoveryInstances, + Tags: map[string]string{"service": "servicediscovery", "action": "ListInstances"}, KeyColumns: plugin.KeyColumnSlice{ { Name: "service_id", @@ -155,6 +157,9 @@ func listServiceDiscoveryInstances(ctx context.Context, d *plugin.QueryData, h * }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_service_discovery_instance.listServiceDiscoveryInstances", "api_error", err) diff --git a/aws/table_aws_service_discovery_namespace.go b/aws/table_aws_service_discovery_namespace.go index 9e4ddb007..e5064e6ba 100644 --- a/aws/table_aws_service_discovery_namespace.go +++ b/aws/table_aws_service_discovery_namespace.go @@ -26,9 +26,11 @@ func tableAwsServiceDiscoveryNamespace(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NamespaceNotFound"}), }, Hydrate: getServiceDiscoveryNamespace, + Tags: map[string]string{"service": "servicediscovery", "action": "GetNamespace"}, }, List: &plugin.ListConfig{ Hydrate: listServiceDiscoveryNamespaces, + Tags: map[string]string{"service": "servicediscovery", "action": "ListNamespaces"}, KeyColumns: plugin.KeyColumnSlice{ { Name: "type", @@ -40,6 +42,12 @@ func tableAwsServiceDiscoveryNamespace(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getServiceDirectoryNamespaceTags, + Tags: map[string]string{"service": "servicediscovery", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(servicediscoveryv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -160,6 +168,9 @@ func listServiceDiscoveryNamespaces(ctx context.Context, d *plugin.QueryData, _ }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_service_discovery_namespace.listServiceDiscoveryNamespaces", "api_error", err) @@ -284,7 +295,7 @@ func buildServiceDiscoveryNamespaceFilter(quals plugin.KeyColumnQualMap) []types for columnName, filterName := range filterQuals { if quals[columnName] != nil { filter := types.NamespaceFilter{ - Name: types.NamespaceFilterName(filterName), + Name: types.NamespaceFilterName(filterName), Condition: types.FilterConditionEq, } value := getQualsValueByColumn(quals, columnName, "string") diff --git a/aws/table_aws_service_discovery_service.go b/aws/table_aws_service_discovery_service.go index 9cdbf13fd..bb8a448e0 100644 --- a/aws/table_aws_service_discovery_service.go +++ b/aws/table_aws_service_discovery_service.go @@ -26,9 +26,11 @@ func tableAwsServiceDiscoveryService(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ServiceNotFound"}), }, Hydrate: getServiceDiscoveryService, + Tags: map[string]string{"service": "servicediscovery", "action": "GetService"}, }, List: &plugin.ListConfig{ Hydrate: listServiceDiscoveryServices, + Tags: map[string]string{"service": "servicediscovery", "action": "ListServices"}, KeyColumns: plugin.KeyColumnSlice{ { Name: "namespace_id", @@ -36,6 +38,16 @@ func tableAwsServiceDiscoveryService(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getServiceDirectoryServiceTags, + Tags: map[string]string{"service": "servicediscovery", "action": "ListTagsForResource"}, + }, + { + Func: getServiceDiscoveryService, + Tags: map[string]string{"service": "servicediscovery", "action": "GetService"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(servicediscoveryv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -174,6 +186,9 @@ func listServiceDiscoveryServices(ctx context.Context, d *plugin.QueryData, _ *p }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_service_discovery_service.listServiceDiscoveryServices", "api_error", err) diff --git a/aws/table_aws_servicecatalog_portfolio.go b/aws/table_aws_servicecatalog_portfolio.go index ec7c583ef..434171523 100644 --- a/aws/table_aws_servicecatalog_portfolio.go +++ b/aws/table_aws_servicecatalog_portfolio.go @@ -25,9 +25,11 @@ func tableAwsServicecatalogPortfolio(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, Hydrate: getServiceCatalogPortfolio, + Tags: map[string]string{"service": "servicecatalog", "action": "DescribePortfolio"}, }, List: &plugin.ListConfig{ Hydrate: listServiceCatalogPortfolios, + Tags: map[string]string{"service": "servicecatalog", "action": "ListPortfolios"}, }, GetMatrixItemFunc: SupportedRegionMatrix(servicecatalogv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -149,6 +151,9 @@ func listServiceCatalogPortfolios(ctx context.Context, d *plugin.QueryData, _ *p }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_servicecatalog_portfolio.listServiceCatalogPortfolios", "api_error", err) @@ -180,7 +185,7 @@ func getServiceCatalogPortfolio(ctx context.Context, d *plugin.QueryData, h *plu } else { id = d.EqualsQuals["id"].GetStringValue() } - // Empty check + // Empty check if id == "" { return nil, nil } diff --git a/aws/table_aws_servicecatalog_product.go b/aws/table_aws_servicecatalog_product.go index ba3fad3fe..d9a9159c6 100644 --- a/aws/table_aws_servicecatalog_product.go +++ b/aws/table_aws_servicecatalog_product.go @@ -26,9 +26,11 @@ func tableAwsServicecatalogProduct(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, Hydrate: getServiceCatalogProduct, + Tags: map[string]string{"service": "servicecatalog", "action": "DescribeProduct"}, }, List: &plugin.ListConfig{ Hydrate: listServiceCatalogProducts, + Tags: map[string]string{"service": "servicecatalog", "action": "SearchProducts"}, KeyColumns: plugin.KeyColumnSlice{ { Name: "accept_language", @@ -219,6 +221,9 @@ func listServiceCatalogProducts(ctx context.Context, d *plugin.QueryData, _ *plu }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_servicecatalog_product.listServiceCatalogProducts", "api_error", err) diff --git a/aws/table_aws_servicequotas_default_service_quota.go b/aws/table_aws_servicequotas_default_service_quota.go index 729d49ab5..85142cef2 100644 --- a/aws/table_aws_servicequotas_default_service_quota.go +++ b/aws/table_aws_servicequotas_default_service_quota.go @@ -26,6 +26,7 @@ func tableAwsServiceQuotasDefaultServiceQuota(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.AllColumns([]string{"service_code", "quota_code"}), Hydrate: getDefaultServiceQuota, + Tags: map[string]string{"service": "servicequotas", "action": "GetAWSDefaultServiceQuota"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchResourceException"}), }, @@ -33,6 +34,7 @@ func tableAwsServiceQuotasDefaultServiceQuota(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listServiceQuotasService, Hydrate: listDefaultServiceQuotas, + Tags: map[string]string{"service": "servicequotas", "action": "ListAWSDefaultServiceQuotas"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchResourceException"}), }, @@ -143,6 +145,9 @@ func listServiceQuotasService(ctx context.Context, d *plugin.QueryData, h *plugi }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_servicequotas_default_service_quota.listServiceQuotasService", "api_error", err) @@ -203,6 +208,9 @@ func listDefaultServiceQuotas(ctx context.Context, d *plugin.QueryData, h *plugi }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_servicequotas_default_service_quota.listDefaultServiceQuotas", "api_error", err) diff --git a/aws/table_aws_servicequotas_service_quota.go b/aws/table_aws_servicequotas_service_quota.go index c4aa186c2..a4ca5aa6d 100644 --- a/aws/table_aws_servicequotas_service_quota.go +++ b/aws/table_aws_servicequotas_service_quota.go @@ -26,6 +26,7 @@ func tableAwsServiceQuotasServiceQuota(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.AllColumns([]string{"service_code", "quota_code"}), Hydrate: getServiceQuota, + Tags: map[string]string{"service": "servicequotas", "action": "GetServiceQuota"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchResourceException"}), }, @@ -33,6 +34,7 @@ func tableAwsServiceQuotasServiceQuota(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listServiceQuotasService, Hydrate: listServiceQuotas, + Tags: map[string]string{"service": "servicequotas", "action": "ListServiceQuotas"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchResourceException"}), }, @@ -40,6 +42,12 @@ func tableAwsServiceQuotasServiceQuota(_ context.Context) *plugin.Table { {Name: "service_code", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getServiceQuotaTags, + Tags: map[string]string{"service": "servicequotas", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(servicequotasv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -180,6 +188,9 @@ func listServiceQuotas(ctx context.Context, d *plugin.QueryData, h *plugin.Hydra }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_servicequotas_service_quota.listServiceQuotas", "api_error", err) diff --git a/aws/table_aws_servicequotas_service_quota_change_request.go b/aws/table_aws_servicequotas_service_quota_change_request.go index 7e797a350..b8f2e4d0b 100644 --- a/aws/table_aws_servicequotas_service_quota_change_request.go +++ b/aws/table_aws_servicequotas_service_quota_change_request.go @@ -26,6 +26,7 @@ func tableAwsServiceQuotasServiceQuotaChangeRequest(_ context.Context) *plugin.T }, Get: &plugin.GetConfig{ Hydrate: getServiceQuotaChangeRequest, + Tags: map[string]string{"service": "servicequotas", "action": "GetRequestedServiceQuotaChange"}, KeyColumns: plugin.SingleColumn("id"), IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchResourceException"}), @@ -33,6 +34,7 @@ func tableAwsServiceQuotasServiceQuotaChangeRequest(_ context.Context) *plugin.T }, List: &plugin.ListConfig{ Hydrate: listServiceQuotaChangeRequests, + Tags: map[string]string{"service": "servicequotas", "action": "ListRequestedServiceQuotaChangeHistory"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NoSuchResourceException"}), }, @@ -189,6 +191,9 @@ func listServiceQuotaChangeRequests(ctx context.Context, d *plugin.QueryData, h }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_servicequotas_service_quota_change_request.listServiceQuotaChangeRequests", "api_error", err) diff --git a/aws/table_aws_ses_domain_identity.go b/aws/table_aws_ses_domain_identity.go index 105ec1800..f8945cd05 100644 --- a/aws/table_aws_ses_domain_identity.go +++ b/aws/table_aws_ses_domain_identity.go @@ -19,6 +19,17 @@ func tableAwsSESDomainIdentity(_ context.Context) *plugin.Table { Description: "AWS SES Domain Identity", List: &plugin.ListConfig{ Hydrate: listSESDomainIdentities, + Tags: map[string]string{"service": "ses", "action": "ListIdentities"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getSESDomainIdentityDkimAttributes, + Tags: map[string]string{"service": "ses", "action": "GetIdentityDkimAttributes"}, + }, + { + Func: getSESDomainIdentityMailFromDomainAttributes, + Tags: map[string]string{"service": "ses", "action": "GetIdentityMailFromDomainAttributes"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(sesv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -128,6 +139,9 @@ func listSESDomainIdentities(ctx context.Context, d *plugin.QueryData, _ *plugin }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ses_domain_identity.listSESDomainIdentities", "api_error", err) diff --git a/aws/table_aws_ses_email_identity.go b/aws/table_aws_ses_email_identity.go index e01ac3b18..edb87849c 100644 --- a/aws/table_aws_ses_email_identity.go +++ b/aws/table_aws_ses_email_identity.go @@ -20,6 +20,17 @@ func tableAwsSESEmailIdentity(_ context.Context) *plugin.Table { Description: "AWS SES Email Identity", List: &plugin.ListConfig{ Hydrate: listSESEmailIdentities, + Tags: map[string]string{"service": "ses", "action": "ListIdentities"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getSESIdentityVerificationAttributes, + Tags: map[string]string{"service": "ses", "action": "GetIdentityVerificationAttributes"}, + }, + { + Func: getSESIdentityNotificationAttributes, + Tags: map[string]string{"service": "ses", "action": "GetIdentityNotificationAttributes"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(sesv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -113,6 +124,9 @@ func listSESEmailIdentities(ctx context.Context, d *plugin.QueryData, _ *plugin. }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ses_email_identity.listSESEmailIdentities", "api_error", err) diff --git a/aws/table_aws_sfn_state_machine.go b/aws/table_aws_sfn_state_machine.go index 3ae697262..958987ec0 100644 --- a/aws/table_aws_sfn_state_machine.go +++ b/aws/table_aws_sfn_state_machine.go @@ -23,9 +23,21 @@ func tableAwsStepFunctionsStateMachine(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "StateMachineDoesNotExist", "InvalidArn"}), }, Hydrate: getStepFunctionsStateMachine, + Tags: map[string]string{"service": "states", "action": "DescribeStateMachine"}, }, List: &plugin.ListConfig{ Hydrate: listStepFunctionsStateMachines, + Tags: map[string]string{"service": "states", "action": "ListStateMachines"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getStepFunctionsStateMachine, + Tags: map[string]string{"service": "states", "action": "DescribeStateMachine"}, + }, + { + Func: getStepFunctionStateMachineTags, + Tags: map[string]string{"service": "states", "action": "ListTagsForResource"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(sfnv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -145,6 +157,9 @@ func listStepFunctionsStateMachines(ctx context.Context, d *plugin.QueryData, _ }) //list call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_sfn_state_machine.listStepFunctionsStateMachines", "api_error", err) diff --git a/aws/table_aws_sfn_state_machine_execution.go b/aws/table_aws_sfn_state_machine_execution.go index 7563c9057..abc18ebba 100644 --- a/aws/table_aws_sfn_state_machine_execution.go +++ b/aws/table_aws_sfn_state_machine_execution.go @@ -25,15 +25,23 @@ func tableAwsStepFunctionsStateMachineExecution(_ context.Context) *plugin.Table ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameter", "ExecutionDoesNotExist", "InvalidArn"}), }, Hydrate: getStepFunctionsStateMachineExecution, + Tags: map[string]string{"service": "states", "action": "DescribeExecution"}, }, List: &plugin.ListConfig{ Hydrate: listStepFunctionsStateMachineExecutions, + Tags: map[string]string{"service": "states", "action": "ListExecutions"}, ParentHydrate: listStepFunctionsStateMachines, KeyColumns: []*plugin.KeyColumn{ {Name: "status", Require: plugin.Optional}, {Name: "state_machine_arn", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getStepFunctionsStateMachineExecution, + Tags: map[string]string{"service": "states", "action": "DescribeExecution"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(sfnv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -167,6 +175,9 @@ func listStepFunctionsStateMachineExecutions(ctx context.Context, d *plugin.Quer }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_sfn_state_machine_execution.listStepFunctionsStateMachineExecutions", "api_error", err) diff --git a/aws/table_aws_sfn_state_machine_execution_history.go b/aws/table_aws_sfn_state_machine_execution_history.go index 3562dd0cf..2c931bd15 100644 --- a/aws/table_aws_sfn_state_machine_execution_history.go +++ b/aws/table_aws_sfn_state_machine_execution_history.go @@ -23,6 +23,7 @@ func tableAwsStepFunctionsStateMachineExecutionHistory(_ context.Context) *plugi Description: "AWS Step Functions State Machine Execution History", List: &plugin.ListConfig{ Hydrate: listStepFunctionsStateMachineExecutionHistories, + Tags: map[string]string{"service": "states", "action": "ListExecutions"}, ParentHydrate: listStepFunctionsStateMachines, }, GetMatrixItemFunc: SupportedRegionMatrix(sfnv1.EndpointsID), @@ -271,6 +272,9 @@ func listStepFunctionsStateMachineExecutionHistories(ctx context.Context, d *plu }) // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_sfn_state_machine_execution_history.listStepFunctionsStateMachineExecutionHistories", "api_error", err) diff --git a/aws/table_aws_simspaceweaver_simulation.go b/aws/table_aws_simspaceweaver_simulation.go index a36cbd8bd..a783b5f24 100644 --- a/aws/table_aws_simspaceweaver_simulation.go +++ b/aws/table_aws_simspaceweaver_simulation.go @@ -26,9 +26,21 @@ func tableAwsSimSpaceWeaverSimulation(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, Hydrate: getAwsSimSpaceWeaverSimulation, + Tags: map[string]string{"service": "simspaceweaver", "action": "DescribeSimulation"}, }, List: &plugin.ListConfig{ Hydrate: listAwsSimSpaceWeaverSimulations, + Tags: map[string]string{"service": "simspaceweaver", "action": "ListSimulations"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsSimSpaceWeaverSimulation, + Tags: map[string]string{"service": "simspaceweaver", "action": "DescribeSimulation"}, + }, + { + Func: listAwsSimSpaceWeaverSimulationTags, + Tags: map[string]string{"service": "simspaceweaver", "action": "ListTagsForResource"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(simspaceweaverv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -156,6 +168,9 @@ func listAwsSimSpaceWeaverSimulations(ctx context.Context, d *plugin.QueryData, }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_simspaceweaver_simulation.listAwsSimSpaceWeaverSimulations", "api_error", err) diff --git a/aws/table_aws_sns_topic.go b/aws/table_aws_sns_topic.go index 261e2f7b0..cb631bba5 100644 --- a/aws/table_aws_sns_topic.go +++ b/aws/table_aws_sns_topic.go @@ -27,9 +27,21 @@ func tableAwsSnsTopic(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFound", "InvalidParameter"}), }, Hydrate: getTopicAttributes, + Tags: map[string]string{"service": "sns", "action": "GetTopicAttributes"}, }, List: &plugin.ListConfig{ Hydrate: listAwsSnsTopics, + Tags: map[string]string{"service": "sns", "action": "ListTopics"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: listTagsForSnsTopic, + Tags: map[string]string{"service": "sns", "action": "ListTagsForResource"}, + }, + { + Func: getTopicAttributes, + Tags: map[string]string{"service": "sns", "action": "GetTopicAttributes"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(snsv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -262,6 +274,9 @@ func listAwsSnsTopics(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrat }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_sns_topic.listAwsSnsTopics", "api_error", err) diff --git a/aws/table_aws_sns_topic_subscription.go b/aws/table_aws_sns_topic_subscription.go index 20c08c22e..e0daebb16 100644 --- a/aws/table_aws_sns_topic_subscription.go +++ b/aws/table_aws_sns_topic_subscription.go @@ -27,9 +27,17 @@ func tableAwsSnsTopicSubscription(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFound", "InvalidParameter"}), }, Hydrate: getSubscriptionAttributes, + Tags: map[string]string{"service": "sns", "action": "GetSubscriptionAttributes"}, }, List: &plugin.ListConfig{ Hydrate: listAwsSnsTopicSubscriptions, + Tags: map[string]string{"service": "sns", "action": "ListSubscriptions"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getSubscriptionAttributes, + Tags: map[string]string{"service": "sns", "action": "GetSubscriptionAttributes"}, + }, }, DefaultIgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFound", "InvalidParameter"}), @@ -148,6 +156,9 @@ func listAwsSnsTopicSubscriptions(ctx context.Context, d *plugin.QueryData, _ *p }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_sns_topic_subscription.listAwsSnsTopicSubscriptions", "api_error", err) diff --git a/aws/table_aws_sqs_queue.go b/aws/table_aws_sqs_queue.go index ee2846de6..263f86042 100644 --- a/aws/table_aws_sqs_queue.go +++ b/aws/table_aws_sqs_queue.go @@ -27,9 +27,21 @@ func tableAwsSqsQueue(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"AWS.SimpleQueueService.NonExistentQueue"}), }, Hydrate: getQueueAttributes, + Tags: map[string]string{"service": "sqs", "action": "GetQueueAttributes"}, }, List: &plugin.ListConfig{ Hydrate: listAwsSqsQueues, + Tags: map[string]string{"service": "sqs", "action": "ListQueues"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getQueueAttributes, + Tags: map[string]string{"service": "sqs", "action": "GetQueueAttributes"}, + }, + { + Func: listQueueTags, + Tags: map[string]string{"service": "sqs", "action": "ListQueueTags"}, + }, }, DefaultIgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"AWS.SimpleQueueService.NonExistentQueue"}), @@ -206,6 +218,9 @@ func listAwsSqsQueues(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrat }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_sqs_queue.listAwsSqsQueues", "api_error", err) diff --git a/aws/table_aws_ssm_association.go b/aws/table_aws_ssm_association.go index bf1f0816f..41659cf60 100644 --- a/aws/table_aws_ssm_association.go +++ b/aws/table_aws_ssm_association.go @@ -28,9 +28,11 @@ func tableAwsSSMAssociation(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"AssociationDoesNotExist", "ValidationException"}), }, Hydrate: getAwsSSMAssociation, + Tags: map[string]string{"service": "ssm", "action": "DescribeAssociation"}, }, List: &plugin.ListConfig{ Hydrate: listAwsSSMAssociations, + Tags: map[string]string{"service": "ssm", "action": "ListAssociations"}, KeyColumns: []*plugin.KeyColumn{ {Name: "association_name", Require: plugin.Optional}, {Name: "instance_id", Require: plugin.Optional}, @@ -38,6 +40,12 @@ func tableAwsSSMAssociation(_ context.Context) *plugin.Table { {Name: "last_execution_date", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsSSMAssociation, + Tags: map[string]string{"service": "ssm", "action": "DescribeAssociation"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(ssmv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -258,6 +266,9 @@ func listAwsSSMAssociations(ctx context.Context, d *plugin.QueryData, _ *plugin. }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ssm_association.listAwsSSMAssociations", "api_error", err) diff --git a/aws/table_aws_ssm_document.go b/aws/table_aws_ssm_document.go index af3559e58..e942dca2a 100644 --- a/aws/table_aws_ssm_document.go +++ b/aws/table_aws_ssm_document.go @@ -26,14 +26,26 @@ func tableAwsSSMDocument(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationException", "InvalidDocument"}), }, Hydrate: getAwsSSMDocument, + Tags: map[string]string{"service": "ssm", "action": "DescribeDocument"}, }, List: &plugin.ListConfig{ Hydrate: listAwsSSMDocuments, + Tags: map[string]string{"service": "ssm", "action": "ListDocuments"}, KeyColumns: []*plugin.KeyColumn{ {Name: "document_type", Require: plugin.Optional}, {Name: "owner_type", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsSSMDocumentPermissionDetail, + Tags: map[string]string{"service": "ssm", "action": "DescribeDocumentPermission"}, + }, + { + Func: getAwsSSMDocument, + Tags: map[string]string{"service": "ssm", "action": "DescribeDocument"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(ssmv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -278,6 +290,9 @@ func listAwsSSMDocuments(ctx context.Context, d *plugin.QueryData, _ *plugin.Hyd }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ssm_document.listAwsSSMDocuments", "api_error", err) diff --git a/aws/table_aws_ssm_document_permission.go b/aws/table_aws_ssm_document_permission.go index 35d8c9f4e..d5b3a520c 100644 --- a/aws/table_aws_ssm_document_permission.go +++ b/aws/table_aws_ssm_document_permission.go @@ -19,6 +19,7 @@ func tableAwsSSMDocumentPermission(_ context.Context) *plugin.Table { Description: "AWS SSM Document Permission", List: &plugin.ListConfig{ Hydrate: listAwsSSMDocumentPermissions, + Tags: map[string]string{"service": "ssm", "action": "DescribeDocumentPermission"}, KeyColumns: []*plugin.KeyColumn{ {Name: "document_name", Require: plugin.Required}, }, @@ -104,6 +105,9 @@ func listAwsSSMDocumentPermissions(ctx context.Context, d *plugin.QueryData, h * // API doesn't support aws-sdk-go-v2 paginator as of date pagesLeft := true for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + response, err := svc.DescribeDocumentPermission(ctx, input) if err != nil { plugin.Logger(ctx).Error("aws_ssm_document_permission.listAwsSSMDocumentPermissions", "api_error", err) diff --git a/aws/table_aws_ssm_inventory.go b/aws/table_aws_ssm_inventory.go index 05087e3c3..57b2dba8f 100644 --- a/aws/table_aws_ssm_inventory.go +++ b/aws/table_aws_ssm_inventory.go @@ -20,11 +20,18 @@ func tableAwsSSMInventory(_ context.Context) *plugin.Table { Description: "AWS SSM Inventory", List: &plugin.ListConfig{ Hydrate: listAwsSSMInventories, + Tags: map[string]string{"service": "ssm", "action": "GetInventory"}, KeyColumns: plugin.KeyColumnSlice{ {Name: "id", Require: plugin.Optional, Operators: []string{"=", "<>"}}, {Name: "type_name", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsSSMInventorySchema, + Tags: map[string]string{"service": "ssm", "action": "GetInventorySchema"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(ssmv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -116,6 +123,9 @@ func listAwsSSMInventories(ctx context.Context, d *plugin.QueryData, _ *plugin.H }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ssm_inventory.listAwsSSMInventories", "api_error", err) @@ -172,6 +182,9 @@ func getAwsSSMInventorySchema(ctx context.Context, d *plugin.QueryData, h *plugi var schemas []types.InventoryItemSchema for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ssm_inventory.getAwsSSMInventorySchema", "api_error", err) diff --git a/aws/table_aws_ssm_inventory_entry.go b/aws/table_aws_ssm_inventory_entry.go index 3e128d360..da7355633 100644 --- a/aws/table_aws_ssm_inventory_entry.go +++ b/aws/table_aws_ssm_inventory_entry.go @@ -18,6 +18,7 @@ func tableAwsSSMInventoryEntry(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listAwsSSMInventories, Hydrate: listAwsSSMInventoryEntries, + Tags: map[string]string{"service": "ssm", "action": "ListInventoryEntries"}, KeyColumns: plugin.KeyColumnSlice{ {Name: "instance_id", Require: plugin.Optional}, {Name: "type_name", Require: plugin.Optional}, @@ -114,6 +115,9 @@ func listAwsSSMInventoryEntries(ctx context.Context, d *plugin.QueryData, h *plu } for { + // apply rate limiting + d.WaitForListRateLimit(ctx) + op, err := svc.ListInventoryEntries(ctx, input) if err != nil { diff --git a/aws/table_aws_ssm_maintenance_window.go b/aws/table_aws_ssm_maintenance_window.go index 68d3248ae..38f1cab9c 100644 --- a/aws/table_aws_ssm_maintenance_window.go +++ b/aws/table_aws_ssm_maintenance_window.go @@ -29,14 +29,34 @@ func tableAwsSSMMaintenanceWindow(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"DoesNotExistException"}), }, Hydrate: getAwsSSMMaintenanceWindow, + Tags: map[string]string{"service": "ssm", "action": "GetMaintenanceWindow"}, }, List: &plugin.ListConfig{ Hydrate: listAwsSSMMaintenanceWindow, + Tags: map[string]string{"service": "ssm", "action": "DescribeMaintenanceWindows"}, KeyColumns: []*plugin.KeyColumn{ {Name: "name", Require: plugin.Optional}, {Name: "enabled", Require: plugin.Optional, Operators: []string{"=", "<>"}}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsSSMMaintenanceWindow, + Tags: map[string]string{"service": "ssm", "action": "GetMaintenanceWindow"}, + }, + { + Func: getAwsSSMMaintenanceWindowTags, + Tags: map[string]string{"service": "ssm", "action": "ListTagsForResource"}, + }, + { + Func: getMaintenanceWindowTargets, + Tags: map[string]string{"service": "ssm", "action": "DescribeMaintenanceWindowTargets"}, + }, + { + Func: getMaintenanceWindowTasks, + Tags: map[string]string{"service": "ssm", "action": "DescribeMaintenanceWindowTasks"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(ssmv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -208,6 +228,9 @@ func listAwsSSMMaintenanceWindow(ctx context.Context, d *plugin.QueryData, _ *pl }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ssm_maintenance_window.listAwsSSMMaintenanceWindow", "api_error", err) diff --git a/aws/table_aws_ssm_managed_instance.go b/aws/table_aws_ssm_managed_instance.go index 0d723d769..81483d900 100644 --- a/aws/table_aws_ssm_managed_instance.go +++ b/aws/table_aws_ssm_managed_instance.go @@ -22,6 +22,7 @@ func tableAwsSSMManagedInstance(_ context.Context) *plugin.Table { Description: "AWS SSM Managed Instance", List: &plugin.ListConfig{ Hydrate: listSsmManagedInstances, + Tags: map[string]string{"service": "ssm", "action": "DescribeInstanceInformation"}, KeyColumns: []*plugin.KeyColumn{ {Name: "instance_id", Require: plugin.Optional}, {Name: "agent_version", Require: plugin.Optional}, @@ -193,6 +194,9 @@ func listSsmManagedInstances(ctx context.Context, d *plugin.QueryData, _ *plugin }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ssm_managed_instance.listSsmManagedInstances", "api_error", err) diff --git a/aws/table_aws_ssm_managed_instance_compliance.go b/aws/table_aws_ssm_managed_instance_compliance.go index a4c959b4a..4ef3db32d 100644 --- a/aws/table_aws_ssm_managed_instance_compliance.go +++ b/aws/table_aws_ssm_managed_instance_compliance.go @@ -25,6 +25,7 @@ func tableAwsSSMManagedInstanceCompliance(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidResourceId", "ValidationException"}), }, Hydrate: listSsmManagedInstanceCompliances, + Tags: map[string]string{"service": "ssm", "action": "ListComplianceItems"}, KeyColumns: []*plugin.KeyColumn{ {Name: "resource_id", Require: plugin.Required}, {Name: "resource_type", Require: plugin.Optional}, @@ -143,6 +144,9 @@ func listSsmManagedInstanceCompliances(ctx context.Context, d *plugin.QueryData, }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ssm_managed_instance_compliance.listSsmManagedInstanceCompliances", "api_error", err) diff --git a/aws/table_aws_ssm_managed_instance_patch_state.go b/aws/table_aws_ssm_managed_instance_patch_state.go index a929125b8..cc26cb606 100644 --- a/aws/table_aws_ssm_managed_instance_patch_state.go +++ b/aws/table_aws_ssm_managed_instance_patch_state.go @@ -23,6 +23,7 @@ func tableAwsSSMManagedInstancePatchState(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listSsmManagedInstances, Hydrate: listSsmManagedInstancePatchStates, + Tags: map[string]string{"service": "ssm", "action": "DescribeInstancePatchStates"}, KeyColumns: []*plugin.KeyColumn{ {Name: "instance_id", Require: plugin.Optional}, }, @@ -195,6 +196,9 @@ func listSsmManagedInstancePatchStates(ctx context.Context, d *plugin.QueryData, }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ssm_managed_instance_patch_state.listSsmManagedInstancePatchStates", "api_error", err) diff --git a/aws/table_aws_ssm_parameter.go b/aws/table_aws_ssm_parameter.go index e1fd0c96c..9dc656fe8 100644 --- a/aws/table_aws_ssm_parameter.go +++ b/aws/table_aws_ssm_parameter.go @@ -28,9 +28,11 @@ func tableAwsSSMParameter(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationException"}), }, Hydrate: getAwsSSMParameter, + Tags: map[string]string{"service": "ssm", "action": "DescribeParameters"}, }, List: &plugin.ListConfig{ Hydrate: listAwsSSMParameters, + Tags: map[string]string{"service": "ssm", "action": "DescribeParameters"}, KeyColumns: []*plugin.KeyColumn{ {Name: "type", Require: plugin.Optional}, {Name: "key_id", Require: plugin.Optional}, @@ -38,6 +40,16 @@ func tableAwsSSMParameter(_ context.Context) *plugin.Table { {Name: "data_type", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsSSMParameterDetails, + Tags: map[string]string{"service": "ssm", "action": "GetParameter"}, + }, + { + Func: getAwsSSMParameterTags, + Tags: map[string]string{"service": "ssm", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(ssmv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -189,6 +201,9 @@ func listAwsSSMParameters(ctx context.Context, d *plugin.QueryData, _ *plugin.Hy }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ssm_parameter.listAwsSSMParameters", "api_error", err) diff --git a/aws/table_aws_ssm_patch_baseline.go b/aws/table_aws_ssm_patch_baseline.go index 935ff3bdf..198afd69c 100644 --- a/aws/table_aws_ssm_patch_baseline.go +++ b/aws/table_aws_ssm_patch_baseline.go @@ -27,14 +27,26 @@ func tableAwsSSMPatchBaseline(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"DoesNotExistException", "InvalidResourceId", "InvalidParameter", "ValidationException"}), }, Hydrate: getPatchBaseline, + Tags: map[string]string{"service": "ssm", "action": "GetPatchBaseline"}, }, List: &plugin.ListConfig{ Hydrate: describePatchBaselines, + Tags: map[string]string{"service": "ssm", "action": "DescribePatchBaselines"}, KeyColumns: []*plugin.KeyColumn{ {Name: "name", Require: plugin.Optional}, {Name: "operating_system", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getPatchBaseline, + Tags: map[string]string{"service": "ssm", "action": "GetPatchBaseline"}, + }, + { + Func: getAwsSSMPatchBaselineTags, + Tags: map[string]string{"service": "ssm", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(ssmv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -214,6 +226,9 @@ func describePatchBaselines(ctx context.Context, d *plugin.QueryData, _ *plugin. }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ssm_patch_baseline.describePatchBaselines", "api_error", err) diff --git a/aws/table_aws_ssoadmin_account_assignment.go b/aws/table_aws_ssoadmin_account_assignment.go index a59ae4675..4d2a6b87d 100644 --- a/aws/table_aws_ssoadmin_account_assignment.go +++ b/aws/table_aws_ssoadmin_account_assignment.go @@ -27,6 +27,7 @@ func tableAwsSsoAdminAccountAssignment(_ context.Context) *plugin.Table { plugin.OptionalColumns([]string{"instance_arn"})..., ), Hydrate: listSsoAdminAccountAssignments, + Tags: map[string]string{"service": "sso", "action": "ListAccountAssignments"}, }, GetMatrixItemFunc: SupportedRegionMatrix(ssoadminv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -83,8 +84,8 @@ func listSsoAdminAccountAssignments(ctx context.Context, d *plugin.QueryData, h if d.QueryContext.Limit != nil { limit := int32(*d.QueryContext.Limit) if limit < maxLimit { - maxLimit = limit - } + maxLimit = limit + } } permissionSetArn := d.EqualsQualString("permission_set_arn") @@ -109,6 +110,9 @@ func listSsoAdminAccountAssignments(ctx context.Context, d *plugin.QueryData, h // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error(d.Table.Name+".listSsoAdminAccountAssignments", "api_error", err) diff --git a/aws/table_aws_ssoadmin_instance.go b/aws/table_aws_ssoadmin_instance.go index c1ed8d942..3c1f2165d 100644 --- a/aws/table_aws_ssoadmin_instance.go +++ b/aws/table_aws_ssoadmin_instance.go @@ -19,6 +19,7 @@ func tableAwsSsoAdminInstance(_ context.Context) *plugin.Table { Description: "AWS SSO Instance", List: &plugin.ListConfig{ Hydrate: listSsoAdminInstances, + Tags: map[string]string{"service": "sso", "action": "ListInstances"}, }, GetMatrixItemFunc: SupportedRegionMatrix(ssoadminv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -89,6 +90,9 @@ func listSsoAdminInstances(ctx context.Context, d *plugin.QueryData, _ *plugin.H // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ssoadmin_instance.listSsoAdminInstances", "api_error", err) diff --git a/aws/table_aws_ssoadmin_managed_policy_attachment.go b/aws/table_aws_ssoadmin_managed_policy_attachment.go index 36310b763..30b1a311a 100644 --- a/aws/table_aws_ssoadmin_managed_policy_attachment.go +++ b/aws/table_aws_ssoadmin_managed_policy_attachment.go @@ -23,6 +23,7 @@ func tableAwsSsoAdminManagedPolicyAttachment(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ KeyColumns: plugin.AllColumns([]string{"permission_set_arn"}), Hydrate: listSsoAdminManagedPolicyAttachments, + Tags: map[string]string{"service": "sso", "action": "ListManagedPoliciesInPermissionSet"}, }, GetMatrixItemFunc: SupportedRegionMatrix(ssoadminv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -105,6 +106,9 @@ func listSsoAdminManagedPolicyAttachments(ctx context.Context, d *plugin.QueryDa // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ssoadmin_managed_policy_attachment.listSsoAdminManagedPolicyAttachments", "api_error", err) diff --git a/aws/table_aws_ssoadmin_permission_set.go b/aws/table_aws_ssoadmin_permission_set.go index ee43df06c..4315820cc 100644 --- a/aws/table_aws_ssoadmin_permission_set.go +++ b/aws/table_aws_ssoadmin_permission_set.go @@ -22,10 +22,21 @@ func tableAwsSsoAdminPermissionSet(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listSsoAdminInstances, Hydrate: listSsoAdminPermissionSets, + Tags: map[string]string{"service": "sso", "action": "ListPermissionSets"}, KeyColumns: []*plugin.KeyColumn{ {Name: "instance_arn", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getSsoAdminPermissionSet, + Tags: map[string]string{"service": "sso", "action": "DescribePermissionSet"}, + }, + { + Func: getSsoAdminPermissionSetTags, + Tags: map[string]string{"service": "sso", "action": "ListTagsForResource"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(ssoadminv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -162,6 +173,9 @@ func listSsoAdminPermissionSets(ctx context.Context, d *plugin.QueryData, h *plu // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ssoadmin_permission_set.listSsoAdminPermissionSets", "api_error", err) @@ -265,6 +279,9 @@ func getSsoAdminResourceTags(ctx context.Context, d *plugin.QueryData, instanceA // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_ssoadmin_permission_set.getSsoAdminResourceTags", "api_error", err) diff --git a/aws/table_aws_sts_caller_identity.go b/aws/table_aws_sts_caller_identity.go index 17ea3be84..701ef8aee 100644 --- a/aws/table_aws_sts_caller_identity.go +++ b/aws/table_aws_sts_caller_identity.go @@ -14,6 +14,7 @@ func tableAwsSTSCallerIdentity(_ context.Context) *plugin.Table { Description: "AWS STS Caller Identity", List: &plugin.ListConfig{ Hydrate: getStsCallerIdentity, + Tags: map[string]string{"service": "sts", "action": "GetCallerIdentity"}, }, Columns: awsAccountColumns([]*plugin.Column{ { diff --git a/aws/table_aws_tagging_resource.go b/aws/table_aws_tagging_resource.go index 36f7c49a4..ecfb7c9cf 100644 --- a/aws/table_aws_tagging_resource.go +++ b/aws/table_aws_tagging_resource.go @@ -20,6 +20,7 @@ func tableAwsTaggingResource(_ context.Context) *plugin.Table { Description: "AWS Tagging Resource", Get: &plugin.GetConfig{ Hydrate: getTaggingResource, + Tags: map[string]string{"service": "tag", "action": "GetResources"}, KeyColumns: plugin.SingleColumn("arn"), IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterException"}), @@ -27,6 +28,7 @@ func tableAwsTaggingResource(_ context.Context) *plugin.Table { }, List: &plugin.ListConfig{ Hydrate: listTaggingResources, + Tags: map[string]string{"service": "tag", "action": "GetResources"}, }, GetMatrixItemFunc: SupportedRegionMatrix(resourcegroupstaggingapiv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -122,6 +124,9 @@ func listTaggingResources(ctx context.Context, d *plugin.QueryData, _ *plugin.Hy }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_tagging_resource.listTaggingResources", "api_error", err) diff --git a/aws/table_aws_vpc.go b/aws/table_aws_vpc.go index 5d21fa90e..9a71eaaaa 100644 --- a/aws/table_aws_vpc.go +++ b/aws/table_aws_vpc.go @@ -26,9 +26,11 @@ func tableAwsVpc(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NotFoundException", "InvalidVpcID.NotFound"}), }, Hydrate: getVpc, + Tags: map[string]string{"service": "ec2", "action": "DescribeVpcs"}, }, List: &plugin.ListConfig{ Hydrate: listVpcs, + Tags: map[string]string{"service": "ec2", "action": "DescribeVpcs"}, KeyColumns: []*plugin.KeyColumn{ {Name: "cidr_block", Require: plugin.Optional}, {Name: "dhcp_options_id", Require: plugin.Optional}, @@ -168,6 +170,9 @@ func listVpcs(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateData) ( }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_vpc.listVpcs", "api_error", err) diff --git a/aws/table_aws_vpc_customer_gateway.go b/aws/table_aws_vpc_customer_gateway.go index b9f57e812..9e787800c 100644 --- a/aws/table_aws_vpc_customer_gateway.go +++ b/aws/table_aws_vpc_customer_gateway.go @@ -23,9 +23,11 @@ func tableAwsVpcCustomerGateway(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidCustomerGatewayID.NotFound", "InvalidCustomerGatewayID.Malformed"}), }, Hydrate: getVpcCustomerGateway, + Tags: map[string]string{"service": "ec2", "action": "DescribeCustomerGateways"}, }, List: &plugin.ListConfig{ Hydrate: listVpcCustomerGateways, + Tags: map[string]string{"service": "ec2", "action": "DescribeCustomerGateways"}, KeyColumns: []*plugin.KeyColumn{ {Name: "ip_address", Require: plugin.Optional}, {Name: "bgp_asn", Require: plugin.Optional}, @@ -124,6 +126,9 @@ func listVpcCustomerGateways(ctx context.Context, d *plugin.QueryData, _ *plugin input.Filters = filters } + // apply rate limiting + d.WaitForListRateLimit(ctx) + // List call resp, err := svc.DescribeCustomerGateways(ctx, input) if err != nil { diff --git a/aws/table_aws_vpc_dhcp_options.go b/aws/table_aws_vpc_dhcp_options.go index 37f0d5873..2a721e1b2 100644 --- a/aws/table_aws_vpc_dhcp_options.go +++ b/aws/table_aws_vpc_dhcp_options.go @@ -24,9 +24,11 @@ func tableAwsVpcDhcpOptions(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidDhcpOptionID.NotFound"}), }, Hydrate: getVpcDhcpOption, + Tags: map[string]string{"service": "ec2", "action": "DescribeDhcpOptions"}, }, List: &plugin.ListConfig{ Hydrate: listVpcDhcpOptions, + Tags: map[string]string{"service": "ec2", "action": "DescribeDhcpOptions"}, KeyColumns: []*plugin.KeyColumn{ {Name: "owner_id", Require: plugin.Optional}, }, @@ -146,6 +148,9 @@ func listVpcDhcpOptions(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydr }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_vpc_dhcp_options.listVpcDhcpOptions", "api_error", err) diff --git a/aws/table_aws_vpc_egress_only_internet_gateway.go b/aws/table_aws_vpc_egress_only_internet_gateway.go index 5c5f51101..31cccbbe8 100644 --- a/aws/table_aws_vpc_egress_only_internet_gateway.go +++ b/aws/table_aws_vpc_egress_only_internet_gateway.go @@ -24,9 +24,11 @@ func tableAwsVpcEgressOnlyIGW(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidEgressOnlyInternetGatewayId.NotFound", "InvalidEgressOnlyInternetGatewayId.Malformed"}), }, Hydrate: getVpcEgressOnlyInternetGateway, + Tags: map[string]string{"service": "ec2", "action": "DescribeEgressOnlyInternetGateways"}, }, List: &plugin.ListConfig{ Hydrate: listVpcEgressOnlyInternetGateways, + Tags: map[string]string{"service": "ec2", "action": "DescribeEgressOnlyInternetGateways"}, }, GetMatrixItemFunc: SupportedRegionMatrix(ec2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -104,6 +106,9 @@ func listVpcEgressOnlyInternetGateways(ctx context.Context, d *plugin.QueryData, }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_vpc_egress_only_internet_gateway.listVpcEgressOnlyInternetGateways", "api_error", err) diff --git a/aws/table_aws_vpc_eip.go b/aws/table_aws_vpc_eip.go index cdf02c7c4..092e14a17 100644 --- a/aws/table_aws_vpc_eip.go +++ b/aws/table_aws_vpc_eip.go @@ -23,9 +23,11 @@ func tableAwsVpcEip(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidAllocationID.NotFound", "InvalidAllocationID.Malformed"}), }, Hydrate: getVpcEip, + Tags: map[string]string{"service": "ec2", "action": "DescribeAddresses"}, }, List: &plugin.ListConfig{ Hydrate: listVpcEips, + Tags: map[string]string{"service": "ec2", "action": "DescribeAddresses"}, KeyColumns: []*plugin.KeyColumn{ {Name: "association_id", Require: plugin.Optional}, {Name: "domain", Require: plugin.Optional}, @@ -174,6 +176,9 @@ func listVpcEips(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateData input.Filters = filters } + // apply rate limiting + d.WaitForListRateLimit(ctx) + // List call resp, err := svc.DescribeAddresses(ctx, input) if err != nil { diff --git a/aws/table_aws_vpc_eip_address_transfer.go b/aws/table_aws_vpc_eip_address_transfer.go index c14d0cc56..0262f4213 100644 --- a/aws/table_aws_vpc_eip_address_transfer.go +++ b/aws/table_aws_vpc_eip_address_transfer.go @@ -20,6 +20,7 @@ func tableAwsVpcEipAddressTransfer(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listVpcEips, Hydrate: listVpcEipAddressTransfers, + Tags: map[string]string{"service": "ec2", "action": "DescribeAddressTransfers"}, KeyColumns: []*plugin.KeyColumn{ {Name: "allocation_id", Require: plugin.Optional}, }, @@ -112,6 +113,9 @@ func listVpcEipAddressTransfers(ctx context.Context, d *plugin.QueryData, h *plu }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_vpc_eip_address_transfer.listVpcEipAddressTransfers", "api_error", err) diff --git a/aws/table_aws_vpc_endpoint.go b/aws/table_aws_vpc_endpoint.go index 9205a34e7..9cbfb256c 100644 --- a/aws/table_aws_vpc_endpoint.go +++ b/aws/table_aws_vpc_endpoint.go @@ -24,9 +24,11 @@ func tableAwsVpcEndpoint(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidVpcEndpointId.NotFound", "InvalidVpcEndpointId.Malformed"}), }, Hydrate: getVpcEndpoint, + Tags: map[string]string{"service": "ec2", "action": "DescribeVpcEndpoints"}, }, List: &plugin.ListConfig{ Hydrate: listVpcEndpoints, + Tags: map[string]string{"service": "ec2", "action": "DescribeVpcEndpoints"}, KeyColumns: []*plugin.KeyColumn{ {Name: "service_name", Require: plugin.Optional}, {Name: "vpc_id", Require: plugin.Optional}, @@ -187,6 +189,9 @@ func listVpcEndpoints(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrat }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_vpc_endpoint.listVpcEndpoints", "api_error", err) diff --git a/aws/table_aws_vpc_endpoint_service.go b/aws/table_aws_vpc_endpoint_service.go index ce350d99f..a36226cbc 100644 --- a/aws/table_aws_vpc_endpoint_service.go +++ b/aws/table_aws_vpc_endpoint_service.go @@ -25,9 +25,21 @@ func tableAwsVpcEndpointService(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidServiceName"}), }, Hydrate: getVpcEndpointService, + Tags: map[string]string{"service": "ec2", "action": "DescribeVpcEndpointServices"}, }, List: &plugin.ListConfig{ Hydrate: listVpcEndpointServices, + Tags: map[string]string{"service": "ec2", "action": "DescribeVpcEndpointServices"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: listVpcEndpointServicePermissions, + Tags: map[string]string{"service": "ec2", "action": "DescribeVpcEndpointServicePermissions"}, + }, + { + Func: getVpcEndpointConnections, + Tags: map[string]string{"service": "ec2", "action": "DescribeVpcEndpointConnections"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(ec2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -160,6 +172,9 @@ func listVpcEndpointServices(ctx context.Context, d *plugin.QueryData, _ *plugin // API doesn't support aws-sdk-go-v2 paginator as of date pagesLeft := true for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + result, err := svc.DescribeVpcEndpointServices(ctx, input) if err != nil { plugin.Logger(ctx).Error("aws_vpc_endpoint_service.listVpcEndpointServices", "api_error", err) @@ -238,6 +253,9 @@ func listVpcEndpointServicePermissions(ctx context.Context, d *plugin.QueryData, var allowedPrincipals []types.AllowedPrincipal for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { if err != nil { diff --git a/aws/table_aws_vpc_flow_log.go b/aws/table_aws_vpc_flow_log.go index f1962da82..4535d1905 100644 --- a/aws/table_aws_vpc_flow_log.go +++ b/aws/table_aws_vpc_flow_log.go @@ -27,9 +27,11 @@ func tableAwsVpcFlowlog(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"Client.InvalidInstanceID.NotFound", "InvalidParameterValue"}), }, Hydrate: getVpcFlowlog, + Tags: map[string]string{"service": "ec2", "action": "DescribeFlowLogs"}, }, List: &plugin.ListConfig{ Hydrate: listVpcFlowlogs, + Tags: map[string]string{"service": "ec2", "action": "DescribeFlowLogs"}, KeyColumns: []*plugin.KeyColumn{ {Name: "deliver_logs_status", Require: plugin.Optional}, {Name: "log_destination_type", Require: plugin.Optional}, @@ -192,6 +194,9 @@ func listVpcFlowlogs(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrate }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_vpc_flow_log.listVpcFlowlogs", "api_error", err) diff --git a/aws/table_aws_vpc_flow_log_event.go b/aws/table_aws_vpc_flow_log_event.go index c80c32df2..61156a3a6 100644 --- a/aws/table_aws_vpc_flow_log_event.go +++ b/aws/table_aws_vpc_flow_log_event.go @@ -42,6 +42,7 @@ func tableAwsVpcFlowLogEvent(_ context.Context) *plugin.Table { Description: "AWS VPC Flow Log events from CloudWatch Logs", List: &plugin.ListConfig{ Hydrate: listCloudwatchLogEvents, + Tags: map[string]string{"service": "logs", "action": "FilterLogEvents"}, KeyColumns: tableAwsVpcFlowLogEventListKeyColumns(), }, GetMatrixItemFunc: SupportedRegionMatrix(cloudwatchlogsv1.EndpointsID), diff --git a/aws/table_aws_vpc_internet_gateway.go b/aws/table_aws_vpc_internet_gateway.go index d320a5271..061f3d33f 100644 --- a/aws/table_aws_vpc_internet_gateway.go +++ b/aws/table_aws_vpc_internet_gateway.go @@ -24,9 +24,11 @@ func tableAwsVpcInternetGateway(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidInternetGatewayID.NotFound", "InvalidInternetGatewayID.Malformed"}), }, Hydrate: getVpcInternetGateway, + Tags: map[string]string{"service": "ec2", "action": "DescribeInternetGateways"}, }, List: &plugin.ListConfig{ Hydrate: listVpcInternetGateways, + Tags: map[string]string{"service": "ec2", "action": "DescribeInternetGateways"}, KeyColumns: []*plugin.KeyColumn{ {Name: "owner_id", Require: plugin.Optional}, }, @@ -120,6 +122,8 @@ func listVpcInternetGateways(ctx context.Context, d *plugin.QueryData, _ *plugin }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_vpc_internet_gateway.listVpcInternetGateways", "api_error", err) diff --git a/aws/table_aws_vpc_nat_gateway.go b/aws/table_aws_vpc_nat_gateway.go index b6ef62852..a3c16be31 100644 --- a/aws/table_aws_vpc_nat_gateway.go +++ b/aws/table_aws_vpc_nat_gateway.go @@ -24,9 +24,11 @@ func tableAwsVpcNatGateway(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NatGatewayMalformed", "NatGatewayNotFound"}), }, Hydrate: getVpcNatGateway, + Tags: map[string]string{"service": "ec2", "action": "DescribeNatGateways"}, }, List: &plugin.ListConfig{ Hydrate: listVpcNatGateways, + Tags: map[string]string{"service": "ec2", "action": "DescribeNatGateways"}, KeyColumns: []*plugin.KeyColumn{ {Name: "state", Require: plugin.Optional}, {Name: "subnet_id", Require: plugin.Optional}, @@ -168,6 +170,9 @@ func listVpcNatGateways(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydr // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_vpc_nat_gateway.listVpcNatGateways", "api_error", err) diff --git a/aws/table_aws_vpc_nat_gateway_metric_bytes_out_to_destination.go b/aws/table_aws_vpc_nat_gateway_metric_bytes_out_to_destination.go index 641cc6099..d93e127ad 100644 --- a/aws/table_aws_vpc_nat_gateway_metric_bytes_out_to_destination.go +++ b/aws/table_aws_vpc_nat_gateway_metric_bytes_out_to_destination.go @@ -18,6 +18,7 @@ func tableAwsVpcNatGatewayMetricBytesOutToDestination(_ context.Context) *plugin List: &plugin.ListConfig{ ParentHydrate: listVpcNatGateways, Hydrate: listVpcNatGatewayMetricBytesOutToDestination, + Tags: map[string]string{"service": "cloudwatch", "action": "GetMetricStatistics"}, }, GetMatrixItemFunc: CloudWatchRegionsMatrix, Columns: awsRegionalColumns(cwMetricColumns( diff --git a/aws/table_aws_vpc_network_acl.go b/aws/table_aws_vpc_network_acl.go index 4abad768e..1683cb1ff 100644 --- a/aws/table_aws_vpc_network_acl.go +++ b/aws/table_aws_vpc_network_acl.go @@ -24,9 +24,11 @@ func tableAwsVpcNetworkACL(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidNetworkAclID.NotFound"}), }, Hydrate: getVpcNetworkACL, + Tags: map[string]string{"service": "ec2", "action": "DescribeNetworkAcls"}, }, List: &plugin.ListConfig{ Hydrate: listVpcNetworkACLs, + Tags: map[string]string{"service": "ec2", "action": "DescribeNetworkAcls"}, KeyColumns: []*plugin.KeyColumn{ {Name: "is_default", Require: plugin.Optional, Operators: []string{"=", "<>"}}, {Name: "owner_id", Require: plugin.Optional}, @@ -146,6 +148,9 @@ func listVpcNetworkACLs(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydr }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_vpc_network_acl.listVpcNetworkACLs", "api_error", err) diff --git a/aws/table_aws_vpc_peering_connection.go b/aws/table_aws_vpc_peering_connection.go index 1f7deae11..d349e5ae9 100644 --- a/aws/table_aws_vpc_peering_connection.go +++ b/aws/table_aws_vpc_peering_connection.go @@ -22,6 +22,7 @@ func tableAwsVpcPeeringConnection(_ context.Context) *plugin.Table { Description: "AWS VPC Peering Connection", List: &plugin.ListConfig{ Hydrate: listVpcPeeringConnections, + Tags: map[string]string{"service": "ec2", "action": "DescribeVpcPeeringConnections"}, KeyColumns: []*plugin.KeyColumn{ {Name: "accepter_cidr_block", Require: plugin.Optional}, {Name: "accepter_owner_id", Require: plugin.Optional}, @@ -219,6 +220,9 @@ func listVpcPeeringConnections(ctx context.Context, d *plugin.QueryData, _ *plug }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_vpc_peering_connection.listVpcPeeringConnections", "api_error", err) diff --git a/aws/table_aws_vpc_route_table.go b/aws/table_aws_vpc_route_table.go index e5c1682f3..66473b437 100644 --- a/aws/table_aws_vpc_route_table.go +++ b/aws/table_aws_vpc_route_table.go @@ -26,9 +26,11 @@ func tableAwsVpcRouteTable(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidRouteTableID.NotFound", "InvalidRouteTableID.Malformed"}), }, Hydrate: getVpcRouteTable, + Tags: map[string]string{"service": "ec2", "action": "DescribeRouteTables"}, }, List: &plugin.ListConfig{ Hydrate: listVpcRouteTables, + Tags: map[string]string{"service": "ec2", "action": "DescribeRouteTables"}, KeyColumns: []*plugin.KeyColumn{ {Name: "owner_id", Require: plugin.Optional}, {Name: "vpc_id", Require: plugin.Optional}, @@ -141,6 +143,9 @@ func listVpcRouteTables(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydr }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_vpc_route_table.listVpcRouteTables", "api_error", err) diff --git a/aws/table_aws_vpc_security_group.go b/aws/table_aws_vpc_security_group.go index f7e62d7f8..3ca8c1996 100644 --- a/aws/table_aws_vpc_security_group.go +++ b/aws/table_aws_vpc_security_group.go @@ -24,9 +24,11 @@ func tableAwsVpcSecurityGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidGroupId.Malformed", "InvalidGroupId.NotFound", "InvalidGroup.NotFound"}), }, Hydrate: getVpcSecurityGroup, + Tags: map[string]string{"service": "ec2", "action": "DescribeSecurityGroups"}, }, List: &plugin.ListConfig{ Hydrate: listVpcSecurityGroups, + Tags: map[string]string{"service": "ec2", "action": "DescribeSecurityGroups"}, KeyColumns: []*plugin.KeyColumn{ {Name: "description", Require: plugin.Optional}, {Name: "group_name", Require: plugin.Optional}, @@ -155,6 +157,9 @@ func listVpcSecurityGroups(ctx context.Context, d *plugin.QueryData, _ *plugin.H }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_vpc_security_group.listVpcSecurityGroups", "api_error", err) diff --git a/aws/table_aws_vpc_security_group_rule.go b/aws/table_aws_vpc_security_group_rule.go index 48fbf8061..e5ea8f7d4 100644 --- a/aws/table_aws_vpc_security_group_rule.go +++ b/aws/table_aws_vpc_security_group_rule.go @@ -28,9 +28,11 @@ func tableAwsVpcSecurityGroupRule(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidGroup.NotFound", "InvalidSecurityGroupRuleId.Malformed", "InvalidSecurityGroupRuleId.NotFound"}), }, Hydrate: getSecurityGroupRule, + Tags: map[string]string{"service": "ec2", "action": "DescribeSecurityGroupRules"}, }, List: &plugin.ListConfig{ Hydrate: listSecurityGroupRules, + Tags: map[string]string{"service": "ec2", "action": "DescribeSecurityGroupRules"}, KeyColumns: []*plugin.KeyColumn{ { Name: "group_id", @@ -38,6 +40,12 @@ func tableAwsVpcSecurityGroupRule(_ context.Context) *plugin.Table { }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getReferencedSecurityGroupDetails, + Tags: map[string]string{"service": "ec2", "action": "DescribeSecurityGroups"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(ec2v1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -252,6 +260,9 @@ func listSecurityGroupRules(ctx context.Context, d *plugin.QueryData, h *plugin. }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_vpc_security_group_rule.listSecurityGroupRules", "api_error", err) diff --git a/aws/table_aws_vpc_subnet.go b/aws/table_aws_vpc_subnet.go index e0321f6d2..09d252441 100644 --- a/aws/table_aws_vpc_subnet.go +++ b/aws/table_aws_vpc_subnet.go @@ -24,9 +24,11 @@ func tableAwsVpcSubnet(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidSubnetID.Malformed", "InvalidSubnetID.NotFound"}), }, Hydrate: getVpcSubnet, + Tags: map[string]string{"service": "ec2", "action": "DescribeSubnets"}, }, List: &plugin.ListConfig{ Hydrate: listVpcSubnets, + Tags: map[string]string{"service": "ec2", "action": "DescribeSubnets"}, KeyColumns: []*plugin.KeyColumn{ {Name: "availability_zone", Require: plugin.Optional}, {Name: "availability_zone_id", Require: plugin.Optional}, @@ -204,6 +206,9 @@ func listVpcSubnets(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateD }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_vpc_subnet.listVpcSubnets", "api_error", err, "connection_name", d.Connection.Name, "region", d.EqualsQualString(matrixKeyRegion)) diff --git a/aws/table_aws_vpc_verified_access_endpoint.go b/aws/table_aws_vpc_verified_access_endpoint.go index 14d28265f..ba16ec414 100644 --- a/aws/table_aws_vpc_verified_access_endpoint.go +++ b/aws/table_aws_vpc_verified_access_endpoint.go @@ -26,9 +26,11 @@ func tableAwsVpcVerifiedAccessEndpoint(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValue", "InvalidVerifiedAccessEndpointId.NotFound", "InvalidAction"}), }, Hydrate: getVpcVerifiedAccessEndpoint, + Tags: map[string]string{"service": "ec2", "action": "DescribeVerifiedAccessEndpoints"}, }, List: &plugin.ListConfig{ Hydrate: listVpcVerifiedAccessEndpoints, + Tags: map[string]string{"service": "ec2", "action": "DescribeVerifiedAccessEndpoints"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValue"}), }, @@ -190,6 +192,9 @@ func listVpcVerifiedAccessEndpoints(ctx context.Context, d *plugin.QueryData, _ } for { + // apply rate limiting + d.WaitForListRateLimit(ctx) + // List call resp, err := svc.DescribeVerifiedAccessEndpoints(ctx, input) diff --git a/aws/table_aws_vpc_verified_access_group.go b/aws/table_aws_vpc_verified_access_group.go index 4932e0ab9..08267db26 100644 --- a/aws/table_aws_vpc_verified_access_group.go +++ b/aws/table_aws_vpc_verified_access_group.go @@ -26,9 +26,11 @@ func tableAwsVpcVerifiedAccessGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValue", "InvalidVerifiedAccessGroupId.NotFound", "InvalidAction"}), }, Hydrate: getVpcVerifiedAccessGroup, + Tags: map[string]string{"service": "ec2", "action": "DescribeVerifiedAccessGroups"}, }, List: &plugin.ListConfig{ Hydrate: listVpcVerifiedAccessGroups, + Tags: map[string]string{"service": "ec2", "action": "DescribeVerifiedAccessGroups"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValue"}), }, @@ -145,6 +147,9 @@ func listVpcVerifiedAccessGroups(ctx context.Context, d *plugin.QueryData, _ *pl } for { + // apply rate limiting + d.WaitForListRateLimit(ctx) + // List call resp, err := svc.DescribeVerifiedAccessGroups(ctx, input) diff --git a/aws/table_aws_vpc_verified_access_instance.go b/aws/table_aws_vpc_verified_access_instance.go index 51262441f..5f670704a 100644 --- a/aws/table_aws_vpc_verified_access_instance.go +++ b/aws/table_aws_vpc_verified_access_instance.go @@ -22,6 +22,7 @@ func tableAwsVpcVerifiedAccessInstance(_ context.Context) *plugin.Table { Description: "AWS VPC Verified Access Instance", List: &plugin.ListConfig{ Hydrate: listVpcVerifiedAccessInstances, + Tags: map[string]string{"service": "ec2", "action": "DescribeVerifiedAccessInstances"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValue"}), }, @@ -113,6 +114,9 @@ func listVpcVerifiedAccessInstances(ctx context.Context, d *plugin.QueryData, _ } for { + // apply rate limiting + d.WaitForListRateLimit(ctx) + // List call resp, err := svc.DescribeVerifiedAccessInstances(ctx, input) diff --git a/aws/table_aws_vpc_verified_access_trust_provider.go b/aws/table_aws_vpc_verified_access_trust_provider.go index 3706dbd7e..b250113cd 100644 --- a/aws/table_aws_vpc_verified_access_trust_provider.go +++ b/aws/table_aws_vpc_verified_access_trust_provider.go @@ -22,6 +22,7 @@ func tableAwsVpcVerifiedAccessTrustProvider(_ context.Context) *plugin.Table { Description: "AWS VPC Verified Access Trust Provider", List: &plugin.ListConfig{ Hydrate: listVpcVerifiedAccessTrustProviders, + Tags: map[string]string{"service": "ec2", "action": "DescribeVerifiedAccessTrustProviders"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValue"}), }, @@ -133,6 +134,9 @@ func listVpcVerifiedAccessTrustProviders(ctx context.Context, d *plugin.QueryDat } for { + // apply rate limiting + d.WaitForListRateLimit(ctx) + // List call resp, err := svc.DescribeVerifiedAccessTrustProviders(ctx, input) diff --git a/aws/table_aws_vpc_vpn_connection.go b/aws/table_aws_vpc_vpn_connection.go index aa4df51a7..205fe1ebe 100644 --- a/aws/table_aws_vpc_vpn_connection.go +++ b/aws/table_aws_vpc_vpn_connection.go @@ -25,9 +25,11 @@ func tableAwsVpcVpnConnection(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidVpnConnectionID.NotFound", "InvalidVpnConnectionID.Malformed"}), }, Hydrate: getVpcVpnConnection, + Tags: map[string]string{"service": "ec2", "action": "DescribeVpnConnections"}, }, List: &plugin.ListConfig{ Hydrate: listVpcVpnConnections, + Tags: map[string]string{"service": "ec2", "action": "DescribeVpnConnections"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidParameterValue"}), }, diff --git a/aws/table_aws_vpc_vpn_gateway.go b/aws/table_aws_vpc_vpn_gateway.go index eb65df445..857b5c3b9 100644 --- a/aws/table_aws_vpc_vpn_gateway.go +++ b/aws/table_aws_vpc_vpn_gateway.go @@ -23,9 +23,11 @@ func tableAwsVpcVpnGateway(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"InvalidVpnGatewayID.NotFound", "InvalidVpnGatewayID.Malformed"}), }, Hydrate: getVpcVpnGateway, + Tags: map[string]string{"service": "ec2", "action": "DescribeVpnGateways"}, }, List: &plugin.ListConfig{ Hydrate: listVpcVpnGateways, + Tags: map[string]string{"service": "ec2", "action": "DescribeVpnGateways"}, KeyColumns: []*plugin.KeyColumn{ {Name: "amazon_side_asn", Require: plugin.Optional}, {Name: "availability_zone", Require: plugin.Optional}, diff --git a/aws/table_aws_waf_rate_based_rule.go b/aws/table_aws_waf_rate_based_rule.go index 0b63a2348..b90d3b7e8 100644 --- a/aws/table_aws_waf_rate_based_rule.go +++ b/aws/table_aws_waf_rate_based_rule.go @@ -23,9 +23,21 @@ func tableAwsWafRateBasedRule(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"WAFNonexistentItemException", "ValidationException"}), }, Hydrate: getAwsWafRateBasedRule, + Tags: map[string]string{"service": "waf", "action": "GetRateBasedRule"}, }, List: &plugin.ListConfig{ Hydrate: listAwsWafRateBasedRules, + Tags: map[string]string{"service": "waf", "action": "ListRateBasedRules"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsWafRateBasedRule, + Tags: map[string]string{"service": "waf", "action": "GetRateBasedRule"}, + }, + { + Func: listAwsWafRateBasedRuleTags, + Tags: map[string]string{"service": "waf", "action": "ListTagsForResource"}, + }, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { @@ -123,6 +135,9 @@ func listAwsWafRateBasedRules(ctx context.Context, d *plugin.QueryData, _ *plugi pagesLeft := true for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + response, err := svc.ListRateBasedRules(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_waf_rate_based_rule.listAwsWafRateBasedRules", "api_error", err) diff --git a/aws/table_aws_waf_rule.go b/aws/table_aws_waf_rule.go index 64ec8c902..ef1f66d2b 100644 --- a/aws/table_aws_waf_rule.go +++ b/aws/table_aws_waf_rule.go @@ -21,9 +21,21 @@ func tableAwsWAFRule(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"WAFNonexistentItemException"}), }, Hydrate: getAwsWAFRule, + Tags: map[string]string{"service": "waf", "action": "GetRule"}, }, List: &plugin.ListConfig{ Hydrate: listAwsWAFRules, + Tags: map[string]string{"service": "waf", "action": "ListRules"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsWAFRule, + Tags: map[string]string{"service": "waf", "action": "GetRule"}, + }, + { + Func: getAwsWAFRuleTags, + Tags: map[string]string{"service": "waf", "action": "ListTagsForResource"}, + }, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { @@ -109,6 +121,9 @@ func listAwsWAFRules(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydrate pagesLeft := true for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + response, err := svc.ListRules(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_waf_rule.listAwsWAFRules", "api_error", err) diff --git a/aws/table_aws_waf_rule_group.go b/aws/table_aws_waf_rule_group.go index e46c7e978..e20675039 100644 --- a/aws/table_aws_waf_rule_group.go +++ b/aws/table_aws_waf_rule_group.go @@ -24,9 +24,25 @@ func tableAwsWafRuleGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NonexistentItemException", "WAFNonexistentItemException"}), }, Hydrate: getWafRuleGroup, + Tags: map[string]string{"service": "waf", "action": "GetRuleGroup"}, }, List: &plugin.ListConfig{ Hydrate: listWafRuleGroups, + Tags: map[string]string{"service": "waf", "action": "ListRuleGroups"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getWafRuleGroup, + Tags: map[string]string{"service": "waf", "action": "GetRuleGroup"}, + }, + { + Func: getWafRuleGroupActivatedRules, + Tags: map[string]string{"service": "sso", "action": "ListActivatedRulesInRuleGroup"}, + }, + { + Func: listTagsForWafRuleGroup, + Tags: map[string]string{"service": "waf", "action": "ListTagsForResource"}, + }, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { @@ -116,6 +132,9 @@ func listWafRuleGroups(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydra } for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + response, err := svc.ListRuleGroups(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_waf_rule_group.listWafRuleGroups", "api_error", err) diff --git a/aws/table_aws_waf_web_acl.go b/aws/table_aws_waf_web_acl.go index 2cef15702..99f27fac3 100644 --- a/aws/table_aws_waf_web_acl.go +++ b/aws/table_aws_waf_web_acl.go @@ -27,9 +27,25 @@ func tableAwsWafWebAcl(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"WAFNonexistentItemException", "WAFInvalidParameterException"}), }, Hydrate: getWafWebAcl, + Tags: map[string]string{"service": "waf", "action": "GetWebACL"}, }, List: &plugin.ListConfig{ Hydrate: listWafWebAcls, + Tags: map[string]string{"service": "waf", "action": "ListWebACLs"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getWafWebAcl, + Tags: map[string]string{"service": "waf", "action": "GetWebACL"}, + }, + { + Func: getClassicLoggingConfiguration, + Tags: map[string]string{"service": "waf", "action": "GetLoggingConfiguration"}, + }, + { + Func: listTagsForWafWebAcl, + Tags: map[string]string{"service": "waf", "action": "ListTagsForResource"}, + }, }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { @@ -132,6 +148,9 @@ func listWafWebAcls(ctx context.Context, d *plugin.QueryData, _ *plugin.HydrateD // API doesn't support aws-sdk-go-v2 paginator as of date pagesLeft := true for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + response, err := svc.ListWebACLs(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_waf_web_acl.listWafWebAcls", "api_error", err) diff --git a/aws/table_aws_wafregional_rule.go b/aws/table_aws_wafregional_rule.go index 97a60eb96..4d0112c8e 100644 --- a/aws/table_aws_wafregional_rule.go +++ b/aws/table_aws_wafregional_rule.go @@ -28,14 +28,22 @@ func tableAwsWAFRegionalRule(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"WAFNonexistentItemException"}), }, Hydrate: getAwsWAFRegionalRule, + Tags: map[string]string{"service": "waf-regional", "action": "GetRule"}, }, List: &plugin.ListConfig{ IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"WAFNonexistentItemException"}), }, Hydrate: listAwsWAFRegionalRules, + Tags: map[string]string{"service": "waf-regional", "action": "ListRules"}, }, GetMatrixItemFunc: SupportedRegionMatrix(wafregionalv1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsWAFRegionalRule, + Tags: map[string]string{"service": "waf-regional", "action": "GetRule"}, + }, + }, Columns: awsGlobalRegionColumns([]*plugin.Column{ { Name: "name", @@ -116,6 +124,9 @@ func listAwsWAFRegionalRules(ctx context.Context, d *plugin.QueryData, _ *plugin // API doesn't support aws-sdk-go-v2 paginator as of date pagesLeft := true for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + response, err := svc.ListRules(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_wafregional_rule.listAwsWAFRegionalRules", "api_error", err) diff --git a/aws/table_aws_wafregional_rule_group.go b/aws/table_aws_wafregional_rule_group.go index 24bd931f0..7657a24bf 100644 --- a/aws/table_aws_wafregional_rule_group.go +++ b/aws/table_aws_wafregional_rule_group.go @@ -25,11 +25,27 @@ func tableAwsWafRegionalRuleGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"NonexistentItemException", "WAFNonexistentItemException"}), }, Hydrate: getWafRegionalRuleGroup, + Tags: map[string]string{"service": "waf-regional", "action": "GetRuleGroup"}, }, List: &plugin.ListConfig{ Hydrate: listWafRegionalRuleGroups, + Tags: map[string]string{"service": "waf-regional", "action": "ListRuleGroups"}, }, GetMatrixItemFunc: SupportedRegionMatrix(wafregionalv1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getWafRegionalRuleGroup, + Tags: map[string]string{"service": "waf-regional", "action": "GetRuleGroup"}, + }, + { + Func: getWafRegionalRuleGroupActivatedRules, + Tags: map[string]string{"service": "waf-regional", "action": "ListActivatedRulesInRuleGroup"}, + }, + { + Func: listTagsForWafRegionalRuleGroup, + Tags: map[string]string{"service": "waf-regional", "action": "ListTagsForResource"}, + }, + }, Columns: awsRegionalColumns([]*plugin.Column{ { Name: "name", @@ -123,6 +139,9 @@ func listWafRegionalRuleGroups(ctx context.Context, d *plugin.QueryData, _ *plug } for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + response, err := svc.ListRuleGroups(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_wafregional_rule_group.listWafRegionalRuleGroups", "api_error", err) diff --git a/aws/table_aws_wafregional_web_acl.go b/aws/table_aws_wafregional_web_acl.go index dcaef4fd2..d0c22cdd3 100644 --- a/aws/table_aws_wafregional_web_acl.go +++ b/aws/table_aws_wafregional_web_acl.go @@ -28,11 +28,31 @@ func tableAwsWafRegionalWebAcl(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"WAFNonexistentItemException", "WAFInvalidParameterException"}), }, Hydrate: getWafRegionalWebAcl, + Tags: map[string]string{"service": "waf-regional", "action": "GetWebACL"}, }, List: &plugin.ListConfig{ Hydrate: listWafRegionalWebAcls, + Tags: map[string]string{"service": "waf-regional", "action": "ListWebACLs"}, }, GetMatrixItemFunc: SupportedRegionMatrix(wafregionalv1.EndpointsID), + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getWafRegionalWebAcl, + Tags: map[string]string{"service": "waf-regional", "action": "GetWebACL"}, + }, + { + Func: getWafRegionalLoggingConfiguration, + Tags: map[string]string{"service": "waf-regional", "action": "GetLoggingConfiguration"}, + }, + { + Func: getWafRegionalResources, + Tags: map[string]string{"service": "waf-regional", "action": "ListResourcesForWebACL"}, + }, + { + Func: listTagsForWafRegionalWebAcl, + Tags: map[string]string{"service": "waf-regional", "action": "ListTagsForResource"}, + }, + }, Columns: awsRegionalColumns([]*plugin.Column{ { Name: "name", @@ -127,7 +147,7 @@ func listWafRegionalWebAcls(ctx context.Context, d *plugin.QueryData, _ *plugin. plugin.Logger(ctx).Error("aws_wafregional_web_acl.listWafRegionalWebAcls", "client_error", err) return nil, err } - + maxItems := int32(100) // Reduce the basic request limit down if the user has only requested a small number of rows @@ -145,6 +165,9 @@ func listWafRegionalWebAcls(ctx context.Context, d *plugin.QueryData, _ *plugin. // API doesn't support aws-sdk-go-v2 paginator as of date pagesLeft := true for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + response, err := svc.ListWebACLs(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_wafregional_web_acl.listWafRegionalWebAcls", "api_error", err) diff --git a/aws/table_aws_wafv2_ip_set.go b/aws/table_aws_wafv2_ip_set.go index ae21a69ea..0b94c98fb 100644 --- a/aws/table_aws_wafv2_ip_set.go +++ b/aws/table_aws_wafv2_ip_set.go @@ -24,11 +24,23 @@ func tableAwsWafv2IpSet(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"WAFNonexistentItemException", "WAFInvalidParameterException", "InvalidParameter", "ValidationException"}), }, Hydrate: getAwsWafv2IpSet, + Tags: map[string]string{"service": "wafv2", "action": "GetIPSet"}, }, List: &plugin.ListConfig{ Hydrate: listAwsWafv2IpSets, + Tags: map[string]string{"service": "wafv2", "action": "ListIPSets"}, }, GetMatrixItemFunc: WAFRegionMatrix, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsWafv2IpSet, + Tags: map[string]string{"service": "wafv2", "action": "GetIPSet"}, + }, + { + Func: listTagsForAwsWafv2IpSet, + Tags: map[string]string{"service": "wafv2", "action": "ListTagsForResource"}, + }, + }, Columns: awsAccountColumns([]*plugin.Column{ { Name: "name", @@ -158,6 +170,9 @@ func listAwsWafv2IpSets(ctx context.Context, d *plugin.QueryData, _ *plugin.Hydr // ListIPSets API doesn't support aws-sdk-go-v2 paginator yet for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + response, err := svc.ListIPSets(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_wafv2_ip_set.listAwsWafv2IpSets", "api_error", err) diff --git a/aws/table_aws_wafv2_regex_pattern_set.go b/aws/table_aws_wafv2_regex_pattern_set.go index ca015f5ab..6b5f28ccf 100644 --- a/aws/table_aws_wafv2_regex_pattern_set.go +++ b/aws/table_aws_wafv2_regex_pattern_set.go @@ -24,11 +24,23 @@ func tableAwsWafv2RegexPatternSet(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"WAFInvalidParameterException", "WAFNonexistentItemException", "ValidationException", "InvalidParameter"}), }, Hydrate: getAwsWafv2RegexPatternSet, + Tags: map[string]string{"service": "wafv2", "action": "GetRegexPatternSet"}, }, List: &plugin.ListConfig{ Hydrate: listAwsWafv2RegexPatternSets, + Tags: map[string]string{"service": "wafv2", "action": "ListRegexPatternSets"}, }, GetMatrixItemFunc: WAFRegionMatrix, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsWafv2RegexPatternSet, + Tags: map[string]string{"service": "wafv2", "action": "GetRegexPatternSet"}, + }, + { + Func: listTagsForAwsWafv2RegexPatternSet, + Tags: map[string]string{"service": "wafv2", "action": "ListTagsForResource"}, + }, + }, Columns: awsAccountColumns([]*plugin.Column{ { Name: "name", @@ -154,6 +166,9 @@ func listAwsWafv2RegexPatternSets(ctx context.Context, d *plugin.QueryData, _ *p // ListRegexPatternSets API doesn't support aws-sdk-go-v2 paginator yet for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + response, err := svc.ListRegexPatternSets(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_wafv2_regex_pattern_set.listAwsWafv2RegexPatternSets", "api_error", err) diff --git a/aws/table_aws_wafv2_rule_group.go b/aws/table_aws_wafv2_rule_group.go index a97328ef9..3872400ab 100644 --- a/aws/table_aws_wafv2_rule_group.go +++ b/aws/table_aws_wafv2_rule_group.go @@ -24,11 +24,23 @@ func tableAwsWafv2RuleGroup(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"WAFInvalidParameterException", "WAFNonexistentItemException", "ValidationException", "InvalidParameter"}), }, Hydrate: getAwsWafv2RuleGroup, + Tags: map[string]string{"service": "wafv2", "action": "GetRuleGroup"}, }, List: &plugin.ListConfig{ Hydrate: listAwsWafv2RuleGroups, + Tags: map[string]string{"service": "wafv2", "action": "ListRuleGroups"}, }, GetMatrixItemFunc: WAFRegionMatrix, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsWafv2RuleGroup, + Tags: map[string]string{"service": "wafv2", "action": "GetRuleGroup"}, + }, + { + Func: listTagsForAwsWafv2RuleGroup, + Tags: map[string]string{"service": "wafv2", "action": "ListTagsForResource"}, + }, + }, Columns: awsAccountColumns([]*plugin.Column{ { Name: "name", @@ -169,6 +181,9 @@ func listAwsWafv2RuleGroups(ctx context.Context, d *plugin.QueryData, _ *plugin. // ListRuleGroups API doesn't support aws-sdk-go-v2 paginator yet for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + response, err := svc.ListRuleGroups(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_wafv2_rule_group.listAwsWafv2RuleGroups", "api_error", err) diff --git a/aws/table_aws_wafv2_web_acl.go b/aws/table_aws_wafv2_web_acl.go index 28f29f310..e26ded53e 100644 --- a/aws/table_aws_wafv2_web_acl.go +++ b/aws/table_aws_wafv2_web_acl.go @@ -28,11 +28,31 @@ func tableAwsWafv2WebAcl(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"WAFNonexistentItemException", "WAFInvalidParameterException"}), }, Hydrate: getAwsWafv2WebAcl, + Tags: map[string]string{"service": "wafv2", "action": "GetWebACL"}, }, List: &plugin.ListConfig{ Hydrate: listAwsWafv2WebAcls, + Tags: map[string]string{"service": "wafv2", "action": "ListWebACLs"}, }, GetMatrixItemFunc: WAFRegionMatrix, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getAwsWafv2WebAcl, + Tags: map[string]string{"service": "wafv2", "action": "GetWebACL"}, + }, + { + Func: listAssociatedResources, + Tags: map[string]string{"service": "wafv2", "action": "ListResourcesForWebACL"}, + }, + { + Func: getLoggingConfiguration, + Tags: map[string]string{"service": "wafv2", "action": "GetLoggingConfiguration"}, + }, + { + Func: listTagsForAwsWafv2WebAcl, + Tags: map[string]string{"service": "wafv2", "action": "ListTagsForResource"}, + }, + }, Columns: awsAccountColumns([]*plugin.Column{ { Name: "name", @@ -201,6 +221,9 @@ func listAwsWafv2WebAcls(ctx context.Context, d *plugin.QueryData, _ *plugin.Hyd // ListWebACLs API doesn't support aws-sdk-go-v2 paginator yet for pagesLeft { + // apply rate limiting + d.WaitForListRateLimit(ctx) + response, err := svc.ListWebACLs(ctx, params) if err != nil { plugin.Logger(ctx).Error("aws_wafv2_web_acl.listAwsWafv2WebAcls", "api_error", err) diff --git a/aws/table_aws_wellarchitected_answer.go b/aws/table_aws_wellarchitected_answer.go index 0dd0709e1..adae8d5f1 100644 --- a/aws/table_aws_wellarchitected_answer.go +++ b/aws/table_aws_wellarchitected_answer.go @@ -31,10 +31,12 @@ func tableAwsWellArchitectedAnswer(_ context.Context) *plugin.Table { {Name: "milestone_number", Require: plugin.Optional}, }, Hydrate: getWellArchitectedAnswer, + Tags: map[string]string{"service": "wellarchitected", "action": "GetAnswer"}, }, List: &plugin.ListConfig{ ParentHydrate: listWellArchitectedWorkloads, Hydrate: listWellArchitectedAnswers, + Tags: map[string]string{"service": "wellarchitected", "action": "ListAnswers"}, KeyColumns: []*plugin.KeyColumn{ {Name: "lens_alias", Require: plugin.Optional}, {Name: "pillar_id", Require: plugin.Optional}, @@ -42,6 +44,12 @@ func tableAwsWellArchitectedAnswer(_ context.Context) *plugin.Table { {Name: "milestone_number", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getWellArchitectedAnswer, + Tags: map[string]string{"service": "wellarchitected", "action": "GetAnswer"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(wellarchitectedv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -229,6 +237,9 @@ func listWellArchitectedAnswers(ctx context.Context, d *plugin.QueryData, h *plu // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { var ae smithy.APIError diff --git a/aws/table_aws_wellarchitected_check_detail.go b/aws/table_aws_wellarchitected_check_detail.go index 081246bbf..a4238ffdb 100644 --- a/aws/table_aws_wellarchitected_check_detail.go +++ b/aws/table_aws_wellarchitected_check_detail.go @@ -26,6 +26,7 @@ func tableAwsWellArchitectedCheckDetail(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listWellArchitectedWorkloads, Hydrate: listWellArchitectedCheckDetails, + Tags: map[string]string{"service": "wellarchitected", "action": "ListCheckDetails"}, // IgnoreConfig: &plugin.IgnoreConfig{ // ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "ValidationException"}), // }, @@ -215,6 +216,9 @@ func fetchWellArchitectedCheckDetails(ctx context.Context, d *plugin.QueryData, }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { var ae smithy.APIError @@ -292,6 +296,9 @@ func getAnswerDetailsForWorkload(ctx context.Context, d *plugin.QueryData, h *pl // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { var ae smithy.APIError diff --git a/aws/table_aws_wellarchitected_check_summary.go b/aws/table_aws_wellarchitected_check_summary.go index aecfa2021..c8d0f6fa2 100644 --- a/aws/table_aws_wellarchitected_check_summary.go +++ b/aws/table_aws_wellarchitected_check_summary.go @@ -24,6 +24,7 @@ func tableAwsWellArchitectedCheckSummary(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listWellArchitectedWorkloads, Hydrate: listWellArchitectedCheckSummaries, + Tags: map[string]string{"service": "wellarchitected", "action": "ListCheckSummaries"}, // IgnoreConfig: &plugin.IgnoreConfig{ // ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "ValidationException"}), // }, @@ -200,6 +201,9 @@ func fetchWellArchitectedCheckSummaries(ctx context.Context, d *plugin.QueryData }) for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { if strings.Contains(err.Error(), "ResourceNotFoundException") || strings.Contains(err.Error(), "ValidationException") { diff --git a/aws/table_aws_wellarchitected_consolidated_report.go b/aws/table_aws_wellarchitected_consolidated_report.go index 3548373bb..4a76ffb1f 100644 --- a/aws/table_aws_wellarchitected_consolidated_report.go +++ b/aws/table_aws_wellarchitected_consolidated_report.go @@ -21,6 +21,7 @@ func tableAwsWellArchitectedConsolidatedReport(_ context.Context) *plugin.Table Description: "AWS Well-Architected Consolidated Report", List: &plugin.ListConfig{ Hydrate: listWellArchitectedConsolidatedReports, + Tags: map[string]string{"service": "wellarchitected", "action": "GetConsolidatedReport"}, KeyColumns: plugin.KeyColumnSlice{ { Name: "include_shared_resources", @@ -28,6 +29,12 @@ func tableAwsWellArchitectedConsolidatedReport(_ context.Context) *plugin.Table }, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: listWellArchitectedConsolidatedReportBase64, + Tags: map[string]string{"service": "wellarchitected", "action": "GetConsolidatedReport"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(wellarchitectedv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -128,6 +135,9 @@ func listWellArchitectedConsolidatedReports(ctx context.Context, d *plugin.Query // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_wellarchitected_consolidated_report.listWellArchitectedConsolidatedReports", "api_error", err) @@ -177,6 +187,9 @@ func listWellArchitectedConsolidatedReportBase64(ctx context.Context, d *plugin. var pdfFormatbase64Encoded []*string // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_wellarchitected_consolidated_report.listWellArchitectedConsolidatedReportBase64", "api_error", err) diff --git a/aws/table_aws_wellarchitected_lens.go b/aws/table_aws_wellarchitected_lens.go index c0bca935a..a2313c7e0 100644 --- a/aws/table_aws_wellarchitected_lens.go +++ b/aws/table_aws_wellarchitected_lens.go @@ -23,6 +23,7 @@ func tableAwsWellArchitectedLens(_ context.Context) *plugin.Table { Description: "AWS Well-Architected Lens", List: &plugin.ListConfig{ Hydrate: listWellArchitectedLenses, + Tags: map[string]string{"service": "wellarchitected", "action": "ListLenses"}, IgnoreConfig: &plugin.IgnoreConfig{ ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "ValidationException"}), }, @@ -32,6 +33,12 @@ func tableAwsWellArchitectedLens(_ context.Context) *plugin.Table { {Name: "lens_type", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getWellArchitectedLens, + Tags: map[string]string{"service": "wellarchitected", "action": "GetLens"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(wellarchitectedv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -175,6 +182,9 @@ func listWellArchitectedLenses(ctx context.Context, d *plugin.QueryData, _ *plug // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_wellarchitected_lens.listWellArchitectedLenses", "api_error", err) diff --git a/aws/table_aws_wellarchitected_lens_review.go b/aws/table_aws_wellarchitected_lens_review.go index 7746ad5b0..fc4ca6f4e 100644 --- a/aws/table_aws_wellarchitected_lens_review.go +++ b/aws/table_aws_wellarchitected_lens_review.go @@ -31,10 +31,12 @@ func tableAwsWellArchitectedLensReview(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException", "ValidationException"}), }, Hydrate: getWellArchitectedLensReview, + Tags: map[string]string{"service": "wellarchitected", "action": "GetLensReview"}, }, List: &plugin.ListConfig{ ParentHydrate: listWellArchitectedWorkloads, Hydrate: listWellArchitectedLensReviews, + Tags: map[string]string{"service": "wellarchitected", "action": "ListLensReviews"}, KeyColumns: []*plugin.KeyColumn{ {Name: "workload_id", Require: plugin.Optional}, {Name: "milestone_number", Require: plugin.Optional, CacheMatch: "exact"}, @@ -45,6 +47,12 @@ func tableAwsWellArchitectedLensReview(_ context.Context) *plugin.Table { // ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), //}, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getWellArchitectedLensReview, + Tags: map[string]string{"service": "wellarchitected", "action": "GetLensReview"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(wellarchitectedv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -182,6 +190,9 @@ func listWellArchitectedLensReviews(ctx context.Context, d *plugin.QueryData, h // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { // TODO: Shouldn't be needed, but the List IgnoreConfig doesn't seem to diff --git a/aws/table_aws_wellarchitected_lens_review_improvement.go b/aws/table_aws_wellarchitected_lens_review_improvement.go index 6dcaf040c..86cf86369 100644 --- a/aws/table_aws_wellarchitected_lens_review_improvement.go +++ b/aws/table_aws_wellarchitected_lens_review_improvement.go @@ -26,6 +26,7 @@ func tableAwsWellArchitectedLensReviewImprovement(_ context.Context) *plugin.Tab List: &plugin.ListConfig{ ParentHydrate: listWellArchitectedWorkloads, Hydrate: listWellArchitectedLensReviewImprovements, + Tags: map[string]string{"service": "wellarchitected", "action": "ListLensReviewImprovements"}, // TODO: Uncomment and remove extra check in // listWellArchitectedLensReviewImprovements function once this works again // IgnoreConfig: &plugin.IgnoreConfig{ @@ -189,6 +190,9 @@ func stereamlistLensReviewImprovements(ctx context.Context, d *plugin.QueryData, // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { // Adding the igone confog in the list config does not seems to work, so we have handles it here. diff --git a/aws/table_aws_wellarchitected_lens_review_report.go b/aws/table_aws_wellarchitected_lens_review_report.go index 5099f3ad7..cc9d8c640 100644 --- a/aws/table_aws_wellarchitected_lens_review_report.go +++ b/aws/table_aws_wellarchitected_lens_review_report.go @@ -26,6 +26,7 @@ func tableAwsWellArchitectedLensReviewReport(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listWellArchitectedWorkloads, Hydrate: getWellArchitectedLensReviewReports, + Tags: map[string]string{"service": "wellarchitected", "action": "GetLensReviewReport"}, // TODO: Uncomment and remove extra check in // IgnoreConfig: &plugin.IgnoreConfig{ // ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), diff --git a/aws/table_aws_wellarchitected_lens_share.go b/aws/table_aws_wellarchitected_lens_share.go index ad2e9ac5e..1fbf78c64 100644 --- a/aws/table_aws_wellarchitected_lens_share.go +++ b/aws/table_aws_wellarchitected_lens_share.go @@ -25,6 +25,7 @@ func tableAwsWellArchitectedLensShare(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listWellArchitectedLenses, Hydrate: listWellArchitectedLensShares, + Tags: map[string]string{"service": "wellarchitected", "action": "ListLensShares"}, // TODO: Uncomment and remove extra check in // listWellArchitectedLensShares function once this works again // IgnoreConfig: &plugin.IgnoreConfig{ @@ -151,6 +152,9 @@ func listWellArchitectedLensShares(ctx context.Context, d *plugin.QueryData, h * // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { var ae smithy.APIError diff --git a/aws/table_aws_wellarchitected_milestone.go b/aws/table_aws_wellarchitected_milestone.go index 718a390c3..383814e41 100644 --- a/aws/table_aws_wellarchitected_milestone.go +++ b/aws/table_aws_wellarchitected_milestone.go @@ -27,14 +27,22 @@ func tableAwsWellArchitectedMilestone(_ context.Context) *plugin.Table { {Name: "workload_id", Require: plugin.Required}, }, Hydrate: getWellArchitectedMilestone, + Tags: map[string]string{"service": "wellarchitected", "action": "GetMilestone"}, }, List: &plugin.ListConfig{ ParentHydrate: listWellArchitectedWorkloads, Hydrate: listWellArchitectedMilestones, + Tags: map[string]string{"service": "wellarchitected", "action": "ListMilestones"}, KeyColumns: []*plugin.KeyColumn{ {Name: "workload_id", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getWellArchitectedMilestone, + Tags: map[string]string{"service": "wellarchitected", "action": "GetMilestone"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(wellarchitectedv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -113,6 +121,9 @@ func listWellArchitectedMilestones(ctx context.Context, d *plugin.QueryData, h * // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { if strings.Contains(err.Error(), "NotFoundException") || strings.Contains(err.Error(), "ValidationException") { diff --git a/aws/table_aws_wellarchitected_notification.go b/aws/table_aws_wellarchitected_notification.go index be2ede799..bd3346b69 100644 --- a/aws/table_aws_wellarchitected_notification.go +++ b/aws/table_aws_wellarchitected_notification.go @@ -21,6 +21,7 @@ func tableAwsWellArchitectedNotification(_ context.Context) *plugin.Table { Description: "AWS Well-Architected Notification", List: &plugin.ListConfig{ Hydrate: listWellArchitectedNotifications, + Tags: map[string]string{"service": "wellarchitected", "action": "ListNotifications"}, KeyColumns: []*plugin.KeyColumn{ {Name: "workload_id", Require: plugin.Optional}, }, @@ -110,6 +111,9 @@ func listWellArchitectedNotifications(ctx context.Context, d *plugin.QueryData, // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_wellarchitected_notification.listWellArchitectedNotifications", "api_error", err) diff --git a/aws/table_aws_wellarchitected_share_invitation.go b/aws/table_aws_wellarchitected_share_invitation.go index 744272f8d..729899916 100644 --- a/aws/table_aws_wellarchitected_share_invitation.go +++ b/aws/table_aws_wellarchitected_share_invitation.go @@ -23,10 +23,11 @@ func tableAwsWellArchitectedShareInvitation(_ context.Context) *plugin.Table { Description: "AWS Well-Architected Share Invitation", List: &plugin.ListConfig{ Hydrate: listWellArchitectedShareInvitations, + Tags: map[string]string{"service": "wellarchitected", "action": "ListShareInvitations"}, KeyColumns: []*plugin.KeyColumn{ {Name: "workload_name", Require: plugin.Optional}, {Name: "lens_name", Require: plugin.Optional}, - {Name: "share_resource_type", Require: plugin.Optional}, + {Name: "share_resource_type", Require: plugin.Optional}, }, }, GetMatrixItemFunc: SupportedRegionMatrix(wellarchitectedv1.EndpointsID), @@ -141,6 +142,9 @@ func listWellArchitectedShareInvitations(ctx context.Context, d *plugin.QueryDat // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_wellarchitected_share_invitation.listWellArchitectedShareInvitations", "api_error", err) diff --git a/aws/table_aws_wellarchitected_workload.go b/aws/table_aws_wellarchitected_workload.go index 310525a4d..eb34728fa 100644 --- a/aws/table_aws_wellarchitected_workload.go +++ b/aws/table_aws_wellarchitected_workload.go @@ -26,13 +26,21 @@ func tableAwsWellArchitectedWorkload(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ResourceNotFoundException"}), }, Hydrate: getWellArchitectedWorkload, + Tags: map[string]string{"service": "wellarchitected", "action": "GetWorkload"}, }, List: &plugin.ListConfig{ Hydrate: listWellArchitectedWorkloads, + Tags: map[string]string{"service": "wellarchitected", "action": "ListWorkloads"}, KeyColumns: []*plugin.KeyColumn{ {Name: "workload_name", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: getWellArchitectedWorkload, + Tags: map[string]string{"service": "wellarchitected", "action": "GetWorkload"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(wellarchitectedv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -227,6 +235,9 @@ func listWellArchitectedWorkloads(ctx context.Context, d *plugin.QueryData, _ *p // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_wellarchitected_workload.listWellArchitectedWorkloads", "api_error", err) diff --git a/aws/table_aws_wellarchitected_workload_share.go b/aws/table_aws_wellarchitected_workload_share.go index 27298c59a..4ab184e47 100644 --- a/aws/table_aws_wellarchitected_workload_share.go +++ b/aws/table_aws_wellarchitected_workload_share.go @@ -24,6 +24,7 @@ func tableAwsWellArchitectedWorkloadShare(_ context.Context) *plugin.Table { List: &plugin.ListConfig{ ParentHydrate: listWellArchitectedWorkloads, Hydrate: listWellArchitectedWorkloadShares, + Tags: map[string]string{"service": "wellarchitected", "action": "ListWorkloadShares"}, KeyColumns: []*plugin.KeyColumn{ {Name: "workload_id", Require: plugin.Optional}, {Name: "shared_with", Require: plugin.Optional}, @@ -141,6 +142,9 @@ func listWellArchitectedWorkloadShares(ctx context.Context, d *plugin.QueryData, // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { if strings.Contains(err.Error(), "ResourceNotFoundException") { diff --git a/aws/table_aws_workspaces_directory.go b/aws/table_aws_workspaces_directory.go index 9a8e58cba..9e759a99d 100644 --- a/aws/table_aws_workspaces_directory.go +++ b/aws/table_aws_workspaces_directory.go @@ -23,12 +23,20 @@ func tableAwsWorkspacesDirectory(_ context.Context) *plugin.Table { Get: &plugin.GetConfig{ KeyColumns: plugin.SingleColumn("directory_id"), IgnoreConfig: &plugin.IgnoreConfig{ - ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationException", "InvalidParameterValuesException"}), + ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationException", "InvalidParameterValuesException"}), }, Hydrate: getWorkspacesDirectory, + Tags: map[string]string{"service": "workspaces", "action": "DescribeWorkspaceDirectories"}, }, List: &plugin.ListConfig{ Hydrate: listWorkspacesDirectories, + Tags: map[string]string{"service": "workspaces", "action": "DescribeWorkspaceDirectories"}, + }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: listWorkspacesDirectoriesTags, + Tags: map[string]string{"service": "workspaces", "action": "DescribeTags"}, + }, }, GetMatrixItemFunc: SupportedRegionMatrix(workspacesv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ @@ -184,7 +192,7 @@ func listWorkspacesDirectories(ctx context.Context, d *plugin.QueryData, h *plug if d.QueryContext.Limit != nil { limit := int32(*d.QueryContext.Limit) if limit < maxLimit { - maxLimit = limit + maxLimit = limit } } @@ -198,6 +206,9 @@ func listWorkspacesDirectories(ctx context.Context, d *plugin.QueryData, h *plug // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_workspaces_directory.listWorkspacesDirectories", "api_error", err) diff --git a/aws/table_aws_workspaces_workspace.go b/aws/table_aws_workspaces_workspace.go index 6b672e2aa..e6246406f 100644 --- a/aws/table_aws_workspaces_workspace.go +++ b/aws/table_aws_workspaces_workspace.go @@ -26,15 +26,23 @@ func tableAwsWorkspace(_ context.Context) *plugin.Table { ShouldIgnoreErrorFunc: shouldIgnoreErrors([]string{"ValidationException"}), }, Hydrate: getWorkspace, + Tags: map[string]string{"service": "workspaces", "action": "DescribeWorkspaces"}, }, List: &plugin.ListConfig{ Hydrate: listWorkspaces, + Tags: map[string]string{"service": "workspaces", "action": "DescribeWorkspaces"}, KeyColumns: []*plugin.KeyColumn{ {Name: "bundle_id", Require: plugin.Optional}, {Name: "directory_id", Require: plugin.Optional}, {Name: "user_name", Require: plugin.Optional}, }, }, + HydrateConfig: []plugin.HydrateConfig{ + { + Func: listWorkspacesTags, + Tags: map[string]string{"service": "workspaces", "action": "DescribeTags"}, + }, + }, GetMatrixItemFunc: SupportedRegionMatrix(workspacesv1.EndpointsID), Columns: awsRegionalColumns([]*plugin.Column{ { @@ -209,6 +217,9 @@ func listWorkspaces(ctx context.Context, d *plugin.QueryData, h *plugin.HydrateD // List call for paginator.HasMorePages() { + // apply rate limiting + d.WaitForListRateLimit(ctx) + output, err := paginator.NextPage(ctx) if err != nil { plugin.Logger(ctx).Error("aws_workspaces_workspace.listWorkspaces", "api_error", err) diff --git a/go.mod b/go.mod index fdb2903e6..802fa6056 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/turbot/steampipe-plugin-aws -go 1.19 +go 1.21 require ( github.com/aws/aws-sdk-go v1.44.189 @@ -120,22 +120,22 @@ require ( github.com/aws/smithy-go v1.14.1 github.com/gocarina/gocsv v0.0.0-20201208093247-67c824bc04d4 github.com/golang/protobuf v1.5.3 - github.com/turbot/go-kit v0.6.0 - github.com/turbot/steampipe-plugin-sdk/v5 v5.5.2 - golang.org/x/text v0.8.0 + github.com/turbot/go-kit v0.8.0-rc.0 + github.com/turbot/steampipe-plugin-sdk/v5 v5.6.1 + golang.org/x/text v0.11.0 ) require ( - cloud.google.com/go v0.110.0 // indirect - cloud.google.com/go/compute v1.18.0 // indirect + cloud.google.com/go v0.110.4 // indirect + cloud.google.com/go/compute v1.21.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v0.12.0 // indirect - cloud.google.com/go/storage v1.28.1 // indirect + cloud.google.com/go/iam v1.1.1 // indirect + cloud.google.com/go/storage v1.30.1 // indirect github.com/XiaoMi/pegasus-go-client v0.0.0-20210427083443-f3b6b08bc4c2 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect github.com/agext/levenshtein v1.2.2 // indirect github.com/allegro/bigcache/v3 v3.1.0 // indirect - github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect + github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.21 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 // indirect @@ -160,7 +160,7 @@ require ( github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/eko/gocache/v3 v3.1.2 // indirect - github.com/fatih/color v1.13.0 // indirect + github.com/fatih/color v1.15.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gertd/go-pluralize v0.2.1 // indirect github.com/ghodss/yaml v1.0.0 // indirect @@ -170,23 +170,24 @@ require ( github.com/golang/glog v1.1.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/go-cmp v0.5.9 // indirect + github.com/google/s2a-go v0.1.4 // indirect github.com/google/uuid v1.3.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect + github.com/googleapis/gax-go/v2 v2.11.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.7.1 // indirect - github.com/hashicorp/go-hclog v1.4.0 // indirect - github.com/hashicorp/go-plugin v1.4.10 // indirect + github.com/hashicorp/go-getter v1.7.2 // indirect + github.com/hashicorp/go-hclog v1.5.0 // indirect + github.com/hashicorp/go-plugin v1.5.2 // indirect github.com/hashicorp/go-safetemp v1.0.0 // indirect github.com/hashicorp/go-version v1.6.0 // indirect - github.com/hashicorp/hcl/v2 v2.15.0 // indirect + github.com/hashicorp/hcl/v2 v2.18.0 // indirect github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d // indirect - github.com/iancoleman/strcase v0.2.0 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/klauspost/compress v1.15.11 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect @@ -208,30 +209,34 @@ require ( github.com/stevenle/topsort v0.2.0 // indirect github.com/tkrajina/go-reflector v0.5.6 // indirect github.com/ulikunitz/xz v0.5.10 // indirect - github.com/zclconf/go-cty v1.12.1 // indirect + github.com/zclconf/go-cty v1.14.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel v1.16.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.39.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.39.0 // indirect + go.opentelemetry.io/otel v1.17.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.17.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.40.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.40.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect - go.opentelemetry.io/otel/sdk v1.16.0 // indirect - go.opentelemetry.io/otel/sdk/metric v0.39.0 // indirect - go.opentelemetry.io/otel/trace v1.16.0 // indirect - go.opentelemetry.io/proto/otlp v0.19.0 // indirect + go.opentelemetry.io/otel/metric v1.17.0 // indirect + go.opentelemetry.io/otel/sdk v1.17.0 // indirect + go.opentelemetry.io/otel/sdk/metric v0.40.0 // indirect + go.opentelemetry.io/otel/trace v1.17.0 // indirect + go.opentelemetry.io/proto/otlp v1.0.0 // indirect + golang.org/x/crypto v0.11.0 // indirect golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.6.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.8.0 // indirect + golang.org/x/net v0.12.0 // indirect + golang.org/x/oauth2 v0.10.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/time v0.3.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.110.0 // indirect + google.golang.org/api v0.126.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect - google.golang.org/grpc v1.55.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect + google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/grpc v1.58.2 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index fff801015..1f62f7df9 100644 --- a/go.sum +++ b/go.sum @@ -30,8 +30,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.110.4 h1:1JYyxKMN9hd5dR2MYTPWkGUgcoxVVhg0LKNKEo0qvmk= +cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= @@ -68,8 +68,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.18.0 h1:FEigFqoDbys2cvFkZ9Fjq4gnHBP55anJ0yQyau2f9oY= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.21.0 h1:JNBsyXVoOoNJtTQcnEY5uYpZIbeCTYIeDe0Xh1bySMk= +cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= @@ -109,13 +109,12 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97 cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.12.0 h1:DRtTY29b75ciH6Ov1PHb4/iat2CLCvrOm40Q0a6DFpE= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= @@ -172,8 +171,8 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1 h1:F5QDG5ChchaAVQhINh24U99OWHURqrW8OmQcGKXcbgI= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= @@ -208,8 +207,9 @@ github.com/allegro/bigcache/v3 v3.1.0 h1:H2Vp8VOvxcrB91o86fUSVJFqeuz8kpyyB02eH3b github.com/allegro/bigcache/v3 v3.1.0/go.mod h1:aPyh7jEvrog9zAwx5N7+JUQX5dZTSGpxF1LAR4dr35I= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3 h1:ZSTrOEhiM5J5RFxEaFvMZVEAM1KvT1YzbEOwB2EAGjA= -github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= -github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= +github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= +github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= +github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.189 h1:9PBrjndH1uL5AN8818qI3duhQ4hgkMuLvqkJlg9MRyk= github.com/aws/aws-sdk-go v1.44.189/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= @@ -493,6 +493,8 @@ github.com/bradfitz/gomemcache v0.0.0-20221031212613-62deef7fc822 h1:hjXJeBcAMS1 github.com/bradfitz/gomemcache v0.0.0-20221031212613-62deef7fc822/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= github.com/btubbs/datetime v0.1.1 h1:KuV+F9tyq/hEnezmKZNGk8dzqMVsId6EpFVrQCfA3To= github.com/btubbs/datetime v0.1.1/go.mod h1:n2BZ/2ltnRzNiz27aE3wUb2onNttQdC+WFxAoks5jJM= +github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= +github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= github.com/cenkalti/backoff/v4 v4.1.0/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= @@ -517,6 +519,7 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coocood/freecache v1.2.3 h1:lcBwpZrwBZRZyLk/8EMyQVXRiFl663cCuMOrjCALeto= +github.com/coocood/freecache v1.2.3/go.mod h1:RBUWa/Cy+OHdfTGFEhEuE1pMCMX51Ncizj7rthiQ3vk= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -548,11 +551,13 @@ github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go. github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= @@ -586,12 +591,12 @@ github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= +github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/gocarina/gocsv v0.0.0-20201208093247-67c824bc04d4 h1:Q7s2AN3DhFJKOnzO0uTKLhJTfXTEcXcvw5ylf2BHJw4= github.com/gocarina/gocsv v0.0.0-20201208093247-67c824bc04d4/go.mod h1:5YoVOkjYAQumqlV356Hj3xeYh4BdZuLE0/nRkf2NKkI= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -657,6 +662,7 @@ github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIG github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -672,6 +678,8 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= @@ -690,38 +698,40 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= +github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.1 h1:SWiSWN/42qdpR0MdhaOc/bLR48PLuP1ZQtYLRlM69uY= -github.com/hashicorp/go-getter v1.7.1/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= -github.com/hashicorp/go-hclog v1.4.0 h1:ctuWFGrhFha8BnnzxqeRGidlEcQkDyL5u8J8t5eA11I= -github.com/hashicorp/go-hclog v1.4.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-plugin v1.4.10 h1:xUbmA4jC6Dq163/fWcp8P3JuHilrHHMLNRxzGQJ9hNk= -github.com/hashicorp/go-plugin v1.4.10/go.mod h1:6/1TEzT0eQznvI/gV2CM29DLSkAK/e58mUWKVsPaph0= +github.com/hashicorp/go-getter v1.7.2 h1:uJDtyXwEfalmp1PqdxuhZqrNkUyClZAhVeZYTArbqkg= +github.com/hashicorp/go-getter v1.7.2/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-plugin v1.5.2 h1:aWv8eimFqWlsEiMrYZdPYl+FdHaBJSN4AWwGWfT1G2Y= +github.com/hashicorp/go-plugin v1.5.2/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl/v2 v2.15.0 h1:CPDXO6+uORPjKflkWCCwoWc9uRp+zSIPcCQ+BrxV7m8= -github.com/hashicorp/hcl/v2 v2.15.0/go.mod h1:JRmR89jycNkrrqnMmvPDMd56n1rQJ2Q6KocSLCMCXng= +github.com/hashicorp/hcl/v2 v2.18.0 h1:wYnG7Lt31t2zYkcquwgKo6MWXzRUDIeIVU5naZwHLl8= +github.com/hashicorp/hcl/v2 v2.18.0/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ= github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZZoE= +github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= +github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -736,6 +746,7 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= @@ -746,20 +757,26 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 h1:MtvEpTB6LX3vkb4ax0b5D2DHbNAUsen0Gx5wZoq3lV4= +github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= @@ -786,6 +803,7 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= @@ -794,10 +812,13 @@ github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q= +github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pegasus-kv/thrift v0.13.0 h1:4ESwaNoHImfbHa9RUGJiJZ4hrxorihZHk5aarYwY8d4= github.com/pegasus-kv/thrift v0.13.0/go.mod h1:Gl9NT/WHG6ABm6NsrbfE8LiJN0sAyneCrvB4qN4NPqQ= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -837,8 +858,10 @@ github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sethvargo/go-retry v0.2.4 h1:T+jHEQy/zKJf5s95UkguisicE0zuF9y7+/vgz08Ocec= github.com/sethvargo/go-retry v0.2.4/go.mod h1:1afjQuvh7s4gflMObvjLPaWgluLLyhA1wmVZ6KLpICw= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -847,7 +870,9 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v1.13.0 h1:Dx1kYM01xsSqKPno3aqLnrwac2LetPvN23diwyr69Qs= +github.com/smartystreets/assertions v1.13.0/go.mod h1:wDmR7qL282YbGsPy6H/yAsesrxfxaaSlJazyFLYVFx8= github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= +github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= @@ -870,13 +895,14 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tkrajina/go-reflector v0.5.6 h1:hKQ0gyocG7vgMD2M3dRlYN6WBBOmdoOzJ6njQSepKdE= github.com/tkrajina/go-reflector v0.5.6/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4= -github.com/turbot/go-kit v0.6.0 h1:X+dzxuGmlOhayJ9OE8K9m1MpJ3zlSWK8s/J9rsgmc94= -github.com/turbot/go-kit v0.6.0/go.mod h1:QIOX91BIxQ/1JEtM4rIHWDito3c3GUP2Z+dUT5F6z94= -github.com/turbot/steampipe-plugin-sdk/v5 v5.5.2 h1:ti2+mrPjMkkI8T7Spe5zRs2Mh7YUVHpYB+bSJuvf3PA= -github.com/turbot/steampipe-plugin-sdk/v5 v5.5.2/go.mod h1:bB45PpBccG2tU1lCAc4Y/Jiyd/097hQn6xT9aO7TSq8= +github.com/turbot/go-kit v0.8.0-rc.0 h1:Vj1w5TmZWwdSwBTcOq6FKVlQQ+XwCd27BZVPZ9m1hT0= +github.com/turbot/go-kit v0.8.0-rc.0/go.mod h1:JkVKhR5XHK86aXY4WzB9Lr0jdnrsafjVh4yJA8ZS3Ck= +github.com/turbot/steampipe-plugin-sdk/v5 v5.6.1 h1:PnguL3AjhPwRtzS2KLEnyTPStTYLRSwQWz13GK5QWSA= +github.com/turbot/steampipe-plugin-sdk/v5 v5.6.1/go.mod h1:u2ubq9W5/5y6wG481LyulS7vuMOTRPmXAUfGLoVmwnA= github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -885,8 +911,10 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zclconf/go-cty v1.12.1 h1:PcupnljUm9EIvbgSHQnHhUr3fO6oFmkOrvs2BAFNXXY= -github.com/zclconf/go-cty v1.12.1/go.mod h1:s9IfD1LK5ccNMSWCVFCE2rJfHiZgi7JijgeWIMfhLvA= +github.com/zclconf/go-cty v1.14.0 h1:/Xrd39K7DXbHzlisFP9c4pHao4yyf+/Ug9LEz+Y/yhc= +github.com/zclconf/go-cty v1.14.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b h1:FosyBZYxY34Wul7O/MSKey3txpPYyCqVO5ZyceuQJEI= +github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -896,30 +924,31 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0/go.mod h1:vLarbg68dH2Wa77g71zmKQqlQ8+8Rq3GRG31uc0WcWI= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.39.0 h1:f6BwB2OACc3FCbYVznctQ9V6KK7Vq6CjmYXJ7DeSs4E= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.39.0/go.mod h1:UqL5mZ3qs6XYhDnZaW1Ps4upD+PX6LipH40AoeuIlwU= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.39.0 h1:rm+Fizi7lTM2UefJ1TO347fSRcwmIsUAaZmYmIGBRAo= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.39.0/go.mod h1:sWFbI3jJ+6JdjOVepA5blpv/TJ20Hw+26561iMbWcwU= +go.opentelemetry.io/otel v1.17.0 h1:MW+phZ6WZ5/uk2nd93ANk/6yJ+dVrvNWUjGhnnFU5jM= +go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.17.0 h1:eU0ffpYuEY7eQ75K+nKr9CI5KcY8h+GPk/9DDlEO1NI= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.17.0/go.mod h1:9P5RK5JS2sjKepuCkqFwPp3etwV/57E0eigLw18Mn1k= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.40.0 h1:MZbjiZeMmn5wFMORhozpouGKDxj9POHTuU5UA8msBQk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.40.0/go.mod h1:C7tOYVCJmrDTCwxNny0MuUtnDIR3032vFHYke0F2ZrU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.40.0 h1:q3FNPi8FLQVjLlmV+WWHQfH9ZCCtQIS0O/+dn1+4cJ4= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.40.0/go.mod h1:rmx4n0uSIAkKBeQYkygcv9dENAlL2/tv3OSq68h1JAo= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 h1:cbsD4cUcviQGXdw8+bo5x2wazq10SKz8hEbtCRPcU78= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0/go.mod h1:JgXSGah17croqhJfhByOLVY719k1emAXC8MVhCIJlRs= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 h1:TVQp/bboR4mhZSav+MdgXB8FaRho1RC8UwVn3T0vjVc= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0/go.mod h1:I33vtIe0sR96wfrUcilIzLoA3mLHhRmz9S9Te0S3gDo= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= -go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= -go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= -go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= -go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/otel/metric v1.17.0 h1:iG6LGVz5Gh+IuO0jmgvpTB6YVrCGngi8QGm+pMd8Pdc= +go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= +go.opentelemetry.io/otel/sdk v1.17.0 h1:FLN2X66Ke/k5Sg3V623Q7h7nt3cHXaW1FOvKKrW0IpE= +go.opentelemetry.io/otel/sdk v1.17.0/go.mod h1:U87sE0f5vQB7hwUoW98pW5Rz4ZDuCFBZFNUBlSgmDFQ= +go.opentelemetry.io/otel/sdk/metric v0.40.0 h1:qOM29YaGcxipWjL5FzpyZDpCYrDREvX0mVlmXdOjCHU= +go.opentelemetry.io/otel/sdk/metric v0.40.0/go.mod h1:dWxHtdzdJvg+ciJUKLTKwrMe5P6Dv3FyDbh8UkfgkVs= +go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYOdSKWQ= +go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -927,6 +956,9 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1007,6 +1039,7 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -1019,8 +1052,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1046,8 +1079,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= +golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1062,8 +1095,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1142,11 +1175,13 @@ golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1160,12 +1195,15 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1277,8 +1315,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.110.0 h1:l+rh0KYUooe9JGbGVx71tbFo4SMbMTXK3I3ia2QSEeU= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1388,8 +1426,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 h1:DdoeryqhaXp1LtT/emMP1BRJPHHKFi5akj/nbx/zNTA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1416,7 +1458,6 @@ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= @@ -1426,8 +1467,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.58.2 h1:SXUpjxeVF3FKrTYQI4f4KvbGD5u2xccdYdurwowix5I= +google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1444,13 +1485,14 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=