Skip to content

Commit 27cbcfb

Browse files
authored
refactor: add type-safe WrapGcpInitClient and fix missing Scope.Region (#993)
* refactor: add type-safe WrapGcpInitClient helper for GCP resources - Add WrapGcpInitClient helper matching AWS's WrapAwsInitClient pattern - Add GCP constants (DefaultBatchSize, DefaultWaitTimeout) for consistency - Improve GCP adapter documentation to match AWS quality - Update gcs_bucket.go to use WrapGcpInitClient with proper error handling - Replace silent failures with panics for programming errors * fix: add missing r.Scope.Region initialization in 9 AWS resources These resources were missing r.Scope.Region = cfg.Region in InitClient, causing empty region in logs (e.g., "Deleting 5 dynamodb in " instead of "Deleting 5 dynamodb in us-east-1"). Affected resources: - apigateway - apigatewayv2 - dynamodb - ebs - ec2_egress_only_igw - network_firewall_resource_policy - rds - rds_parameter_group - rds_subnet_group
1 parent 37a9279 commit 27cbcfb

File tree

11 files changed

+35
-12
lines changed

11 files changed

+35
-12
lines changed

aws/resources/apigateway.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ func NewApiGateway() AwsResource {
2222
ResourceTypeName: "apigateway",
2323
BatchSize: 10,
2424
InitClient: WrapAwsInitClient(func(r *resource.Resource[ApiGatewayAPI], cfg aws.Config) {
25+
r.Scope.Region = cfg.Region
2526
r.Client = apigateway.NewFromConfig(cfg)
2627
}),
2728
ConfigGetter: func(c config.Config) config.ResourceType {

aws/resources/apigatewayv2.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ func NewApiGatewayV2() AwsResource {
2222
ResourceTypeName: "apigatewayv2",
2323
BatchSize: 10,
2424
InitClient: WrapAwsInitClient(func(r *resource.Resource[ApiGatewayV2API], cfg aws.Config) {
25+
r.Scope.Region = cfg.Region
2526
r.Client = apigatewayv2.NewFromConfig(cfg)
2627
}),
2728
ConfigGetter: func(c config.Config) config.ResourceType {

aws/resources/dynamodb.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ func NewDynamoDB() AwsResource {
2626
ResourceTypeName: "dynamodb",
2727
BatchSize: DefaultBatchSize, // Tentative batch size to ensure AWS doesn't throttle
2828
InitClient: WrapAwsInitClient(func(r *resource.Resource[DynamoDBAPI], cfg aws.Config) {
29+
r.Scope.Region = cfg.Region
2930
r.Client = dynamodb.NewFromConfig(cfg)
3031
}),
3132
ConfigGetter: func(c config.Config) config.ResourceType {

aws/resources/ebs.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ func NewEBSVolumes() AwsResource {
2525
ResourceTypeName: "ebs",
2626
BatchSize: DefaultBatchSize,
2727
InitClient: WrapAwsInitClient(func(r *resource.Resource[EBSVolumesAPI], cfg aws.Config) {
28+
r.Scope.Region = cfg.Region
2829
r.Client = ec2.NewFromConfig(cfg)
2930
}),
3031
ConfigGetter: func(c config.Config) config.ResourceType {

aws/resources/ec2_egress_only_igw.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ func NewEgressOnlyInternetGateway() AwsResource {
2222
ResourceTypeName: "egress-only-internet-gateway",
2323
BatchSize: DefaultBatchSize,
2424
InitClient: WrapAwsInitClient(func(r *resource.Resource[EgressOnlyIGAPI], cfg aws.Config) {
25+
r.Scope.Region = cfg.Region
2526
r.Client = ec2.NewFromConfig(cfg)
2627
}),
2728
ConfigGetter: func(c config.Config) config.ResourceType {

aws/resources/network_firewall_resource_policy.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ func NewNetworkFirewallResourcePolicy() AwsResource {
2929
ResourceTypeName: "network-firewall-resource-policy",
3030
BatchSize: 10,
3131
InitClient: WrapAwsInitClient(func(r *resource.Resource[NetworkFirewallResourcePolicyAPI], cfg aws.Config) {
32+
r.Scope.Region = cfg.Region
3233
r.Client = networkfirewall.NewFromConfig(cfg)
3334
}),
3435
ConfigGetter: func(c config.Config) config.ResourceType {

aws/resources/rds.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ func NewDBInstances() AwsResource {
2626
ResourceTypeName: "rds",
2727
BatchSize: DefaultBatchSize,
2828
InitClient: WrapAwsInitClient(func(r *resource.Resource[DBInstancesAPI], cfg aws.Config) {
29+
r.Scope.Region = cfg.Region
2930
r.Client = rds.NewFromConfig(cfg)
3031
}),
3132
ConfigGetter: func(c config.Config) config.ResourceType {

aws/resources/rds_parameter_group.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ func NewRdsParameterGroup() AwsResource {
2424
ResourceTypeName: "rds-parameter-group",
2525
BatchSize: DefaultBatchSize,
2626
InitClient: WrapAwsInitClient(func(r *resource.Resource[RdsParameterGroupAPI], cfg aws.Config) {
27+
r.Scope.Region = cfg.Region
2728
r.Client = rds.NewFromConfig(cfg)
2829
}),
2930
ConfigGetter: func(c config.Config) config.ResourceType {

aws/resources/rds_subnet_group.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ func NewDBSubnetGroups() AwsResource {
2424
ResourceTypeName: "rds-subnet-group",
2525
BatchSize: DefaultBatchSize,
2626
InitClient: WrapAwsInitClient(func(r *resource.Resource[DBSubnetGroupsAPI], cfg aws.Config) {
27+
r.Scope.Region = cfg.Region
2728
r.Client = rds.NewFromConfig(cfg)
2829
}),
2930
ConfigGetter: func(c config.Config) config.ResourceType {

gcp/resources/adapter.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,33 @@ package resources
22

33
import (
44
"context"
5+
"fmt"
6+
"time"
57

68
"github.com/gruntwork-io/cloud-nuke/resource"
79
)
810

11+
const (
12+
DefaultWaitTimeout = 5 * time.Minute
13+
DefaultBatchSize = 50
14+
)
15+
16+
// GcpInitClientFunc is the type-safe client initialization function signature.
17+
type GcpInitClientFunc[C any] func(r *resource.Resource[C], projectID string)
18+
19+
// WrapGcpInitClient converts a GcpInitClientFunc to the generic InitClient signature.
20+
// Panics on type assertion failure since that indicates a programming error.
21+
func WrapGcpInitClient[C any](fn GcpInitClientFunc[C]) func(r *resource.Resource[C], cfg any) {
22+
return func(r *resource.Resource[C], cfg any) {
23+
projectID, ok := cfg.(string)
24+
if !ok {
25+
panic(fmt.Sprintf("WrapGcpInitClient: expected string projectID, got %T", cfg))
26+
}
27+
fn(r, projectID)
28+
}
29+
}
30+
931
// GcpResourceAdapter wraps a generic Resource to satisfy the GcpResource interface.
10-
// It provides type-safe Init(string) for GCP's project ID initialization.
1132
type GcpResourceAdapter[C any] struct {
1233
*resource.Resource[C]
1334
}
@@ -27,5 +48,4 @@ func (g *GcpResourceAdapter[C]) Nuke(ctx context.Context, identifiers []string)
2748
return g.Resource.Nuke(ctx, identifiers)
2849
}
2950

30-
// Compile-time interface satisfaction check
3151
var _ GcpResource = (*GcpResourceAdapter[any])(nil)

0 commit comments

Comments
 (0)