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();