Skip to content

Commit 28068c0

Browse files
committed
Handle RemoteS3Facade dynamic creation in RemoteS3ConnectionController
Replace the RemoteS3Facade plugin type with a RemoteS3FacadeFactory that creates RemoteS3Facade instances based on Map<String, String> configs. Add RemoteS3FacadeManager to create the default RemoteS3Facade from configs in `remote-s3-facade.properties`.
1 parent 7c495ea commit 28068c0

16 files changed

+288
-244
lines changed

trino-aws-proxy-spi/src/main/java/io/trino/aws/proxy/spi/plugin/TrinoAwsProxyServerBinding.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@
2424
import io.trino.aws.proxy.spi.plugin.config.AssumedRoleProviderConfig;
2525
import io.trino.aws.proxy.spi.plugin.config.CredentialsProviderConfig;
2626
import io.trino.aws.proxy.spi.plugin.config.PluginIdentifierConfig;
27-
import io.trino.aws.proxy.spi.plugin.config.RemoteS3Config;
2827
import io.trino.aws.proxy.spi.plugin.config.RemoteS3ConnectionProviderConfig;
2928
import io.trino.aws.proxy.spi.plugin.config.S3RequestRewriterConfig;
3029
import io.trino.aws.proxy.spi.plugin.config.S3SecurityFacadeProviderConfig;
3130
import io.trino.aws.proxy.spi.remote.RemoteS3ConnectionProvider;
32-
import io.trino.aws.proxy.spi.remote.RemoteS3Facade;
31+
import io.trino.aws.proxy.spi.remote.RemoteS3FacadeFactory;
3332
import io.trino.aws.proxy.spi.rest.S3RequestRewriter;
3433
import io.trino.aws.proxy.spi.security.S3SecurityFacadeProvider;
3534

35+
import static com.google.inject.multibindings.Multibinder.newSetBinder;
3636
import static com.google.inject.multibindings.OptionalBinder.newOptionalBinder;
3737
import static io.airlift.configuration.ConditionalModule.conditionalModule;
3838
import static io.airlift.configuration.ConfigurationAwareModule.combine;
@@ -66,9 +66,9 @@ static Module s3RequestRewriterModule(String identifier, Class<? extends S3Reque
6666
return optionalPluginModule(S3RequestRewriterConfig.class, identifier, S3RequestRewriter.class, implementationClass, module);
6767
}
6868

69-
static Module remoteS3Module(String identifier, Class<? extends RemoteS3Facade> implementationClass, Module module)
69+
static Module remoteS3FacadeFactory(Class<? extends RemoteS3FacadeFactory> factory)
7070
{
71-
return optionalPluginModule(RemoteS3Config.class, identifier, RemoteS3Facade.class, implementationClass, module);
71+
return binder -> newSetBinder(binder, RemoteS3FacadeFactory.class).addBinding().to(factory).in(Scopes.SINGLETON);
7272
}
7373

7474
static <T extends Identity> void bindIdentityType(Binder binder, Class<T> type)

trino-aws-proxy-spi/src/main/java/io/trino/aws/proxy/spi/plugin/config/RemoteS3Config.java renamed to trino-aws-proxy-spi/src/main/java/io/trino/aws/proxy/spi/remote/RemoteS3FacadeFactory.java

+5-20
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,13 @@
1111
* See the License for the specific language governing permissions and
1212
* limitations under the License.
1313
*/
14-
package io.trino.aws.proxy.spi.plugin.config;
14+
package io.trino.aws.proxy.spi.remote;
1515

16-
import io.airlift.configuration.Config;
17-
import jakarta.validation.constraints.NotNull;
16+
import java.util.Map;
1817

19-
import java.util.Optional;
20-
21-
public class RemoteS3Config
22-
implements PluginIdentifierConfig
18+
public interface RemoteS3FacadeFactory
2319
{
24-
private Optional<String> identifier = Optional.empty();
25-
26-
@NotNull
27-
@Override
28-
public Optional<String> getPluginIdentifier()
29-
{
30-
return identifier;
31-
}
20+
RemoteS3Facade create(Map<String, String> configs);
3221

33-
@Config("remote-s3.type")
34-
public void setPluginIdentifier(String identifier)
35-
{
36-
this.identifier = Optional.of(identifier);
37-
}
22+
String name();
3823
}

trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/TrinoAwsProxyServer.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
package io.trino.aws.proxy.server;
1515

1616
import com.google.common.collect.ImmutableList;
17+
import com.google.inject.Injector;
1718
import com.google.inject.Module;
1819
import io.airlift.bootstrap.Bootstrap;
1920
import io.airlift.http.server.HttpServerModule;
@@ -25,6 +26,7 @@
2526
import io.airlift.log.Logger;
2627
import io.airlift.node.NodeModule;
2728
import io.airlift.openmetrics.JmxOpenMetricsModule;
29+
import io.trino.aws.proxy.server.remote.RemoteS3FacadeManager;
2830
import org.weakref.jmx.guice.MBeanModule;
2931

