You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by no...@apache.org on 2019/08/29 04:01:57 UTC
[lucene-solr] branch master updated: SOLR-13723: JettySolrRunner
should support /api/* (the v2 end point)
This is an automated email from the ASF dual-hosted git repository.
noble pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git
The following commit(s) were added to refs/heads/master by this push:
new cf21340 SOLR-13723: JettySolrRunner should support /api/* (the v2 end point)
cf21340 is described below
commit cf21340294a52ad764deac7b9cdd38d06cfbc3da
Author: Noble Paul <no...@users.noreply.github.com>
AuthorDate: Thu Aug 29 14:01:52 2019 +1000
SOLR-13723: JettySolrRunner should support /api/* (the v2 end point)
---
.../apache/solr/client/solrj/embedded/JettyConfig.java | 14 ++++++++++++--
.../solr/client/solrj/embedded/JettySolrRunner.java | 11 +++++++++++
.../apache/solr/client/solrj/impl/HttpSolrClient.java | 2 +-
.../org/apache/solr/client/solrj/request/V2Request.java | 17 +++++++++++++++++
.../apache/solr/client/solrj/request/TestV2Request.java | 11 +++++++++++
.../org/apache/solr/cloud/MiniSolrCloudCluster.java | 2 +-
.../java/org/apache/solr/cloud/SolrCloudTestCase.java | 10 ++++++----
7 files changed, 59 insertions(+), 8 deletions(-)
diff --git a/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettyConfig.java b/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettyConfig.java
index bff63e1..e4a0547 100644
--- a/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettyConfig.java
+++ b/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettyConfig.java
@@ -32,6 +32,9 @@ public class JettyConfig {
public final String context;
+ public final boolean enableV2;
+
+
public final boolean stopAtShutdown;
public final Long waitForLoadingCoresToFinishMs;
@@ -46,7 +49,7 @@ public class JettyConfig {
private JettyConfig(boolean onlyHttp1, int port, int portRetryTime , String context, boolean stopAtShutdown,
Long waitForLoadingCoresToFinishMs, Map<ServletHolder, String> extraServlets,
- Map<Class<? extends Filter>, String> extraFilters, SSLConfig sslConfig) {
+ Map<Class<? extends Filter>, String> extraFilters, SSLConfig sslConfig, boolean enableV2) {
this.onlyHttp1 = onlyHttp1;
this.port = port;
this.context = context;
@@ -56,6 +59,7 @@ public class JettyConfig {
this.extraFilters = extraFilters;
this.sslConfig = sslConfig;
this.portRetryTime = portRetryTime;
+ this.enableV2 = enableV2;
}
public static Builder builder() {
@@ -78,6 +82,7 @@ public class JettyConfig {
boolean onlyHttp1 = false;
int port = 0;
String context = "/solr";
+ boolean enableV2 = true;
boolean stopAtShutdown = true;
Long waitForLoadingCoresToFinishMs = 300000L;
Map<ServletHolder, String> extraServlets = new TreeMap<>();
@@ -89,6 +94,10 @@ public class JettyConfig {
this.onlyHttp1 = useOnlyHttp1;
return this;
}
+ public Builder enableV2(boolean flag){
+ this.enableV2 = flag;
+ return this;
+ }
public Builder setPort(int port) {
this.port = port;
@@ -144,7 +153,8 @@ public class JettyConfig {
public JettyConfig build() {
- return new JettyConfig(onlyHttp1, port, portRetryTime, context, stopAtShutdown, waitForLoadingCoresToFinishMs, extraServlets, extraFilters, sslConfig);
+ return new JettyConfig(onlyHttp1, port, portRetryTime, context, stopAtShutdown,
+ waitForLoadingCoresToFinishMs, extraServlets, extraFilters, sslConfig, enableV2);
}
}
diff --git a/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java b/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java
index 7a6c8478..c98bbb4 100644
--- a/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java
+++ b/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java
@@ -59,6 +59,8 @@ import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
import org.eclipse.jetty.http2.HTTP2Cipher;
import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory;
import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
+import org.eclipse.jetty.rewrite.handler.RewriteHandler;
+import org.eclipse.jetty.rewrite.handler.RewritePatternRule;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
@@ -401,6 +403,15 @@ public class JettySolrRunner {
chain = injectJettyHandlers(chain);
+ if(config.enableV2) {
+ RewriteHandler rwh = new RewriteHandler();
+ rwh.setHandler(chain);
+ rwh.setRewriteRequestURI(true);
+ rwh.setRewritePathInfo(false);
+ rwh.setOriginalPathAttribute("requestedPath");
+ rwh.addRule(new RewritePatternRule("/api/*", "/solr/____v2"));
+ chain = rwh;
+ }
GzipHandler gzipHandler = new GzipHandler();
gzipHandler.setHandler(chain);
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java
index 75db5a1..7498075 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java
@@ -364,7 +364,7 @@ public class HttpSolrClient extends BaseHttpSolrClient {
basePath += "/" + collection;
if (request instanceof V2Request) {
- if (System.getProperty("solr.v2RealPath") == null) {
+ if (System.getProperty("solr.v2RealPath") == null || ((V2Request) request).isForceV2()) {
basePath = baseUrl.replace("/solr", "/api");
} else {
basePath = baseUrl + "/____v2";
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/V2Request.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/V2Request.java
index 17e3c9b..4236177 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/V2Request.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/V2Request.java
@@ -42,6 +42,7 @@ public class V2Request extends SolrRequest<V2Response> implements MapWriter {
private SolrParams solrParams;
public final boolean useBinary;
private String collection;
+ private boolean forceV2 = false;
private boolean isPerCollectionRequest = false;
private V2Request(METHOD m, String resource, boolean useBinary) {
@@ -55,6 +56,10 @@ public class V2Request extends SolrRequest<V2Response> implements MapWriter {
}
+ public boolean isForceV2(){
+ return forceV2;
+ }
+
@Override
public SolrParams getParams() {
return solrParams;
@@ -113,6 +118,8 @@ public class V2Request extends SolrRequest<V2Response> implements MapWriter {
private SolrParams params;
private boolean useBinary = false;
+ private boolean forceV2EndPoint = false;
+
/**
* Create a Builder object based on the provided resource.
* The default method is GET.
@@ -130,7 +137,16 @@ public class V2Request extends SolrRequest<V2Response> implements MapWriter {
}
/**
+ * Only for testing. It's always true otherwise
+ */
+ public Builder forceV2(boolean flag) {
+ forceV2EndPoint = flag;
+ return this;
+ }
+
+ /**
* Set payload for request.
+ *
* @param payload as UTF-8 String
* @return builder object
*/
@@ -161,6 +177,7 @@ public class V2Request extends SolrRequest<V2Response> implements MapWriter {
V2Request v2Request = new V2Request(method, resource, useBinary);
v2Request.solrParams = params;
v2Request.payload = payload;
+ v2Request.forceV2 = forceV2EndPoint;
return v2Request;
}
}
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestV2Request.java b/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestV2Request.java
index 300b6c5..fa34267 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestV2Request.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestV2Request.java
@@ -42,9 +42,20 @@ public class TestV2Request extends SolrCloudTestCase {
@Before
public void setupCluster() throws Exception {
configureCluster(4)
+ .withJettyConfig(jettyCfg -> jettyCfg.enableV2(true))
.addConfig("config", getFile("solrj/solr/collection1/conf").toPath())
.configure();
}
+
+ public void testApiPathAvailability() throws Exception {
+ V2Response rsp = new V2Request.Builder("/cluster/nodes")
+ .forceV2(true)
+ .withMethod(SolrRequest.METHOD.GET).build()
+ .process(cluster.getSolrClient());
+ List l = (List) rsp._get("nodes",null);
+ assertNotNull(l);
+ assertFalse(l.isEmpty());
+ }
@After
public void afterTest() throws Exception {
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java b/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java
index eca5235..7c6d120 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java
@@ -786,7 +786,7 @@ public class MiniSolrCloudCluster {
if (activeReplicas == expectedReplicas) {
return true;
}
-
+
return false;
};
}
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java b/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java
index d8d2472..23283cc 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java
@@ -32,6 +32,7 @@ import java.util.Optional;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Consumer;
import java.util.function.Predicate;
import org.apache.solr.SolrTestCaseJ4;
@@ -106,7 +107,7 @@ public class SolrCloudTestCase extends SolrTestCaseJ4 {
private final int nodeCount;
private final Path baseDir;
private String solrxml = MiniSolrCloudCluster.DEFAULT_CLOUD_SOLR_XML;
- private JettyConfig jettyConfig = buildJettyConfig("/solr");
+ private JettyConfig.Builder jettyConfigBuilder = JettyConfig.builder().setContext("/solr").withSSLConfig(sslConfig.buildServerSSLConfig());
private Optional<String> securityJson = Optional.empty();
private List<Config> configs = new ArrayList<>();
@@ -126,10 +127,10 @@ public class SolrCloudTestCase extends SolrTestCaseJ4 {
}
/**
- * Use a {@link JettyConfig} to configure the cluster's jetty servers
+ * Use a JettyConfig.Builder to configure the cluster's jetty servers
*/
- public Builder withJettyConfig(JettyConfig jettyConfig) {
- this.jettyConfig = jettyConfig;
+ public Builder withJettyConfig(Consumer<JettyConfig.Builder> fun) {
+ fun.accept(jettyConfigBuilder);
return this;
}
@@ -226,6 +227,7 @@ public class SolrCloudTestCase extends SolrTestCaseJ4 {
* @throws Exception if an error occurs on startup
*/
public MiniSolrCloudCluster build() throws Exception {
+ JettyConfig jettyConfig = jettyConfigBuilder.build();
MiniSolrCloudCluster cluster = new MiniSolrCloudCluster(nodeCount, baseDir, solrxml, jettyConfig,
null, securityJson, trackJettyMetrics);
CloudSolrClient client = cluster.getSolrClient();