Skip to content

Commit 66a20a5

Browse files
authored
feat(resources): Add additional emr resources for studio and studio session mapping (#12529)
#### Summary Fixes: #12528 <!-- Explain what problem this PR addresses --> <!--
1 parent c07ba44 commit 66a20a5

File tree

8 files changed

+265
-0
lines changed

8 files changed

+265
-0
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,8 @@
307307
- [aws_emr_cluster_instance_groups](../../../../../website/tables/aws/aws_emr_cluster_instance_groups.md)
308308
- [aws_emr_cluster_instances](../../../../../website/tables/aws/aws_emr_cluster_instances.md)
309309
- [aws_emr_security_configurations](../../../../../website/tables/aws/aws_emr_security_configurations.md)
310+
- [aws_emr_studios](../../../../../website/tables/aws/aws_emr_studios.md)
311+
- [aws_emr_studio_session_mappings](../../../../../website/tables/aws/aws_emr_studio_session_mappings.md)
310312
- [aws_eventbridge_api_destinations](../../../../../website/tables/aws/aws_eventbridge_api_destinations.md)
311313
- [aws_eventbridge_archives](../../../../../website/tables/aws/aws_eventbridge_archives.md)
312314
- [aws_eventbridge_connections](../../../../../website/tables/aws/aws_eventbridge_connections.md)

plugins/source/aws/resources/plugin/tables.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ func getTables() schema.Tables {
319319
emr.BlockPublicAccessConfigs(),
320320
emr.Clusters(),
321321
emr.SecurityConfigurations(),
322+
emr.Studios(),
322323
eventbridge.ApiDestinations(),
323324
eventbridge.Archives(),
324325
eventbridge.Connections(),
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package emr
2+
3+
import (
4+
"context"
5+
"github.com/apache/arrow/go/v13/arrow"
6+
"github.com/aws/aws-sdk-go-v2/service/emr"
7+
"github.com/aws/aws-sdk-go-v2/service/emr/types"
8+
"github.com/cloudquery/cloudquery/plugins/source/aws/client"
9+
"github.com/cloudquery/plugin-sdk/v4/schema"
10+
"github.com/cloudquery/plugin-sdk/v4/transformers"
11+
)
12+
13+
func studioSessionMapping() *schema.Table {
14+
tableName := "aws_emr_studio_session_mappings"
15+
return &schema.Table{
16+
Name: tableName,
17+
Description: `https://docs.aws.amazon.com/emr/latest/APIReference/API_GetStudioSessionMapping.html`,
18+
Resolver: fetchEmrStudioSessionMapping,
19+
PreResourceResolver: getSessionMapping,
20+
Transform: transformers.TransformWithStruct(&types.SessionMappingDetail{}, transformers.WithPrimaryKeys("IdentityType", "IdentityId")),
21+
Columns: []schema.Column{
22+
client.DefaultAccountIDColumn(false),
23+
client.DefaultRegionColumn(false),
24+
{
25+
Name: "studio_arn",
26+
Description: "The Amazon Resource Name (ARN) of the EMR Studio.",
27+
Type: arrow.BinaryTypes.String,
28+
Resolver: schema.ParentColumnResolver("arn"),
29+
PrimaryKey: true,
30+
},
31+
},
32+
}
33+
}
34+
35+
func fetchEmrStudioSessionMapping(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error {
36+
cl := meta.(*client.Client)
37+
p := parent.Item.(*types.Studio)
38+
svc := cl.Services().Emr
39+
paginator := emr.NewListStudioSessionMappingsPaginator(svc, &emr.ListStudioSessionMappingsInput{
40+
StudioId: p.StudioId,
41+
})
42+
for paginator.HasMorePages() {
43+
page, err := paginator.NextPage(ctx, func(options *emr.Options) {
44+
options.Region = cl.Region
45+
})
46+
if err != nil {
47+
return err
48+
}
49+
res <- page.SessionMappings
50+
}
51+
return nil
52+
}
53+
54+
func getSessionMapping(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource) error {
55+
cl := meta.(*client.Client)
56+
svc := cl.Services().Emr
57+
sms := resource.Item.(types.SessionMappingSummary)
58+
response, err := svc.GetStudioSessionMapping(ctx, &emr.GetStudioSessionMappingInput{
59+
StudioId: sms.StudioId,
60+
IdentityType: sms.IdentityType,
61+
IdentityId: sms.IdentityId,
62+
}, func(options *emr.Options) {
63+
options.Region = cl.Region
64+
})
65+
if err != nil {
66+
return err
67+
}
68+
resource.Item = response.SessionMapping
69+
return nil
70+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package emr
2+
3+
import (
4+
"context"
5+
"github.com/apache/arrow/go/v13/arrow"
6+
"github.com/aws/aws-sdk-go-v2/service/emr"
7+
"github.com/aws/aws-sdk-go-v2/service/emr/types"
8+
"github.com/cloudquery/cloudquery/plugins/source/aws/client"
9+
"github.com/cloudquery/plugin-sdk/v4/schema"
10+
"github.com/cloudquery/plugin-sdk/v4/transformers"
11+
)
12+
13+
func Studios() *schema.Table {
14+
tableName := "aws_emr_studios"
15+
return &schema.Table{
16+
Name: tableName,
17+
Description: `https://docs.aws.amazon.com/emr/latest/APIReference/API_Studio.html`,
18+
Resolver: fetchEmrStudios,
19+
PreResourceResolver: getStudio,
20+
Multiplex: client.ServiceAccountRegionMultiplexer(tableName, "elasticmapreduce"),
21+
Transform: transformers.TransformWithStruct(&types.Studio{}),
22+
Columns: []schema.Column{
23+
client.DefaultAccountIDColumn(false),
24+
client.DefaultRegionColumn(false),
25+
{
26+
Name: "arn",
27+
Type: arrow.BinaryTypes.String,
28+
Description: `The Amazon Resource Name (ARN) of the EMR Studio.`,
29+
Resolver: schema.PathResolver("StudioArn"),
30+
PrimaryKey: true,
31+
},
32+
},
33+
Relations: []*schema.Table{
34+
studioSessionMapping(),
35+
},
36+
}
37+
}
38+
39+
func fetchEmrStudios(ctx context.Context, meta schema.ClientMeta, _ *schema.Resource, res chan<- any) error {
40+
config := emr.ListStudiosInput{}
41+
cl := meta.(*client.Client)
42+
svc := cl.Services().Emr
43+
paginator := emr.NewListStudiosPaginator(svc, &config)
44+
for paginator.HasMorePages() {
45+
page, err := paginator.NextPage(ctx, func(options *emr.Options) {
46+
options.Region = cl.Region
47+
})
48+
if err != nil {
49+
return err
50+
}
51+
res <- page.Studios
52+
}
53+
return nil
54+
}
55+
56+
func getStudio(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource) error {
57+
cl := meta.(*client.Client)
58+
svc := cl.Services().Emr
59+
response, err := svc.DescribeStudio(ctx, &emr.DescribeStudioInput{StudioId: resource.Item.(types.StudioSummary).StudioId}, func(options *emr.Options) {
60+
options.Region = cl.Region
61+
})
62+
if err != nil {
63+
return err
64+
}
65+
resource.Item = response.Studio
66+
return nil
67+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package emr
2+
3+
import (
4+
"github.com/aws/aws-sdk-go-v2/service/emr"
5+
"github.com/aws/aws-sdk-go-v2/service/emr/types"
6+
"github.com/cloudquery/cloudquery/plugins/source/aws/client"
7+
"github.com/cloudquery/cloudquery/plugins/source/aws/client/mocks"
8+
"github.com/cloudquery/plugin-sdk/v4/faker"
9+
"github.com/golang/mock/gomock"
10+
"github.com/stretchr/testify/require"
11+
"testing"
12+
)
13+
14+
func buildStudios(t *testing.T, ctrl *gomock.Controller) client.Services {
15+
mock := mocks.NewMockEmrClient(ctrl)
16+
var summary types.StudioSummary
17+
require.NoError(t, faker.FakeObject(&summary))
18+
19+
mock.EXPECT().ListStudios(gomock.Any(), &emr.ListStudiosInput{}, gomock.Any()).Return(
20+
&emr.ListStudiosOutput{Studios: []types.StudioSummary{summary}},
21+
nil,
22+
)
23+
24+
var studio types.Studio
25+
require.NoError(t, faker.FakeObject(&studio))
26+
mock.EXPECT().DescribeStudio(gomock.Any(), &emr.DescribeStudioInput{StudioId: summary.StudioId}, gomock.Any()).Return(
27+
&emr.DescribeStudioOutput{Studio: &studio},
28+
nil,
29+
)
30+
31+
var sessionMappingSummary types.SessionMappingSummary
32+
require.NoError(t, faker.FakeObject(&sessionMappingSummary))
33+
mock.EXPECT().ListStudioSessionMappings(gomock.Any(), &emr.ListStudioSessionMappingsInput{StudioId: summary.StudioId}, gomock.Any()).Return(
34+
&emr.ListStudioSessionMappingsOutput{SessionMappings: []types.SessionMappingSummary{sessionMappingSummary}},
35+
nil,
36+
)
37+
38+
var sessionMappingDetail types.SessionMappingDetail
39+
require.NoError(t, faker.FakeObject(&sessionMappingDetail))
40+
mock.EXPECT().GetStudioSessionMapping(gomock.Any(), &emr.GetStudioSessionMappingInput{
41+
StudioId: sessionMappingSummary.StudioId,
42+
IdentityType: sessionMappingSummary.IdentityType,
43+
IdentityId: sessionMappingSummary.IdentityId,
44+
}, gomock.Any()).Return(
45+
&emr.GetStudioSessionMappingOutput{
46+
SessionMapping: &sessionMappingDetail,
47+
},
48+
nil,
49+
)
50+
51+
return client.Services{Emr: mock}
52+
}
53+
54+
func TestStudios(t *testing.T) {
55+
client.AwsMockTestHelper(t, Studios(), buildStudios, client.TestOptions{})
56+
}

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

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Table: aws_emr_studio_session_mappings
2+
3+
This table shows data for Amazon EMR Studio Session Mappings.
4+
5+
https://docs.aws.amazon.com/emr/latest/APIReference/API_GetStudioSessionMapping.html
6+
7+
The composite primary key for this table is (**studio_arn**, **identity_id**, **identity_type**).
8+
9+
## Relations
10+
11+
This table depends on [aws_emr_studios](aws_emr_studios).
12+
13+
## Columns
14+
15+
| Name | Type |
16+
| ------------- | ------------- |
17+
|_cq_id|`uuid`|
18+
|_cq_parent_id|`uuid`|
19+
|account_id|`utf8`|
20+
|region|`utf8`|
21+
|studio_arn (PK)|`utf8`|
22+
|creation_time|`timestamp[us, tz=UTC]`|
23+
|identity_id (PK)|`utf8`|
24+
|identity_name|`utf8`|
25+
|identity_type (PK)|`utf8`|
26+
|last_modified_time|`timestamp[us, tz=UTC]`|
27+
|session_policy_arn|`utf8`|
28+
|studio_id|`utf8`|
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Table: aws_emr_studios
2+
3+
This table shows data for Amazon EMR Studios.
4+
5+
https://docs.aws.amazon.com/emr/latest/APIReference/API_Studio.html
6+
7+
The primary key for this table is **arn**.
8+
9+
## Relations
10+
11+
The following tables depend on aws_emr_studios:
12+
- [aws_emr_studio_session_mappings](aws_emr_studio_session_mappings)
13+
14+
## Columns
15+
16+
| Name | Type |
17+
| ------------- | ------------- |
18+
|_cq_id|`uuid`|
19+
|_cq_parent_id|`uuid`|
20+
|account_id|`utf8`|
21+
|region|`utf8`|
22+
|arn (PK)|`utf8`|
23+
|auth_mode|`utf8`|
24+
|creation_time|`timestamp[us, tz=UTC]`|
25+
|default_s3_location|`utf8`|
26+
|description|`utf8`|
27+
|engine_security_group_id|`utf8`|
28+
|idp_auth_url|`utf8`|
29+
|idp_relay_state_parameter_name|`utf8`|
30+
|name|`utf8`|
31+
|service_role|`utf8`|
32+
|studio_arn|`utf8`|
33+
|studio_id|`utf8`|
34+
|subnet_ids|`list<item: utf8, nullable>`|
35+
|tags|`json`|
36+
|url|`utf8`|
37+
|user_role|`utf8`|
38+
|vpc_id|`utf8`|
39+
|workspace_security_group_id|`utf8`|

0 commit comments

Comments
 (0)