3032
public final class TrinoAwsProxyServer
@@ -48,7 +50,9 @@ public static void main(String[] args)
4850
.add(new MBeanModule());
4951

5052
Bootstrap app = new Bootstrap(modules.build());
51-
app.initialize();
53+
Injector injector = app.initialize();
54+
55+
injector.getInstance(RemoteS3FacadeManager.class).loadDefaultRemoteS3Facade();
5256

5357
log.info("======== SERVER STARTED ========");
5458
}

trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/TrinoAwsProxyServerModule.java

+32-17
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,9 @@
3232
import io.trino.aws.proxy.server.credentials.CredentialsModule;
3333
import io.trino.aws.proxy.server.credentials.file.FileBasedCredentialsModule;
3434
import io.trino.aws.proxy.server.credentials.http.HttpCredentialsModule;
35-
import io.trino.aws.proxy.server.remote.DefaultRemoteS3Module;
35+
import io.trino.aws.proxy.server.remote.DefaultRemoteS3FacadeFactory;
3636
import io.trino.aws.proxy.server.remote.RemoteS3ConnectionController;
37+
import io.trino.aws.proxy.server.remote.RemoteS3FacadeManager;
3738
import io.trino.aws.proxy.server.rest.LimitStreamController;
3839
import io.trino.aws.proxy.server.rest.ResourceSecurityDynamicFeature;
3940
import io.trino.aws.proxy.server.rest.RestModule;
@@ -50,12 +51,12 @@
5051
import io.trino.aws.proxy.server.signing.SigningControllerConfig;
5152
import io.trino.aws.proxy.server.signing.SigningModule;
5253
import io.trino.aws.proxy.spi.plugin.TrinoAwsProxyServerPlugin;
53-
import io.trino.aws.proxy.spi.plugin.config.RemoteS3Config;
5454
import io.trino.aws.proxy.spi.plugin.config.RemoteS3ConnectionProviderConfig;
5555
import io.trino.aws.proxy.spi.plugin.config.S3RequestRewriterConfig;
5656
import io.trino.aws.proxy.spi.plugin.config.S3SecurityFacadeProviderConfig;
5757
import io.trino.aws.proxy.spi.remote.RemoteS3ConnectionProvider;
5858
import io.trino.aws.proxy.spi.remote.RemoteS3Facade;
59+
import io.trino.aws.proxy.spi.remote.RemoteS3FacadeFactory;
5960
import io.trino.aws.proxy.spi.remote.RemoteUriFacade;
6061
import io.trino.aws.proxy.spi.rest.S3RequestRewriter;
6162
import io.trino.aws.proxy.spi.security.S3SecurityFacadeProvider;
@@ -68,25 +69,18 @@
6869

6970
import static com.google.inject.multibindings.Multibinder.newSetBinder;
7071
import static com.google.inject.multibindings.OptionalBinder.newOptionalBinder;
71-
import static io.airlift.configuration.ConditionalModule.conditionalModule;
7272
import static io.airlift.configuration.ConfigBinder.configBinder;
7373
import static io.airlift.http.client.HttpClientBinder.httpClientBinder;
7474
import static io.airlift.http.server.HttpServerBinder.httpServerBinder;
7575
import static io.airlift.jaxrs.JaxrsBinder.jaxrsBinder;
76+
import static io.trino.aws.proxy.spi.plugin.TrinoAwsProxyServerBinding.remoteS3FacadeFactory;
7677
import static org.weakref.jmx.guice.ExportBinder.newExporter;
7778

