diff --git a/plugins/source/aws/docs/tables/README.md b/plugins/source/aws/docs/tables/README.md index e4b3c6ce5c2f27..3988d1a5557a20 100644 --- a/plugins/source/aws/docs/tables/README.md +++ b/plugins/source/aws/docs/tables/README.md @@ -406,6 +406,7 @@ - [aws_rds_cluster_parameter_group_parameters](aws_rds_cluster_parameter_group_parameters.md) - [aws_rds_cluster_snapshots](aws_rds_cluster_snapshots.md) - [aws_rds_clusters](aws_rds_clusters.md) + - [aws_rds_cluster_backtracks](aws_rds_cluster_backtracks.md) - [aws_rds_db_parameter_groups](aws_rds_db_parameter_groups.md) - [aws_rds_db_parameter_group_db_parameters](aws_rds_db_parameter_group_db_parameters.md) - [aws_rds_db_security_groups](aws_rds_db_security_groups.md) @@ -413,7 +414,9 @@ - [aws_rds_engine_versions](aws_rds_engine_versions.md) - [aws_rds_cluster_parameters](aws_rds_cluster_parameters.md) - [aws_rds_event_subscriptions](aws_rds_event_subscriptions.md) +- [aws_rds_events](aws_rds_events.md) - [aws_rds_instances](aws_rds_instances.md) +- [aws_rds_option_groups](aws_rds_option_groups.md) - [aws_rds_reserved_instances](aws_rds_reserved_instances.md) - [aws_rds_subnet_groups](aws_rds_subnet_groups.md) - [aws_redshift_clusters](aws_redshift_clusters.md) diff --git a/plugins/source/aws/docs/tables/aws_rds_cluster_backtracks.md b/plugins/source/aws/docs/tables/aws_rds_cluster_backtracks.md new file mode 100644 index 00000000000000..16b088767b7c71 --- /dev/null +++ b/plugins/source/aws/docs/tables/aws_rds_cluster_backtracks.md @@ -0,0 +1,27 @@ +# Table: aws_rds_cluster_backtracks + +https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBClusterBacktracks.html + +The composite primary key for this table is (**db_cluster_arn**, **backtrack_identifier**). + +## Relations + +This table depends on [aws_rds_clusters](aws_rds_clusters.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_source_name|String| +|_cq_sync_time|Timestamp| +|_cq_id|UUID| +|_cq_parent_id|UUID| +|account_id|String| +|region|String| +|db_cluster_arn (PK)|String| +|backtrack_identifier (PK)|String| +|backtrack_request_creation_time|Timestamp| +|backtrack_to|Timestamp| +|backtracked_from|Timestamp| +|db_cluster_identifier|String| +|status|String| \ No newline at end of file diff --git a/plugins/source/aws/docs/tables/aws_rds_clusters.md b/plugins/source/aws/docs/tables/aws_rds_clusters.md index 38e35f5b057ace..d141127ab6a904 100644 --- a/plugins/source/aws/docs/tables/aws_rds_clusters.md +++ b/plugins/source/aws/docs/tables/aws_rds_clusters.md @@ -4,6 +4,11 @@ https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DBCluster.html The primary key for this table is **arn**. +## Relations + +The following tables depend on aws_rds_clusters: + - [aws_rds_cluster_backtracks](aws_rds_cluster_backtracks.md) + ## Columns | Name | Type | diff --git a/plugins/source/aws/docs/tables/aws_rds_events.md b/plugins/source/aws/docs/tables/aws_rds_events.md new file mode 100644 index 00000000000000..92bd05bb965730 --- /dev/null +++ b/plugins/source/aws/docs/tables/aws_rds_events.md @@ -0,0 +1,22 @@ +# Table: aws_rds_events + +https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeEvents.html + +The primary key for this table is **_cq_id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_source_name|String| +|_cq_sync_time|Timestamp| +|_cq_id (PK)|UUID| +|_cq_parent_id|UUID| +|account_id|String| +|region|String| +|date|Timestamp| +|event_categories|StringArray| +|message|String| +|source_arn|String| +|source_identifier|String| +|source_type|String| \ No newline at end of file diff --git a/plugins/source/aws/docs/tables/aws_rds_option_groups.md b/plugins/source/aws/docs/tables/aws_rds_option_groups.md new file mode 100644 index 00000000000000..89096237674f3d --- /dev/null +++ b/plugins/source/aws/docs/tables/aws_rds_option_groups.md @@ -0,0 +1,28 @@ +# Table: aws_rds_option_groups + +https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_OptionGroup.html + +The primary key for this table is **arn**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_source_name|String| +|_cq_sync_time|Timestamp| +|_cq_id|UUID| +|_cq_parent_id|UUID| +|account_id|String| +|region|String| +|arn (PK)|String| +|allows_vpc_and_non_vpc_instance_memberships|Bool| +|copy_timestamp|Timestamp| +|engine_name|String| +|major_engine_version|String| +|option_group_arn|String| +|option_group_description|String| +|option_group_name|String| +|options|JSON| +|source_account_id|String| +|source_option_group|String| +|vpc_id|String| \ No newline at end of file diff --git a/plugins/source/aws/resources/plugin/tables.go b/plugins/source/aws/resources/plugin/tables.go index b555b2688a8fb0..e1f7eefd5825ef 100644 --- a/plugins/source/aws/resources/plugin/tables.go +++ b/plugins/source/aws/resources/plugin/tables.go @@ -378,8 +378,10 @@ func tables() []*schema.Table { rds.DbSecurityGroups(), rds.DbSnapshots(), rds.EngineVersions(), + rds.Events(), rds.EventSubscriptions(), rds.Instances(), + rds.OptionGroups(), rds.ReservedInstances(), rds.SubnetGroups(), redshift.Clusters(), diff --git a/plugins/source/aws/resources/services/rds/cluster_backtracks.go b/plugins/source/aws/resources/services/rds/cluster_backtracks.go new file mode 100644 index 00000000000000..e17b6dc4aa54c6 --- /dev/null +++ b/plugins/source/aws/resources/services/rds/cluster_backtracks.go @@ -0,0 +1,52 @@ +package rds + +import ( + "context" + + "github.com/aws/aws-sdk-go-v2/service/rds" + "github.com/aws/aws-sdk-go-v2/service/rds/types" + "github.com/cloudquery/cloudquery/plugins/source/aws/client" + "github.com/cloudquery/plugin-sdk/schema" + "github.com/cloudquery/plugin-sdk/transformers" +) + +func clusterBacktracks() *schema.Table { + return &schema.Table{ + Name: "aws_rds_cluster_backtracks", + Description: `https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBClusterBacktracks.html`, + Resolver: fetchRdsClusterBacktracks, + Transform: transformers.TransformWithStruct( + &types.DBClusterBacktrack{}, + transformers.WithPrimaryKeys("BacktrackIdentifier"), + ), + Columns: []schema.Column{ + client.DefaultAccountIDColumn(false), + client.DefaultRegionColumn(false), + { + Name: "db_cluster_arn", + Type: schema.TypeString, + Resolver: schema.ParentColumnResolver("arn"), + CreationOptions: schema.ColumnCreationOptions{ + PrimaryKey: true, + }, + }, + }, + } +} + +func fetchRdsClusterBacktracks(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error { + config := rds.DescribeDBClusterBacktracksInput{ + DBClusterIdentifier: parent.Item.(types.DBCluster).DBClusterIdentifier, + } + c := meta.(*client.Client) + svc := c.Services().Rds + p := rds.NewDescribeDBClusterBacktracksPaginator(svc, &config) + for p.HasMorePages() { + resp, err := p.NextPage(ctx) + if err != nil { + return err + } + res <- resp.DBClusterBacktracks + } + return nil +} diff --git a/plugins/source/aws/resources/services/rds/cluster_backtracks_mock_test.go b/plugins/source/aws/resources/services/rds/cluster_backtracks_mock_test.go new file mode 100644 index 00000000000000..f5a841ed8c1bf5 --- /dev/null +++ b/plugins/source/aws/resources/services/rds/cluster_backtracks_mock_test.go @@ -0,0 +1,23 @@ +package rds + +import ( + "testing" + + "github.com/aws/aws-sdk-go-v2/service/rds" + "github.com/aws/aws-sdk-go-v2/service/rds/types" + "github.com/cloudquery/cloudquery/plugins/source/aws/client/mocks" + "github.com/cloudquery/plugin-sdk/faker" + "github.com/golang/mock/gomock" +) + +func buildRdsClusterBacktracks(t *testing.T, mockRds *mocks.MockRdsClient) { + var d types.DBClusterBacktrack + err := faker.FakeObject(&d) + if err != nil { + t.Fatal(err) + } + + mockRds.EXPECT().DescribeDBClusterBacktracks(gomock.Any(), gomock.Any(), gomock.Any()).Return(&rds.DescribeDBClusterBacktracksOutput{ + DBClusterBacktracks: []types.DBClusterBacktrack{d}, + }, nil) +} diff --git a/plugins/source/aws/resources/services/rds/clusters.go b/plugins/source/aws/resources/services/rds/clusters.go index 518da016423f46..2462b358bfe7dd 100644 --- a/plugins/source/aws/resources/services/rds/clusters.go +++ b/plugins/source/aws/resources/services/rds/clusters.go @@ -31,5 +31,8 @@ func Clusters() *schema.Table { Resolver: resolveRdsClusterTags, }, }, + Relations: []*schema.Table{ + clusterBacktracks(), + }, } } diff --git a/plugins/source/aws/resources/services/rds/events.go b/plugins/source/aws/resources/services/rds/events.go new file mode 100644 index 00000000000000..ea4bcc0788d9f9 --- /dev/null +++ b/plugins/source/aws/resources/services/rds/events.go @@ -0,0 +1,43 @@ +package rds + +import ( + "context" + + "github.com/aws/aws-sdk-go-v2/service/rds" + "github.com/aws/aws-sdk-go-v2/service/rds/types" + "github.com/cloudquery/cloudquery/plugins/source/aws/client" + "github.com/cloudquery/plugin-sdk/schema" + "github.com/cloudquery/plugin-sdk/transformers" +) + +func Events() *schema.Table { + return &schema.Table{ + Name: "aws_rds_events", + Description: `https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeEvents.html`, + Resolver: fetchRdsEvents, + Transform: transformers.TransformWithStruct(&types.Event{}), + Multiplex: client.ServiceAccountRegionMultiplexer("rds"), + Columns: []schema.Column{ + client.DefaultAccountIDColumn(false), + client.DefaultRegionColumn(false), + }, + } +} + +func fetchRdsEvents(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error { + c := meta.(*client.Client) + svc := c.Services().Rds + duration := int32(60 * 24 * 14) // 14 days (maximum) + config := rds.DescribeEventsInput{ + Duration: &duration, + } + p := rds.NewDescribeEventsPaginator(svc, &config) + for p.HasMorePages() { + page, err := p.NextPage(ctx) + if err != nil { + return err + } + res <- page.Events + } + return nil +} diff --git a/plugins/source/aws/resources/services/rds/events_mock_test.go b/plugins/source/aws/resources/services/rds/events_mock_test.go new file mode 100644 index 00000000000000..3eef590c934c31 --- /dev/null +++ b/plugins/source/aws/resources/services/rds/events_mock_test.go @@ -0,0 +1,29 @@ +package rds + +import ( + "testing" + + "github.com/aws/aws-sdk-go-v2/service/rds" + "github.com/aws/aws-sdk-go-v2/service/rds/types" + "github.com/cloudquery/cloudquery/plugins/source/aws/client" + "github.com/cloudquery/cloudquery/plugins/source/aws/client/mocks" + "github.com/cloudquery/plugin-sdk/faker" + "github.com/golang/mock/gomock" +) + +func buildRDSEvents(t *testing.T, ctrl *gomock.Controller) client.Services { + mock := mocks.NewMockRdsClient(ctrl) + var events []types.Event + if err := faker.FakeObject(&events); err != nil { + t.Fatal(err) + } + mock.EXPECT().DescribeEvents(gomock.Any(), gomock.Any(), gomock.Any()).Return( + &rds.DescribeEventsOutput{Events: events}, + nil, + ) + return client.Services{Rds: mock} +} + +func TestRDSEvents(t *testing.T) { + client.AwsMockTestHelper(t, Events(), buildRDSEvents, client.TestOptions{}) +} diff --git a/plugins/source/aws/resources/services/rds/mock_test.go b/plugins/source/aws/resources/services/rds/mock_test.go index b53c7f75ad8296..ae5ad884b4be40 100644 --- a/plugins/source/aws/resources/services/rds/mock_test.go +++ b/plugins/source/aws/resources/services/rds/mock_test.go @@ -36,6 +36,8 @@ func buildRdsDBClusters(t *testing.T, ctrl *gomock.Controller) client.Services { t.Fatal(err) } + buildRdsClusterBacktracks(t, m) + m.EXPECT().DescribeDBClusters(gomock.Any(), gomock.Any(), gomock.Any()).Return( &rds.DescribeDBClustersOutput{ DBClusters: []rdsTypes.DBCluster{l}, diff --git a/plugins/source/aws/resources/services/rds/option_groups.go b/plugins/source/aws/resources/services/rds/option_groups.go new file mode 100644 index 00000000000000..d687fe47daac83 --- /dev/null +++ b/plugins/source/aws/resources/services/rds/option_groups.go @@ -0,0 +1,48 @@ +package rds + +import ( + "context" + + "github.com/aws/aws-sdk-go-v2/service/rds" + "github.com/aws/aws-sdk-go-v2/service/rds/types" + "github.com/cloudquery/cloudquery/plugins/source/aws/client" + "github.com/cloudquery/plugin-sdk/schema" + "github.com/cloudquery/plugin-sdk/transformers" +) + +func OptionGroups() *schema.Table { + return &schema.Table{ + Name: "aws_rds_option_groups", + Description: `https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_OptionGroup.html`, + Resolver: fetchOptionGroups, + Transform: transformers.TransformWithStruct(&types.OptionGroup{}), + Multiplex: client.ServiceAccountRegionMultiplexer("rds"), + Columns: []schema.Column{ + client.DefaultAccountIDColumn(false), + client.DefaultRegionColumn(false), + { + Name: "arn", + Type: schema.TypeString, + Resolver: schema.PathResolver("OptionGroupArn"), + CreationOptions: schema.ColumnCreationOptions{ + PrimaryKey: true, + }, + }, + }, + } +} + +func fetchOptionGroups(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error { + c := meta.(*client.Client) + svc := c.Services().Rds + config := rds.DescribeOptionGroupsInput{} + p := rds.NewDescribeOptionGroupsPaginator(svc, &config) + for p.HasMorePages() { + page, err := p.NextPage(ctx) + if err != nil { + return err + } + res <- page.OptionGroupsList + } + return nil +} diff --git a/plugins/source/aws/resources/services/rds/option_groups_mock_test.go b/plugins/source/aws/resources/services/rds/option_groups_mock_test.go new file mode 100644 index 00000000000000..960a4f9c068526 --- /dev/null +++ b/plugins/source/aws/resources/services/rds/option_groups_mock_test.go @@ -0,0 +1,29 @@ +package rds + +import ( + "testing" + + "github.com/aws/aws-sdk-go-v2/service/rds" + "github.com/aws/aws-sdk-go-v2/service/rds/types" + "github.com/cloudquery/cloudquery/plugins/source/aws/client" + "github.com/cloudquery/cloudquery/plugins/source/aws/client/mocks" + "github.com/cloudquery/plugin-sdk/faker" + "github.com/golang/mock/gomock" +) + +func buildOptionGroups(t *testing.T, ctrl *gomock.Controller) client.Services { + mock := mocks.NewMockRdsClient(ctrl) + var s types.OptionGroup + if err := faker.FakeObject(&s); err != nil { + t.Fatal(err) + } + mock.EXPECT().DescribeOptionGroups(gomock.Any(), &rds.DescribeOptionGroupsInput{}, gomock.Any()).Return( + &rds.DescribeOptionGroupsOutput{OptionGroupsList: []types.OptionGroup{s}}, + nil, + ) + return client.Services{Rds: mock} +} + +func TestRDSOptionGroups(t *testing.T) { + client.AwsMockTestHelper(t, OptionGroups(), buildOptionGroups, client.TestOptions{}) +} diff --git a/website/pages/docs/plugins/sources/aws/tables.md b/website/pages/docs/plugins/sources/aws/tables.md index ac15b5bebecd10..92f0b6f9078670 100644 --- a/website/pages/docs/plugins/sources/aws/tables.md +++ b/website/pages/docs/plugins/sources/aws/tables.md @@ -406,6 +406,7 @@ - [aws_rds_cluster_parameter_group_parameters](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/aws/docs/tables/aws_rds_cluster_parameter_group_parameters.md) - [aws_rds_cluster_snapshots](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/aws/docs/tables/aws_rds_cluster_snapshots.md) - [aws_rds_clusters](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/aws/docs/tables/aws_rds_clusters.md) + - [aws_rds_cluster_backtracks](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/aws/docs/tables/aws_rds_cluster_backtracks.md) - [aws_rds_db_parameter_groups](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/aws/docs/tables/aws_rds_db_parameter_groups.md) - [aws_rds_db_parameter_group_db_parameters](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/aws/docs/tables/aws_rds_db_parameter_group_db_parameters.md) - [aws_rds_db_security_groups](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/aws/docs/tables/aws_rds_db_security_groups.md) @@ -413,7 +414,9 @@ - [aws_rds_engine_versions](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/aws/docs/tables/aws_rds_engine_versions.md) - [aws_rds_cluster_parameters](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/aws/docs/tables/aws_rds_cluster_parameters.md) - [aws_rds_event_subscriptions](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/aws/docs/tables/aws_rds_event_subscriptions.md) +- [aws_rds_events](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/aws/docs/tables/aws_rds_events.md) - [aws_rds_instances](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/aws/docs/tables/aws_rds_instances.md) +- [aws_rds_option_groups](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/aws/docs/tables/aws_rds_option_groups.md) - [aws_rds_reserved_instances](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/aws/docs/tables/aws_rds_reserved_instances.md) - [aws_rds_subnet_groups](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/aws/docs/tables/aws_rds_subnet_groups.md) - [aws_redshift_clusters](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/aws/docs/tables/aws_redshift_clusters.md)