Skip to content

Commit 711e3bf

Browse files
committed
Add s3 fetchers
1 parent 0dead60 commit 711e3bf

File tree

12 files changed

+570
-1
lines changed

12 files changed

+570
-1
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Blazebit
4+
*/
5+
package com.blazebit.query.connector.aws.s3;
6+
7+
import com.blazebit.query.connector.aws.base.AwsWrapper;
8+
import software.amazon.awssdk.services.s3.model.Grant;
9+
10+
/**
11+
* @author Donghwi Kim
12+
* @since 1.0.0
13+
*/
14+
public class AwsGrant extends AwsWrapper<Grant> {
15+
public AwsGrant(String accountId, String region, String resourceId, Grant payload) {
16+
super( accountId, region, resourceId, payload );
17+
}
18+
19+
@Override
20+
public Grant getPayload() {
21+
return super.getPayload();
22+
}
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Blazebit
4+
*/
5+
package com.blazebit.query.connector.aws.s3;
6+
7+
import com.blazebit.query.connector.aws.base.AwsWrapper;
8+
import software.amazon.awssdk.services.s3.model.LoggingEnabled;
9+
10+
/**
11+
* @author Donghwi Kim
12+
* @since 1.0.0
13+
*/
14+
public class AwsLoggingEnabled extends AwsWrapper<LoggingEnabled> {
15+
public AwsLoggingEnabled(String accountId, String region, String resourceId, LoggingEnabled payload) {
16+
super( accountId, region, resourceId, payload );
17+
}
18+
19+
@Override
20+
public LoggingEnabled getPayload() {
21+
return super.getPayload();
22+
}
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Blazebit
4+
*/
5+
package com.blazebit.query.connector.aws.s3;
6+
7+
import com.blazebit.query.connector.aws.base.AwsWrapper;
8+
import software.amazon.awssdk.services.s3.model.ObjectLockConfiguration;
9+
10+
/**
11+
* @author Donghwi Kim
12+
* @since 1.0.0
13+
*/
14+
public class AwsObjectLockConfiguration extends AwsWrapper<ObjectLockConfiguration> {
15+
public AwsObjectLockConfiguration(String accountId, String region, String resourceId, ObjectLockConfiguration payload) {
16+
super( accountId, region, resourceId, payload );
17+
}
18+
19+
@Override
20+
public ObjectLockConfiguration getPayload() {
21+
return super.getPayload();
22+
}
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Blazebit
4+
*/
5+
package com.blazebit.query.connector.aws.s3;
6+
7+
import com.blazebit.query.connector.aws.base.AwsWrapper;
8+
import software.amazon.awssdk.services.s3.model.PolicyStatus;
9+
10+
/**
11+
* @author Donghwi Kim
12+
* @since 1.0.0
13+
*/
14+
public class AwsPolicyStatus extends AwsWrapper<PolicyStatus> {
15+
public AwsPolicyStatus(String accountId, String region, String resourceId, PolicyStatus payload) {
16+
super( accountId, region, resourceId, payload );
17+
}
18+
19+
@Override
20+
public PolicyStatus getPayload() {
21+
return super.getPayload();
22+
}
23+
}

connector/aws/s3/src/main/java/com/blazebit/query/connector/aws/s3/AwsS3SchemaProvider.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,12 @@ public final class AwsS3SchemaProvider implements QuerySchemaProvider {
2121
public Set<? extends DataFetcher<?>> resolveSchemaObjects(ConfigurationProvider configurationProvider) {
2222
return Set.of(
2323
BucketDataFetcher.INSTANCE,
24-
PublicAccessBlockConfigurationFetcher.INSTANCE
24+
GrantFetcher.INSTANCE,
25+
LoggingEnabledFetcher.INSTANCE,
26+
ObjectLockConfigurationFetcher.INSTANCE,
27+
PolicyStatusFetcher.INSTANCE,
28+
PublicAccessBlockConfigurationFetcher.INSTANCE,
29+
ServerSideEncryptionConfigurationFetcher.INSTANCE
2530
);
2631
}
2732
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Blazebit
4+
*/
5+
package com.blazebit.query.connector.aws.s3;
6+
7+
import com.blazebit.query.connector.aws.base.AwsWrapper;
8+
import software.amazon.awssdk.services.s3.model.ServerSideEncryptionConfiguration;
9+
10+
/**
11+
* @author Donghwi Kim
12+
* @since 1.0.0
13+
*/
14+
public class AwsServerSideEncryptionConfiguration extends AwsWrapper<ServerSideEncryptionConfiguration> {
15+
public AwsServerSideEncryptionConfiguration(String accountId, String region, String resourceId, ServerSideEncryptionConfiguration payload) {
16+
super( accountId, region, resourceId, payload );
17+
}
18+
19+
@Override
20+
public ServerSideEncryptionConfiguration getPayload() {
21+
return super.getPayload();
22+
}
23+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Blazebit
4+
*/
5+
package com.blazebit.query.connector.aws.s3;
6+
7+
import com.blazebit.query.connector.aws.base.AwsConnectorConfig;
8+
import com.blazebit.query.connector.aws.base.AwsConventionContext;
9+
import com.blazebit.query.connector.base.DataFormats;
10+
import com.blazebit.query.spi.DataFetchContext;
11+
import com.blazebit.query.spi.DataFetcher;
12+
import com.blazebit.query.spi.DataFetcherException;
13+
import com.blazebit.query.spi.DataFormat;
14+
import software.amazon.awssdk.http.SdkHttpClient;
15+
import software.amazon.awssdk.regions.Region;
16+
import software.amazon.awssdk.services.s3.S3Client;
17+
import software.amazon.awssdk.services.s3.S3ClientBuilder;
18+
import software.amazon.awssdk.services.s3.model.Bucket;
19+
import software.amazon.awssdk.services.s3.model.GetBucketAclRequest;
20+
import software.amazon.awssdk.services.s3.model.Grant;
21+
22+
import java.io.Serializable;
23+
import java.util.ArrayList;
24+
import java.util.List;
25+
26+
/**
27+
* @author Donghwi Kim
28+
* @since 1.0.0
29+
*/
30+
public class GrantFetcher implements DataFetcher<AwsGrant>, Serializable {
31+
32+
public static final GrantFetcher INSTANCE = new GrantFetcher();
33+
34+
private GrantFetcher() {
35+
}
36+
37+
@Override
38+
public List<AwsGrant> fetch(DataFetchContext context) {
39+
try {
40+
List<AwsConnectorConfig.Account> accounts = AwsConnectorConfig.ACCOUNT.getAll( context );
41+
SdkHttpClient sdkHttpClient = AwsConnectorConfig.HTTP_CLIENT.find( context );
42+
List<AwsGrant> list = new ArrayList<>();
43+
for ( AwsConnectorConfig.Account account : accounts ) {
44+
for ( Region region : account.getRegions() ) {
45+
S3ClientBuilder s3ClientBuilder = S3Client.builder()
46+
.region( region )
47+
.credentialsProvider( account.getCredentialsProvider() );
48+
if ( sdkHttpClient != null ) {
49+
s3ClientBuilder.httpClient( sdkHttpClient );
50+
}
51+
try (S3Client client = s3ClientBuilder.build()) {
52+
for ( Bucket bucket : client.listBuckets().buckets() ) {
53+
var bucketAcl = client.getBucketAcl(
54+
GetBucketAclRequest.builder().bucket( bucket.name() )
55+
.build() );
56+
for ( Grant grant : bucketAcl.grants() ) {
57+
list.add( new AwsGrant(
58+
account.getAccountId(),
59+
region.id(),
60+
bucket.name(),
61+
grant
62+
) );
63+
}
64+
}
65+
}
66+
}
67+
}
68+
return list;
69+
}
70+
catch (Exception e) {
71+
throw new DataFetcherException( "Could not fetch grant list", e );
72+
}
73+
}
74+
75+
@Override
76+
public DataFormat getDataFormat() {
77+
return DataFormats.componentMethodConvention( AwsGrant.class, AwsConventionContext.INSTANCE );
78+
}
79+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Blazebit
4+
*/
5+
package com.blazebit.query.connector.aws.s3;
6+
7+
import com.blazebit.query.connector.aws.base.AwsConnectorConfig;
8+
import com.blazebit.query.connector.aws.base.AwsConventionContext;
9+
import com.blazebit.query.connector.base.DataFormats;
10+
import com.blazebit.query.spi.DataFetchContext;
11+
import com.blazebit.query.spi.DataFetcher;
12+
import com.blazebit.query.spi.DataFetcherException;
13+
import com.blazebit.query.spi.DataFormat;
14+
import software.amazon.awssdk.http.SdkHttpClient;
15+
import software.amazon.awssdk.regions.Region;
16+
import software.amazon.awssdk.services.s3.S3Client;
17+
import software.amazon.awssdk.services.s3.S3ClientBuilder;
18+
import software.amazon.awssdk.services.s3.model.Bucket;
19+
import software.amazon.awssdk.services.s3.model.GetBucketLoggingRequest;
20+
21+
import java.io.Serializable;
22+
import java.util.ArrayList;
23+
import java.util.List;
24+
25+
/**
26+
* @author Donghwi Kim
27+
* @since 1.0.0
28+
*/
29+
public class LoggingEnabledFetcher implements DataFetcher<AwsLoggingEnabled>, Serializable {
30+
31+
public static final LoggingEnabledFetcher INSTANCE = new LoggingEnabledFetcher();
32+
33+
private LoggingEnabledFetcher() {
34+
}
35+
36+
@Override
37+
public List<AwsLoggingEnabled> fetch(DataFetchContext context) {
38+
try {
39+
List<AwsConnectorConfig.Account> accounts = AwsConnectorConfig.ACCOUNT.getAll( context );
40+
SdkHttpClient sdkHttpClient = AwsConnectorConfig.HTTP_CLIENT.find( context );
41+
List<AwsLoggingEnabled> list = new ArrayList<>();
42+
for ( AwsConnectorConfig.Account account : accounts ) {
43+
for ( Region region : account.getRegions() ) {
44+
S3ClientBuilder s3ClientBuilder = S3Client.builder()
45+
.region( region )
46+
.credentialsProvider( account.getCredentialsProvider() );
47+
if ( sdkHttpClient != null ) {
48+
s3ClientBuilder.httpClient( sdkHttpClient );
49+
}
50+
try (S3Client client = s3ClientBuilder.build()) {
51+
for ( Bucket bucket : client.listBuckets().buckets() ) {
52+
GetBucketLoggingRequest.builder().build();
53+
var bucketLogging = client.getBucketLogging(
54+
GetBucketLoggingRequest.builder().bucket( bucket.name() )
55+
.build() );
56+
list.add( new AwsLoggingEnabled(
57+
account.getAccountId(),
58+
region.id(),
59+
bucket.name(),
60+
bucketLogging.loggingEnabled()
61+
) );
62+
}
63+
}
64+
}
65+
}
66+
return list;
67+
}
68+
catch (Exception e) {
69+
throw new DataFetcherException( "Could not fetch logging enabled list", e );
70+
}
71+
}
72+
73+
@Override
74+
public DataFormat getDataFormat() {
75+
return DataFormats.componentMethodConvention( AwsLoggingEnabled.class, AwsConventionContext.INSTANCE );
76+
}
77+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Blazebit
4+
*/
5+
package com.blazebit.query.connector.aws.s3;
6+
7+
import com.blazebit.query.connector.aws.base.AwsConnectorConfig;
8+
import com.blazebit.query.connector.aws.base.AwsConventionContext;
9+
import com.blazebit.query.connector.base.DataFormats;
10+
import com.blazebit.query.spi.DataFetchContext;
11+
import com.blazebit.query.spi.DataFetcher;
12+
import com.blazebit.query.spi.DataFetcherException;
13+
import com.blazebit.query.spi.DataFormat;
14+
import software.amazon.awssdk.http.SdkHttpClient;
15+
import software.amazon.awssdk.regions.Region;
16+
import software.amazon.awssdk.services.s3.S3Client;
17+
import software.amazon.awssdk.services.s3.S3ClientBuilder;
18+
import software.amazon.awssdk.services.s3.model.Bucket;
19+
import software.amazon.awssdk.services.s3.model.GetObjectLockConfigurationRequest;
20+
import software.amazon.awssdk.services.s3.model.S3Exception;
21+
22+
import java.io.Serializable;
23+
import java.util.ArrayList;
24+
import java.util.List;
25+
26+
/**
27+
* @author Donghwi Kim
28+
* @since 1.0.0
29+
*/
30+
public class ObjectLockConfigurationFetcher implements DataFetcher<AwsObjectLockConfiguration>, Serializable {
31+
32+
public static final ObjectLockConfigurationFetcher INSTANCE = new ObjectLockConfigurationFetcher();
33+
34+
private ObjectLockConfigurationFetcher() {
35+
}
36+
37+
@Override
38+
public List<AwsObjectLockConfiguration> fetch(DataFetchContext context) {
39+
try {
40+
List<AwsConnectorConfig.Account> accounts = AwsConnectorConfig.ACCOUNT.getAll( context );
41+
SdkHttpClient sdkHttpClient = AwsConnectorConfig.HTTP_CLIENT.find( context );
42+
List<AwsObjectLockConfiguration> list = new ArrayList<>();
43+
for ( AwsConnectorConfig.Account account : accounts ) {
44+
for ( Region region : account.getRegions() ) {
45+
S3ClientBuilder s3ClientBuilder = S3Client.builder()
46+
.region( region )
47+
.credentialsProvider( account.getCredentialsProvider() );
48+
if ( sdkHttpClient != null ) {
49+
s3ClientBuilder.httpClient( sdkHttpClient );
50+
}
51+
try (S3Client client = s3ClientBuilder.build()) {
52+
for ( Bucket bucket : client.listBuckets().buckets() ) {
53+
try {
54+
var objectLockConfiguration = client.getObjectLockConfiguration(
55+
GetObjectLockConfigurationRequest.builder().bucket( bucket.name() )
56+
.build() ).objectLockConfiguration();
57+
list.add( new AwsObjectLockConfiguration(
58+
account.getAccountId(),
59+
region.id(),
60+
bucket.name(),
61+
objectLockConfiguration
62+
) );
63+
}
64+
catch (S3Exception e) {
65+
if ( "ObjectLockConfigurationNotFoundError".equals(
66+
e.awsErrorDetails().errorCode() ) ) {
67+
continue;
68+
}
69+
throw e;
70+
}
71+
}
72+
}
73+
}
74+
}
75+
return list;
76+
}
77+
catch (Exception e) {
78+
throw new DataFetcherException( "Could not fetch object lock configuration list", e );
79+
}
80+
}
81+
82+
@Override
83+
public DataFormat getDataFormat() {
84+
return DataFormats.componentMethodConvention( AwsObjectLockConfiguration.class, AwsConventionContext.INSTANCE );
85+
}
86+
}

0 commit comments

Comments
 (0)