7879
public class TrinoAwsProxyServerModule
7980
extends AbstractConfigurationAwareModule
8081
{
8182
private static final Logger log = Logger.get(TrinoAwsProxyServerModule.class);
8283

83-
@Provides
84-
@Singleton
85-
public RemoteUriFacade remoteUriFacade(RemoteS3Facade remoteS3Facade)
86-
{
87-
return remoteS3Facade;
88-
}
89-
9084
@Override
9185
protected void setup(Binder binder)
9286
{
@@ -116,6 +110,7 @@ protected void setup(Binder binder)
116110
httpServerBinder.enableLegacyUriCompliance();
117111
httpServerBinder.enableCaseSensitiveHeaderCache();
118112

113+
// RemoteS3ConnectionProvider binder
119114
configBinder(binder).bindConfig(RemoteS3ConnectionProviderConfig.class);
120115
newOptionalBinder(binder, RemoteS3ConnectionProvider.class).setDefault().toProvider(() -> {
121116
log.info("Using default %s NOOP implementation", RemoteS3ConnectionProvider.class.getSimpleName());
@@ -141,13 +136,12 @@ protected void setup(Binder binder)
141136
install(new OpaS3SecurityModule());
142137
install(new HttpCredentialsModule());
143138

144-
// RemoteS3 binder
145-
newOptionalBinder(binder, RemoteS3Facade.class);
146-
// RemoteS3 provided implementation
147-
install(conditionalModule(
148-
RemoteS3Config.class,
149-
config -> config.getPluginIdentifier().isEmpty(),
150-
new DefaultRemoteS3Module()));
139+
// RemoteS3Facade binder
140+
newSetBinder(binder, RemoteS3FacadeFactory.class); // This isn't strictly necessary because we install the DefaultRemoteS3FacadeFactory so that creates the SetBinder,
141+
// but we keep it to be explicit
142+
installRemoteS3FacadeManager(binder);
143+
// RemoteS3Facade provided implementation
144+
install(remoteS3FacadeFactory(DefaultRemoteS3FacadeFactory.class));
151145

152146
installSigningController(binder);
153147
installS3SecurityController(binder);
@@ -172,6 +166,20 @@ public XmlMapper newXmlMapper()
172166
return xmlMapper;
173167
}
174168

169+
@Provides
170+
@Singleton
171+
public RemoteUriFacade remoteUriFacade(RemoteS3FacadeManager remoteS3FacadeManager)
172+
{
173+
return remoteS3FacadeManager;
174+
}
175+
176+
@Provides
177+
@Singleton
178+
public RemoteS3Facade remoteS3Facade(RemoteS3FacadeManager remoteS3FacadeManager)
179+
{
180+
return remoteS3FacadeManager;
181+
}
182+
175183
public static void bindResourceAtPath(JaxrsBinder jaxrsBinder, Class<?> resourceClass, String resourcePrefix)
176184
{
177185
jaxrsBinder.bind(resourceClass);
@@ -191,6 +199,13 @@ protected void installSigningController(Binder binder)
191199
install(new SigningModule());
192200
}
193201

202+
@VisibleForTesting
203+
protected void installRemoteS3FacadeManager(Binder binder)
204+
{
205+
binder.bind(RemoteS3FacadeManager.class).in(Scopes.SINGLETON);
206+
binder.bind(RemoteS3Facade.class).to(RemoteS3FacadeManager.class).in(Scopes.SINGLETON);
207+
}
208+
194209
private void addNullCollectionModule(Binder binder)
195210
{
196211
Module module = new SimpleModule()

trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/remote/DefaultRemoteS3Facade.java

-41
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* Licensed under the Apache License, Version 2.0 (the "License");
3+
* you may not use this file except in compliance with the License.
4+
* You may obtain a copy of the License at
5+
*
6+
* http://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* Unless required by applicable law or agreed to in writing, software
9+
* distributed under the License is distributed on an "AS IS" BASIS,
10+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
* See the License for the specific language governing permissions and
12+
* limitations under the License.
13+
*/
14+
package io.trino.aws.proxy.server.remote;
15+
16+
import com.google.inject.Binder;
17+
import com.google.inject.Scopes;
18+
import io.airlift.bootstrap.Bootstrap;
19+
import io.airlift.configuration.AbstractConfigurationAwareModule;
20+
import io.trino.aws.proxy.spi.remote.RemoteS3Facade;
21+
import io.trino.aws.proxy.spi.remote.RemoteS3FacadeFactory;
22+
23+
import java.util.Map;
24+
25+
import static io.airlift.configuration.ConditionalModule.conditionalModule;
26+
import static io.airlift.configuration.ConfigBinder.configBinder;
27+
28+
public class DefaultRemoteS3FacadeFactory
29+
implements RemoteS3FacadeFactory
30+
{
31+
@Override
32+
public RemoteS3Facade create(Map<String, String> configs)
33+
{
34+
return new Bootstrap(new DefaultRemoteS3Module())
35+
.doNotInitializeLogging()
36+
.quiet()
37+
.setRequiredConfigurationProperties(configs)
38+
.initialize()
39+
.getInstance(RemoteS3Facade.class);
40+
}
41+
42+
@Override
43+
public String name()
44+
{
45+
return "default";
46+
}
47+
48+
private static class DefaultRemoteS3Module
49+
extends AbstractConfigurationAwareModule
50+
{
51+
@Override
52+
protected void setup(Binder binder)
53+
{
54+
configBinder(binder).bindConfig(DefaultRemoteS3Config.class);
55+
install(conditionalModule(
56+
DefaultRemoteS3Config.class,
57+
DefaultRemoteS3Config::getVirtualHostStyle,
58+
innerBinder -> innerBinder.bind(RemoteS3Facade.class)
59+
.to(VirtualHostStyleRemoteS3Facade.class)
60+
.in(Scopes.SINGLETON),
61+
innerBinder -> innerBinder.bind(RemoteS3Facade.class)
62+
.to(PathStyleRemoteS3Facade.class)
63+
.in(Scopes.SINGLETON)));
64+
}
65+
}
66+
}

trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/remote/DefaultRemoteS3Module.java

-57
This file was deleted.

0 commit comments

Comments
 (0)