package org.infinispan.server.router.profiling.configuration;
import java.net.InetAddress;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.server.hotrod.HotRodServer;
import org.infinispan.server.hotrod.test.HotRodTestingUtil;
import org.infinispan.server.router.MultiTenantRouter;
import org.infinispan.server.router.configuration.builder.MultiTenantRouterConfigurationBuilder;
import org.infinispan.server.router.profiling.PerfTestConfiguration;
import org.infinispan.server.router.router.Router;
import org.infinispan.server.router.routes.Route;
import org.infinispan.server.router.routes.RouteDestination;
import org.infinispan.server.router.routes.RouteSource;
import org.infinispan.server.router.routes.hotrod.NettyHandlerRouteDestination;
import org.infinispan.server.router.routes.hotrod.SniNettyRouteSource;
import org.infinispan.server.router.utils.HotRodClientTestingUtil;
public class TwoServersWithSslSni implements PerfTestConfiguration {
private final String KEYSTORE_LOCATION_FOR_HOTROD_1 = getClass().getClassLoader().getResource("sni_server_keystore.jks").getPath();
private final String TRUSTSTORE_LOCATION_FOT_HOTROD_1 = getClass().getClassLoader().getResource("sni_client_truststore.jks").getPath();
private final String KEYSTORE_LOCATION_FOR_HOTROD_2 = getClass().getClassLoader().getResource("default_server_keystore.jks").getPath();
private final char[] KEYSTORE_PASSWORD = "secret".toCharArray();
@Override
public List<HotRodServer> initServers() {
HotRodServer hotrodServer1 = HotRodTestingUtil.startHotRodServerWithoutTransport();
HotRodServer hotrodServer2 = HotRodTestingUtil.startHotRodServerWithoutTransport();
return Arrays.asList(hotrodServer1, hotrodServer2);
}
@Override
public Optional<Set<Route<? extends RouteSource, ? extends RouteDestination>>> initRoutes(List<HotRodServer> servers) {
Set<Route<? extends RouteSource, ? extends RouteDestination>> routes = new HashSet<>();
NettyHandlerRouteDestination hotrod1Destination = new NettyHandlerRouteDestination("hotrod1", servers.get(0).getInitializer());
SniNettyRouteSource hotrod1Source = new SniNettyRouteSource("hotrod1", KEYSTORE_LOCATION_FOR_HOTROD_1, KEYSTORE_PASSWORD);
routes.add(new Route<>(hotrod1Source, hotrod1Destination));
NettyHandlerRouteDestination hotrod2Destination = new NettyHandlerRouteDestination("hotrod2", servers.get(1).getInitializer());
SniNettyRouteSource hotrod2Source = new SniNettyRouteSource("hotrod2", KEYSTORE_LOCATION_FOR_HOTROD_2, KEYSTORE_PASSWORD);
routes.add(new Route<>(hotrod2Source, hotrod2Destination));
return Optional.of(routes);
}
@Override
public Optional<MultiTenantRouter> initRouter(Optional<Set<Route<? extends RouteSource, ? extends RouteDestination>>> routes) {
MultiTenantRouterConfigurationBuilder routerConfigurationBuilder = new MultiTenantRouterConfigurationBuilder();
routerConfigurationBuilder
.hotrod()
.port(0)
.ip(InetAddress.getLoopbackAddress());
routes.get().stream().forEach(r -> routerConfigurationBuilder.routing().add(r));
MultiTenantRouter router = new MultiTenantRouter(routerConfigurationBuilder.build());
router.start();
return Optional.of(router);
}
@Override
public RemoteCacheManager initClient(Optional<MultiTenantRouter> router, Optional<Set<Route<? extends RouteSource, ? extends RouteDestination>>> routes, List<HotRodServer> servers) {
InetAddress ip = router.flatMap(r -> r.getRouter(Router.Protocol.HOT_ROD)).flatMap(r -> r.getIp()).get();
int port = router.flatMap(r -> r.getRouter(Router.Protocol.HOT_ROD)).flatMap(r -> r.getPort()).get();
return HotRodClientTestingUtil.createWithSni(ip, port, "hotrod1", TRUSTSTORE_LOCATION_FOT_HOTROD_1, KEYSTORE_PASSWORD);
}
}