Skip to content

Commit c9c1e4c

Browse files
authored
fix(aws)!: Unified tag structure (#3330)
Fixes #3280 All tags (except one) should be JSON objects (and not JSON arrays) now. The exception is `aws_autoscaling_groups`, which `tags` is defined as `[]TagDescription`, which is defined as: ```go // Describes a tag for an Auto Scaling group. type TagDescription struct { // The tag key. Key *string // Determines whether the tag is added to new instances as they are launched in the // group. PropagateAtLaunch *bool // The name of the group. ResourceId *string // The type of resource. The only supported value is auto-scaling-group. ResourceType *string // The tag value. Value *string noSmithyDocumentSerde } ```
1 parent 43541b3 commit c9c1e4c

127 files changed

Lines changed: 353 additions & 607 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

plugins/source/aws/codegen/recipes/base.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"strings"
1313
"text/template"
1414

15+
"github.com/aws/aws-sdk-go-v2/service/autoscaling/types"
1516
"github.com/cloudquery/plugin-sdk/caser"
1617
"github.com/cloudquery/plugin-sdk/codegen"
1718
"github.com/cloudquery/plugin-sdk/schema"
@@ -82,6 +83,26 @@ func awsNameTransformer(f reflect.StructField) (string, error) {
8283
return c.ToSnake(f.Name), nil
8384
}
8485

86+
func awsResolverTransformer(f reflect.StructField, path string) (string, error) {
87+
if f.Type.String() == "[]types.Tag" {
88+
if path == "Tags" {
89+
return "client.ResolveTags", nil
90+
}
91+
return `client.ResolveTagField("` + path + `")`, nil
92+
}
93+
94+
if path == "Tags" || path == "TagSet" {
95+
switch f.Type {
96+
case reflect.TypeOf(map[string]string{}), reflect.TypeOf(map[string]*string{}), reflect.TypeOf(map[string]interface{}{}), reflect.TypeOf([]types.TagDescription{}):
97+
// valid tag types
98+
default:
99+
return "", fmt.Errorf("%q field is not of type []types.Tag or acceptable map: %s", path, f.Type.String())
100+
}
101+
}
102+
103+
return codegen.DefaultResolverTransformer(f, path)
104+
}
105+
85106
func (r *Resource) Generate() error {
86107
_, filename, _, ok := runtime.Caller(0)
87108
if !ok {
@@ -94,6 +115,7 @@ func (r *Resource) Generate() error {
94115
codegen.WithSkipFields(r.SkipFields),
95116
codegen.WithExtraColumns(r.ExtraColumns),
96117
codegen.WithNameTransformer(awsNameTransformer),
118+
codegen.WithResolverTransformer(awsResolverTransformer),
97119
}
98120
if r.UnwrapEmbeddedStructs {
99121
opts = append(opts, codegen.WithUnwrapAllEmbeddedStructs())
@@ -107,10 +129,10 @@ func (r *Resource) Generate() error {
107129
r.Struct,
108130
opts...,
109131
)
110-
r.Table.Description = r.Description
111132
if err != nil {
112-
return err
133+
return fmt.Errorf("error generating %s: %w", name, err)
113134
}
135+
r.Table.Description = r.Description
114136
r.Table.Resolver = "fetch" + strcase.ToCamel(r.Service) + strcase.ToCamel(r.SubService)
115137
if r.Multiplex != "" {
116138
r.Table.Multiplex = r.Multiplex

plugins/source/aws/codegen/recipes/cloudformation.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ func CloudformationResources() []*Resource {
1212
SubService: "stacks",
1313
Struct: &types.Stack{},
1414
Description: "https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_Stack.html",
15-
SkipFields: []string{"StackId", "Tags"},
15+
SkipFields: []string{"StackId"},
1616
ExtraColumns: append(
1717
defaultRegionalColumns,
1818
[]codegen.ColumnDefinition{
@@ -30,11 +30,6 @@ func CloudformationResources() []*Resource {
3030
Resolver: `schema.PathResolver("StackId")`,
3131
Options: schema.ColumnCreationOptions{PrimaryKey: true},
3232
},
33-
{
34-
Name: "tags",
35-
Type: schema.TypeJSON,
36-
Resolver: `client.ResolveTags`,
37-
},
3833
}...),
3934
Relations: []string{
4035
"StackResources()",

plugins/source/aws/codegen/recipes/directconnect.go

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ func DirectConnectResources() []*Resource {
1212
SubService: "connections",
1313
Struct: &types.Connection{},
1414
Description: "https://docs.aws.amazon.com/directconnect/latest/APIReference/API_Connection.html",
15-
SkipFields: []string{"ConnectionId", "Tags", "Region"},
15+
SkipFields: []string{"ConnectionId", "Region"},
1616
ExtraColumns: append(
1717
defaultRegionalColumns,
1818
[]codegen.ColumnDefinition{
@@ -28,11 +28,6 @@ func DirectConnectResources() []*Resource {
2828
Resolver: `schema.PathResolver("ConnectionId")`,
2929
Options: schema.ColumnCreationOptions{PrimaryKey: true},
3030
},
31-
{
32-
Name: "tags",
33-
Type: schema.TypeJSON,
34-
Resolver: `client.ResolveTags`,
35-
},
3631
}...),
3732
},
3833
{
@@ -156,7 +151,7 @@ func DirectConnectResources() []*Resource {
156151
SubService: "virtual_interfaces",
157152
Struct: &types.VirtualInterface{},
158153
Description: "https://docs.aws.amazon.com/directconnect/latest/APIReference/API_VirtualInterface.html",
159-
SkipFields: []string{"Tags", "VirtualInterfaceId", "Region"},
154+
SkipFields: []string{"VirtualInterfaceId", "Region"},
160155
ExtraColumns: append(
161156
defaultRegionalColumns,
162157
[]codegen.ColumnDefinition{
@@ -166,11 +161,6 @@ func DirectConnectResources() []*Resource {
166161
Resolver: `resolveVirtualInterfaceARN()`,
167162
Options: schema.ColumnCreationOptions{PrimaryKey: true},
168163
},
169-
{
170-
Name: "tags",
171-
Type: schema.TypeJSON,
172-
Resolver: `client.ResolveTags`,
173-
},
174164
{
175165
Name: "id",
176166
Type: schema.TypeString,

plugins/source/aws/codegen/recipes/ec2.go

Lines changed: 2 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,6 @@ func EC2Resources() []*Resource {
195195
SubService: "internet_gateways",
196196
Struct: &types.InternetGateway{},
197197
Description: "https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_InternetGateway.html",
198-
SkipFields: []string{"Tags"},
199198
ExtraColumns: append(defaultRegionalColumns,
200199
[]codegen.ColumnDefinition{
201200
{
@@ -204,11 +203,6 @@ func EC2Resources() []*Resource {
204203
Resolver: "resolveInternetGatewayArn",
205204
Options: schema.ColumnCreationOptions{PrimaryKey: true},
206205
},
207-
{
208-
Name: "tags",
209-
Type: schema.TypeJSON,
210-
Resolver: `client.ResolveTags`,
211-
},
212206
}...),
213207
},
214208
{
@@ -243,7 +237,6 @@ func EC2Resources() []*Resource {
243237
SubService: "network_acls",
244238
Struct: &types.NetworkAcl{},
245239
Description: "https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_NetworkAcl.html",
246-
SkipFields: []string{"Tags"},
247240
ExtraColumns: append(defaultRegionalColumns,
248241
[]codegen.ColumnDefinition{
249242
{
@@ -252,11 +245,6 @@ func EC2Resources() []*Resource {
252245
Resolver: "resolveNetworkAclArn",
253246
Options: schema.ColumnCreationOptions{PrimaryKey: true},
254247
},
255-
{
256-
Name: "tags",
257-
Type: schema.TypeJSON,
258-
Resolver: `client.ResolveTags`,
259-
},
260248
}...),
261249
},
262250
{
@@ -275,7 +263,7 @@ func EC2Resources() []*Resource {
275263
{
276264
Name: "tags",
277265
Type: schema.TypeJSON,
278-
Resolver: `schema.PathResolver("TagSet")`,
266+
Resolver: `client.ResolveTagField("TagSet")`,
279267
},
280268
}...),
281269
},
@@ -331,7 +319,6 @@ func EC2Resources() []*Resource {
331319
SubService: "reserved_instances",
332320
Struct: &types.ReservedInstances{},
333321
Description: "https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReservedInstances.html",
334-
SkipFields: []string{"Tags"},
335322
ExtraColumns: append(defaultRegionalColumns,
336323
[]codegen.ColumnDefinition{
337324
{
@@ -340,18 +327,12 @@ func EC2Resources() []*Resource {
340327
Resolver: "resolveReservedInstanceArn",
341328
Options: schema.ColumnCreationOptions{PrimaryKey: true},
342329
},
343-
{
344-
Name: "tags",
345-
Type: schema.TypeJSON,
346-
Resolver: `client.ResolveTags`,
347-
},
348330
}...),
349331
},
350332
{
351333
SubService: "route_tables",
352334
Struct: &types.RouteTable{},
353335
Description: "https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RouteTable.html",
354-
SkipFields: []string{"Tags"},
355336
ExtraColumns: append(defaultRegionalColumns,
356337
[]codegen.ColumnDefinition{
357338
{
@@ -360,11 +341,6 @@ func EC2Resources() []*Resource {
360341
Resolver: "resolveRouteTableArn",
361342
Options: schema.ColumnCreationOptions{PrimaryKey: true},
362343
},
363-
{
364-
Name: "tags",
365-
Type: schema.TypeJSON,
366-
Resolver: `client.ResolveTags`,
367-
},
368344
}...),
369345
},
370346
{
@@ -399,14 +375,9 @@ func EC2Resources() []*Resource {
399375
SubService: "transit_gateways",
400376
Struct: &types.TransitGateway{},
401377
Description: "https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_TransitGateway.html",
402-
SkipFields: []string{"Tags", "TransitGatewayId", "TransitGatewayArn"},
378+
SkipFields: []string{"TransitGatewayId", "TransitGatewayArn"},
403379
ExtraColumns: append(defaultRegionalColumns,
404380
[]codegen.ColumnDefinition{
405-
{
406-
Name: "tags",
407-
Type: schema.TypeJSON,
408-
Resolver: `client.ResolveTags`,
409-
},
410381
{
411382
Name: "id",
412383
Type: schema.TypeString,
@@ -431,7 +402,6 @@ func EC2Resources() []*Resource {
431402
SubService: "transit_gateway_attachments",
432403
Struct: &types.TransitGatewayAttachment{},
433404
Description: "https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_TransitGatewayAttachment.html",
434-
SkipFields: []string{"Tags"},
435405
ExtraColumns: append(
436406
defaultRegionalColumns,
437407
[]codegen.ColumnDefinition{
@@ -440,18 +410,12 @@ func EC2Resources() []*Resource {
440410
Type: schema.TypeString,
441411
Resolver: `schema.ParentColumnResolver("arn")`,
442412
},
443-
{
444-
Name: "tags",
445-
Type: schema.TypeJSON,
446-
Resolver: `client.ResolveTags`,
447-
},
448413
}...),
449414
},
450415
{
451416
SubService: "transit_gateway_route_tables",
452417
Struct: &types.TransitGatewayRouteTable{},
453418
Description: "https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_TransitGatewayRouteTable.html",
454-
SkipFields: []string{"Tags"},
455419
ExtraColumns: append(
456420
defaultRegionalColumns,
457421
[]codegen.ColumnDefinition{
@@ -460,18 +424,12 @@ func EC2Resources() []*Resource {
460424
Type: schema.TypeString,
461425
Resolver: `schema.ParentColumnResolver("arn")`,
462426
},
463-
{
464-
Name: "tags",
465-
Type: schema.TypeJSON,
466-
Resolver: `client.ResolveTags`,
467-
},
468427
}...),
469428
},
470429
{
471430
SubService: "transit_gateway_vpc_attachments",
472431
Struct: &types.TransitGatewayVpcAttachment{},
473432
Description: "https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_TransitGatewayVpcAttachment.html",
474-
SkipFields: []string{"Tags"},
475433
ExtraColumns: append(
476434
defaultRegionalColumns,
477435
[]codegen.ColumnDefinition{
@@ -480,18 +438,12 @@ func EC2Resources() []*Resource {
480438
Type: schema.TypeString,
481439
Resolver: `schema.ParentColumnResolver("arn")`,
482440
},
483-
{
484-
Name: "tags",
485-
Type: schema.TypeJSON,
486-
Resolver: `client.ResolveTags`,
487-
},
488441
}...),
489442
},
490443
{
491444
SubService: "transit_gateway_peering_attachments",
492445
Struct: &types.TransitGatewayPeeringAttachment{},
493446
Description: "https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_TransitGatewayPeeringAttachment.html",
494-
SkipFields: []string{"Tags"},
495447
ExtraColumns: append(
496448
defaultRegionalColumns,
497449
[]codegen.ColumnDefinition{
@@ -500,18 +452,12 @@ func EC2Resources() []*Resource {
500452
Type: schema.TypeString,
501453
Resolver: `schema.ParentColumnResolver("arn")`,
502454
},
503-
{
504-
Name: "tags",
505-
Type: schema.TypeJSON,
506-
Resolver: `client.ResolveTags`,
507-
},
508455
}...),
509456
},
510457
{
511458
SubService: "transit_gateway_multicast_domains",
512459
Struct: &types.TransitGatewayMulticastDomain{},
513460
Description: "https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_TransitGatewayMulticastDomain.html",
514-
SkipFields: []string{"Tags"},
515461
ExtraColumns: append(
516462
defaultRegionalColumns,
517463
[]codegen.ColumnDefinition{
@@ -520,11 +466,6 @@ func EC2Resources() []*Resource {
520466
Type: schema.TypeString,
521467
Resolver: `schema.ParentColumnResolver("arn")`,
522468
},
523-
{
524-
Name: "tags",
525-
Type: schema.TypeJSON,
526-
Resolver: `client.ResolveTags`,
527-
},
528469
}...),
529470
},
530471
{
@@ -545,7 +486,6 @@ func EC2Resources() []*Resource {
545486
SubService: "vpc_endpoint_services",
546487
Struct: &types.ServiceDetail{},
547488
Description: "https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ServiceDetail.html",
548-
SkipFields: []string{"Tags"},
549489
ExtraColumns: append(defaultRegionalColumns,
550490
[]codegen.ColumnDefinition{
551491
{
@@ -554,11 +494,6 @@ func EC2Resources() []*Resource {
554494
Resolver: `resolveVpcEndpointServiceArn`,
555495
Options: schema.ColumnCreationOptions{PrimaryKey: true},
556496
},
557-
{
558-
Name: "tags",
559-
Type: schema.TypeJSON,
560-
Resolver: `client.ResolveTags`,
561-
},
562497
}...),
563498
},
564499
{

0 commit comments

Comments
 (0)