Skip to content

Commit d3b08ee

Browse files
authored
feat: Add aws_s3_bucket_notification_configurations table (#13608)
Closes #13605
1 parent 508fce5 commit d3b08ee

File tree

7 files changed

+102
-41
lines changed

7 files changed

+102
-41
lines changed

plugins/source/aws/docs/tables/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,7 @@
594594
- [aws_s3_bucket_encryption_rules](../../../../../website/tables/aws/aws_s3_bucket_encryption_rules.md)
595595
- [aws_s3_bucket_grants](../../../../../website/tables/aws/aws_s3_bucket_grants.md)
596596
- [aws_s3_bucket_lifecycles](../../../../../website/tables/aws/aws_s3_bucket_lifecycles.md)
597+
- [aws_s3_bucket_notification_configurations](../../../../../website/tables/aws/aws_s3_bucket_notification_configurations.md)
597598
- [aws_s3_bucket_websites](../../../../../website/tables/aws/aws_s3_bucket_websites.md)
598599
- [aws_s3_multi_region_access_points](../../../../../website/tables/aws/aws_s3_multi_region_access_points.md)
599600
- [aws_sagemaker_apps](../../../../../website/tables/aws/aws_sagemaker_apps.md)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package s3
2+
3+
import (
4+
"context"
5+
6+
"github.com/apache/arrow/go/v14/arrow"
7+
"github.com/aws/aws-sdk-go-v2/service/s3"
8+
"github.com/aws/aws-sdk-go-v2/service/s3/types"
9+
"github.com/cloudquery/cloudquery/plugins/source/aws/client"
10+
"github.com/cloudquery/cloudquery/plugins/source/aws/resources/services/s3/models"
11+
"github.com/cloudquery/plugin-sdk/v4/scalar"
12+
"github.com/cloudquery/plugin-sdk/v4/schema"
13+
"github.com/cloudquery/plugin-sdk/v4/transformers"
14+
)
15+
16+
func bucketNotificationConfigurations() *schema.Table {
17+
return &schema.Table{
18+
Name: "aws_s3_bucket_notification_configurations",
19+
Description: `https://docs.aws.amazon.com/AmazonS3/latest/API/API_NotificationConfiguration.html`,
20+
Resolver: fetchS3BucketNotificationConfigurations,
21+
Transform: transformers.TransformWithStruct(&types.NotificationConfiguration{}),
22+
Columns: []schema.Column{
23+
client.DefaultAccountIDColumn(false),
24+
{
25+
Name: "bucket_arn",
26+
Type: arrow.BinaryTypes.String,
27+
Resolver: schema.ParentColumnResolver("arn"),
28+
PrimaryKey: true,
29+
},
30+
},
31+
}
32+
}
33+
34+
func fetchS3BucketNotificationConfigurations(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error {
35+
r := parent.Item.(*models.WrappedBucket)
36+
cl := meta.(*client.Client)
37+
svc := cl.Services(client.AWSServiceS3).S3
38+
region := parent.Get("region").(*scalar.String)
39+
if region == nil {
40+
return nil
41+
}
42+
output, err := svc.GetBucketNotificationConfiguration(ctx, &s3.GetBucketNotificationConfigurationInput{Bucket: r.Name}, func(o *s3.Options) {
43+
o.Region = region.Value
44+
})
45+
if err != nil {
46+
if client.IsAWSError(err, "NoSuchBucket") {
47+
return nil
48+
}
49+
return err
50+
}
51+
res <- output
52+
return nil
53+
}

plugins/source/aws/resources/services/s3/buckets.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,11 @@ func Buckets() *schema.Table {
3333
},
3434

3535
Relations: []*schema.Table{
36+
bucketCorsRules(),
3637
bucketEncryptionRules(),
37-
bucketLifecycles(),
3838
bucketGrants(),
39-
bucketCorsRules(),
39+
bucketLifecycles(),
40+
bucketNotificationConfigurations(),
4041
bucketWebsites(),
4142
},
4243
}

plugins/source/aws/resources/services/s3/buckets_mock_test.go

Lines changed: 19 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -47,56 +47,36 @@ func buildS3Buckets(t *testing.T, ctrl *gomock.Controller) client.Services {
4747
bownershipcontrols := s3.GetBucketOwnershipControlsOutput{}
4848
require.NoError(t, faker.FakeObject(&bownershipcontrols))
4949

50-
m.EXPECT().ListBuckets(gomock.Any(), gomock.Any(), gomock.Any()).Return(
51-
&s3.ListBucketsOutput{
52-
Buckets: []s3Types.Bucket{b},
53-
}, nil)
54-
m.EXPECT().GetBucketLogging(gomock.Any(), gomock.Any(), gomock.Any()).Return(
55-
&blog, nil)
56-
m.EXPECT().GetBucketPolicy(gomock.Any(), gomock.Any(), gomock.Any()).Return(
57-
&bpol, nil)
58-
m.EXPECT().GetBucketPolicyStatus(gomock.Any(), gomock.Any(), gomock.Any()).Return(
59-
&bpols, nil)
60-
m.EXPECT().GetBucketVersioning(gomock.Any(), gomock.Any(), gomock.Any()).Return(
61-
&bver, nil)
62-
m.EXPECT().GetBucketAcl(gomock.Any(), gomock.Any(), gomock.Any()).Return(
63-
&s3.GetBucketAclOutput{
64-
Grants: []s3Types.Grant{bgrant},
65-
}, nil)
66-
m.EXPECT().GetBucketCors(gomock.Any(), gomock.Any(), gomock.Any()).Return(
67-
&s3.GetBucketCorsOutput{
68-
CORSRules: []s3Types.CORSRule{bcors},
69-
}, nil)
70-
m.EXPECT().GetBucketEncryption(gomock.Any(), gomock.Any(), gomock.Any()).Return(
71-
&bencryption, nil)
72-
73-
m.EXPECT().GetPublicAccessBlock(gomock.Any(), gomock.Any(), gomock.Any()).Return(
74-
&bpba, nil)
75-
m.EXPECT().GetBucketOwnershipControls(gomock.Any(), gomock.Any(), gomock.Any()).Return(&bownershipcontrols, nil)
76-
7750
ro := s3.GetBucketReplicationOutput{}
7851
require.NoError(t, faker.FakeObject(&ro))
7952

80-
m.EXPECT().GetBucketReplication(gomock.Any(), gomock.Any(), gomock.Any()).Return(&ro, nil)
81-
m.EXPECT().GetBucketTagging(gomock.Any(), gomock.Any(), gomock.Any()).Return(
82-
&btag, nil)
83-
tt := s3Types.Transition{}
84-
require.NoError(t, faker.FakeObject(&tt))
85-
8653
glco := s3.GetBucketLifecycleConfigurationOutput{}
8754
require.NoError(t, faker.FakeObject(&glco))
8855

89-
m.EXPECT().GetBucketLifecycleConfiguration(gomock.Any(), gomock.Any(), gomock.Any()).Return(&glco, nil)
90-
m.EXPECT().GetBucketLocation(gomock.Any(), gomock.Any(), gomock.Any()).Return(&bloc, nil)
91-
9256
websiteOutput := s3.GetBucketWebsiteOutput{}
9357
require.NoError(t, faker.FakeObject(&websiteOutput))
9458

59+
gbnco := s3.GetBucketNotificationConfigurationOutput{}
60+
require.NoError(t, faker.FakeObject(&gbnco))
61+
62+
m.EXPECT().ListBuckets(gomock.Any(), gomock.Any(), gomock.Any()).Return(&s3.ListBucketsOutput{Buckets: []s3Types.Bucket{b}}, nil)
63+
m.EXPECT().GetBucketLogging(gomock.Any(), gomock.Any(), gomock.Any()).Return(&blog, nil)
64+
m.EXPECT().GetBucketPolicy(gomock.Any(), gomock.Any(), gomock.Any()).Return(&bpol, nil)
65+
m.EXPECT().GetBucketPolicyStatus(gomock.Any(), gomock.Any(), gomock.Any()).Return(&bpols, nil)
66+
m.EXPECT().GetBucketVersioning(gomock.Any(), gomock.Any(), gomock.Any()).Return(&bver, nil)
67+
m.EXPECT().GetBucketAcl(gomock.Any(), gomock.Any(), gomock.Any()).Return(&s3.GetBucketAclOutput{Grants: []s3Types.Grant{bgrant}}, nil)
68+
m.EXPECT().GetBucketCors(gomock.Any(), gomock.Any(), gomock.Any()).Return(&s3.GetBucketCorsOutput{CORSRules: []s3Types.CORSRule{bcors}}, nil)
69+
m.EXPECT().GetBucketEncryption(gomock.Any(), gomock.Any(), gomock.Any()).Return(&bencryption, nil)
70+
m.EXPECT().GetPublicAccessBlock(gomock.Any(), gomock.Any(), gomock.Any()).Return(&bpba, nil)
71+
m.EXPECT().GetBucketOwnershipControls(gomock.Any(), gomock.Any(), gomock.Any()).Return(&bownershipcontrols, nil)
72+
m.EXPECT().GetBucketReplication(gomock.Any(), gomock.Any(), gomock.Any()).Return(&ro, nil)
73+
m.EXPECT().GetBucketTagging(gomock.Any(), gomock.Any(), gomock.Any()).Return(&btag, nil)
74+
m.EXPECT().GetBucketLifecycleConfiguration(gomock.Any(), gomock.Any(), gomock.Any()).Return(&glco, nil)
75+
m.EXPECT().GetBucketLocation(gomock.Any(), gomock.Any(), gomock.Any()).Return(&bloc, nil)
9576
m.EXPECT().GetBucketWebsite(gomock.Any(), gomock.Any(), gomock.Any()).Return(&websiteOutput, nil)
77+
m.EXPECT().GetBucketNotificationConfiguration(gomock.Any(), gomock.Any(), gomock.Any()).Return(&gbnco, nil)
9678

97-
return client.Services{
98-
S3: m,
99-
}
79+
return client.Services{S3: m}
10080
}
10181

10282
func TestS3Buckets(t *testing.T) {

website/pages/docs/plugins/sources/aws/tables.md

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Table: aws_s3_bucket_notification_configurations
2+
3+
This table shows data for S3 Bucket Notification Configurations.
4+
5+
https://docs.aws.amazon.com/AmazonS3/latest/API/API_NotificationConfiguration.html
6+
7+
The primary key for this table is **bucket_arn**.
8+
9+
## Relations
10+
11+
This table depends on [aws_s3_buckets](aws_s3_buckets).
12+
13+
## Columns
14+
15+
| Name | Type |
16+
| ------------- | ------------- |
17+
|_cq_id|`uuid`|
18+
|_cq_parent_id|`uuid`|
19+
|account_id|`utf8`|
20+
|bucket_arn (PK)|`utf8`|
21+
|event_bridge_configuration|`json`|
22+
|lambda_function_configurations|`json`|
23+
|queue_configurations|`json`|
24+
|topic_configurations|`json`|

website/tables/aws/aws_s3_buckets.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ The following tables depend on aws_s3_buckets:
1111
- [aws_s3_bucket_encryption_rules](aws_s3_bucket_encryption_rules)
1212
- [aws_s3_bucket_grants](aws_s3_bucket_grants)
1313
- [aws_s3_bucket_lifecycles](aws_s3_bucket_lifecycles)
14+
- [aws_s3_bucket_notification_configurations](aws_s3_bucket_notification_configurations)
1415
- [aws_s3_bucket_websites](aws_s3_bucket_websites)
1516

1617
## Columns

0 commit comments

Comments
 (0)