I have the feeling this broke Jenkins. Millions of NPEs with JDK 8u121: https://jenkins.thetaphi.de/job/Lucene-Solr-master-Linux/19042/console
130 test failures by NPE in org.apache.solr.core.CoreContainer.getNodeNameLocal() ----- Uwe Schindler Achterdiek 19, D-28357 Bremen http://www.thetaphi.de eMail: [email protected] > -----Original Message----- > From: [email protected] [mailto:[email protected]] > Sent: Friday, February 24, 2017 2:31 PM > To: [email protected] > Subject: lucene-solr:master: SOLR-9640: Support PKI authentication and SSL > in standalone-mode master/slave auth with local security.json > > Repository: lucene-solr > Updated Branches: > refs/heads/master 5eeb8136f -> 95d6fc251 > > > SOLR-9640: Support PKI authentication and SSL in standalone-mode > master/slave auth with local security.json > > > Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo > Commit: http://git-wip-us.apache.org/repos/asf/lucene- > solr/commit/95d6fc25 > Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/95d6fc25 > Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/95d6fc25 > > Branch: refs/heads/master > Commit: 95d6fc2512d6525b2354165553f0d6cc4d0d6310 > Parents: 5eeb813 > Author: Jan HC8ydahl <[email protected]> > Authored: Fri Feb 24 14:26:48 2017 +0100 > Committer: Jan HC8ydahl <[email protected]> > Committed: Fri Feb 24 14:30:42 2017 +0100 > > ---------------------------------------------------------------------- > solr/CHANGES.txt | 2 + > .../org/apache/solr/core/CoreContainer.java | 9 +- > .../solr/security/PKIAuthenticationPlugin.java | 42 +++++- > .../org/apache/solr/servlet/HttpSolrCall.java | 4 +- > .../apache/solr/servlet/SolrDispatchFilter.java | 11 +- > .../solr/security/BasicAuthDistributedTest.java | 136 +++++++++++++++++++ > .../security/TestPKIAuthenticationPlugin.java | 38 +++++- > .../solr/BaseDistributedSearchTestCase.java | 37 ++++- > 8 files changed, 260 insertions(+), 19 deletions(-) > ---------------------------------------------------------------------- > > > http://git-wip-us.apache.org/repos/asf/lucene- > solr/blob/95d6fc25/solr/CHANGES.txt > ---------------------------------------------------------------------- > diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt > index 0302615..2c5f0db 100644 > --- a/solr/CHANGES.txt > +++ b/solr/CHANGES.txt > @@ -134,6 +134,8 @@ New Features > field must both be stored=false, indexed=false, docValues=true. (Ishan > Chattopadhyaya, hossman, noble, > shalin, yonik) > > +* SOLR-9640: Support PKI authentication and SSL in standalone-mode > master/slave auth with local security.json (janhoy) > + > Bug Fixes > ---------------------- > > > http://git-wip-us.apache.org/repos/asf/lucene- > solr/blob/95d6fc25/solr/core/src/java/org/apache/solr/core/CoreContainer. > java > ---------------------------------------------------------------------- > diff --git a/solr/core/src/java/org/apache/solr/core/CoreContainer.java > b/solr/core/src/java/org/apache/solr/core/CoreContainer.java > index e3977d7..6115562 100644 > --- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java > +++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java > @@ -497,7 +497,9 @@ public class CoreContainer { > hostName = cfg.getNodeName(); > > zkSys.initZooKeeper(this, solrHome, cfg.getCloudConfig()); > - if(isZooKeeperAware()) pkiAuthenticationPlugin = new > PKIAuthenticationPlugin(this, zkSys.getZkController().getNodeName()); > + pkiAuthenticationPlugin = isZooKeeperAware() ? > + new PKIAuthenticationPlugin(this, > zkSys.getZkController().getNodeName()) : > + new PKIAuthenticationPlugin(this, getNodeNameLocal()); > > MDCLoggingContext.setNode(this); > > @@ -618,6 +620,11 @@ public class CoreContainer { > } > } > > + // Builds a node name to be used with PKIAuth. > + private String getNodeNameLocal() { > + return > getConfig().getCloudConfig().getHost()+":"+getConfig().getCloudConfig().getS > olrHostPort()+"_solr"; > + } > + > public void securityNodeChanged() { > log.info("Security node changed, reloading security.json"); > reloadSecurityProperties(); > > http://git-wip-us.apache.org/repos/asf/lucene- > solr/blob/95d6fc25/solr/core/src/java/org/apache/solr/security/PKIAuthenti > cationPlugin.java > ---------------------------------------------------------------------- > diff --git > a/solr/core/src/java/org/apache/solr/security/PKIAuthenticationPlugin.java > b/solr/core/src/java/org/apache/solr/security/PKIAuthenticationPlugin.java > index fdd4408..d185bc9 100644 > --- > a/solr/core/src/java/org/apache/solr/security/PKIAuthenticationPlugin.java > +++ > b/solr/core/src/java/org/apache/solr/security/PKIAuthenticationPlugin.java > @@ -22,7 +22,9 @@ import javax.servlet.ServletResponse; > import javax.servlet.http.HttpServletRequest; > import javax.servlet.http.HttpServletRequestWrapper; > import java.io.IOException; > +import java.io.UnsupportedEncodingException; > import java.lang.invoke.MethodHandles; > +import java.net.URLDecoder; > import java.nio.ByteBuffer; > import java.security.Principal; > import java.security.PublicKey; > @@ -193,9 +195,14 @@ public class PKIAuthenticationPlugin extends > AuthenticationPlugin implements Htt > } > > PublicKey getRemotePublicKey(String nodename) { > - String url = > cores.getZkController().getZkStateReader().getBaseUrlForNodeName(nodena > me); > + String url, uri = null; > + if (cores.isZooKeeperAware()) { > + url = > cores.getZkController().getZkStateReader().getBaseUrlForNodeName(nodena > me); > + } else { > + url = getBaseUrlForNodeNameLocal(nodename); > + } > try { > - String uri = url + PATH + "?wt=json&omitHeader=true"; > + uri += PATH + "?wt=json&omitHeader=true"; > log.debug("Fetching fresh public key from : {}",uri); > HttpResponse rsp = cores.getUpdateShardHandler().getHttpClient() > .execute(new HttpGet(uri), > HttpClientUtil.createNewHttpClientRequestContext()); > @@ -212,12 +219,41 @@ public class PKIAuthenticationPlugin extends > AuthenticationPlugin implements Htt > keyCache.put(nodename, pubKey); > return pubKey; > } catch (Exception e) { > - log.error("Exception trying to get public key from : " + url, e); > + log.error("Exception trying to get public key from : " + uri, e); > return null; > } > > } > > + protected String getBaseUrlForNodeNameLocal(String nodeName) { > + final int _offset = nodeName.indexOf("_"); > + if (_offset < 0) { > + throw new IllegalArgumentException("nodeName does not contain > expected '_' seperator: " + nodeName); > + } > + final String hostAndPort = nodeName.substring(0,_offset); > + try { > + final String path = URLDecoder.decode(nodeName.substring(1+_offset), > "UTF-8"); > + // TODO: Find a better way of resolving urlScheme when not using ZK? > + String urlScheme = resolveUrlScheme(); > + return urlScheme + "://" + hostAndPort + (path.isEmpty() ? "" : ("/" + > path)); > + } catch (UnsupportedEncodingException e) { > + throw new IllegalStateException("JVM Does not seem to support UTF-8", > e); > + } > + } > + > + /** > + * Resolve urlScheme first from sysProp "urlScheme", if not set or invalid > value, peek at ssl sysProps > + * @return "https" if SSL is enabled, else "http" > + */ > + protected static String resolveUrlScheme() { > + String urlScheme = System.getProperty("urlScheme"); > + if (urlScheme != null && urlScheme.matches("https?")) { > + return urlScheme; > + } else { > + return System.getProperty("solr.jetty.keystore") == null ? "http" : > "https"; > + } > + } > + > @Override > public SolrHttpClientBuilder getHttpClientBuilder(SolrHttpClientBuilder > builder) { > HttpClientUtil.addRequestInterceptor(interceptor); > > http://git-wip-us.apache.org/repos/asf/lucene- > solr/blob/95d6fc25/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.j > ava > ---------------------------------------------------------------------- > diff --git a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java > b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java > index 4f6bae0..0dfb0ea 100644 > --- a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java > +++ b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java > @@ -560,7 +560,7 @@ public class HttpSolrCall { > } > > private boolean shouldAuthorize() { > - if(PKIAuthenticationPlugin.PATH.equals(path)) return false; > + if(path != null && path.endsWith(PKIAuthenticationPlugin.PATH)) return > false; > //admin/info/key is the path where public key is exposed . it is always > unsecured > if (cores.getPkiAuthenticationPlugin() != null && req.getUserPrincipal() > != > null) { > boolean b = cores.getPkiAuthenticationPlugin().needsAuthorization(req); > @@ -1081,7 +1081,7 @@ public class HttpSolrCall { > response.delete(response.length() - 1, response.length()); > > response.append("], Path: [").append(resource).append("]"); > - response.append(" path : ").append(path).append(" params > :").append(solrReq.getParams()); > + response.append(" path : ").append(path).append(" params > :").append(solrReq == null ? null : solrReq.getParams()); > return response.toString(); > } > > > http://git-wip-us.apache.org/repos/asf/lucene- > solr/blob/95d6fc25/solr/core/src/java/org/apache/solr/servlet/SolrDispatch > Filter.java > ---------------------------------------------------------------------- > diff --git > a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java > b/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java > index ce65069..4ce57b0 100644 > --- a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java > +++ b/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java > @@ -402,11 +402,11 @@ public class SolrDispatchFilter extends > BaseSolrFilter { > if (authenticationPlugin == null) { > return true; > } else { > - // /admin/info/key must be always open. see SOLR-9188 > - // tests work only w/ getPathInfo > - //otherwise it's just enough to have getServletPath() > - if (PKIAuthenticationPlugin.PATH.equals(((HttpServletRequest) > request).getServletPath()) || > - PKIAuthenticationPlugin.PATH.equals(((HttpServletRequest) > request).getPathInfo())) return true; > + String requestUri = ((HttpServletRequest) request).getRequestURI(); > + if (requestUri != null && > requestUri.endsWith(PKIAuthenticationPlugin.PATH)) { > + log.debug("Passthrough of pki URL " + requestUri); > + return true; > + } > String header = ((HttpServletRequest) > request).getHeader(PKIAuthenticationPlugin.HEADER); > if (header != null && cores.getPkiAuthenticationPlugin() != null) > authenticationPlugin = cores.getPkiAuthenticationPlugin(); > @@ -418,7 +418,6 @@ public class SolrDispatchFilter extends BaseSolrFilter { > wrappedRequest.set(req); > }); > } catch (Exception e) { > - log.info("Error authenticating", e); > throw new SolrException(ErrorCode.SERVER_ERROR, "Error during > request authentication, ", e); > } > } > > http://git-wip-us.apache.org/repos/asf/lucene- > solr/blob/95d6fc25/solr/core/src/test/org/apache/solr/security/BasicAuthDi > stributedTest.java > ---------------------------------------------------------------------- > diff --git > a/solr/core/src/test/org/apache/solr/security/BasicAuthDistributedTest.java > b/solr/core/src/test/org/apache/solr/security/BasicAuthDistributedTest.java > new file mode 100644 > index 0000000..e35e369 > --- /dev/null > +++ > b/solr/core/src/test/org/apache/solr/security/BasicAuthDistributedTest.java > @@ -0,0 +1,136 @@ > +/* > + * Licensed to the Apache Software Foundation (ASF) under one or more > + * contributor license agreements. See the NOTICE file distributed with > + * this work for additional information regarding copyright ownership. > + * The ASF licenses this file to You under the Apache License, Version 2.0 > + * (the "License"); you may not use this file except in compliance with > + * the License. You may obtain a copy of the License at > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, software > + * distributed under the License is distributed on an "AS IS" BASIS, > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > + * See the License for the specific language governing permissions and > + * limitations under the License. > + */ > +package org.apache.solr.security; > + > +import java.io.IOException; > +import java.nio.file.Files; > +import java.nio.file.Paths; > + > +import org.apache.lucene.util.LuceneTestCase.Slow; > +import org.apache.solr.BaseDistributedSearchTestCase; > +import org.apache.solr.client.solrj.embedded.JettySolrRunner; > +import org.apache.solr.client.solrj.impl.HttpSolrClient; > +import org.apache.solr.client.solrj.request.QueryRequest; > +import org.apache.solr.client.solrj.response.QueryResponse; > +import org.apache.solr.common.params.ModifiableSolrParams; > +import org.apache.solr.common.util.Utils; > +import org.apache.solr.core.CoreContainer; > +import org.apache.solr.handler.admin.SecurityConfHandler; > +import org.apache.solr.handler.admin.SecurityConfHandlerLocalForTesting; > +import org.apache.solr.util.LogLevel; > +import org.junit.Test; > + > +/** > + * Tests basicAuth in a multi shard env > + */ > +@Slow > +public class BasicAuthDistributedTest extends > BaseDistributedSearchTestCase { > + public BasicAuthDistributedTest() { > + super(); > + schemaString = "schema.xml"; > + } > + > + private SecurityConfHandlerLocalForTesting securityConfHandler; > + > + @Test > + @LogLevel("org.apache.solr=DEBUG") > + public void test() throws Exception { > + index(); > + testAuth(); > + } > + > + private void index() throws Exception { > + del("*:*"); > + indexr(id, "1", "text", "doc one"); > + indexr(id, "2", "text", "doc two"); > + indexr(id, "3", "text", "doc three"); > + indexr(id, "4", "text", "doc four"); > + indexr(id, "5", "text", "doc five"); > + > + commit(); // try to ensure there's more than one segment > + > + indexr(id, "6", "text", "doc six"); > + indexr(id, "7", "text", "doc seven"); > + indexr(id, "8", "text", "doc eight"); > + indexr(id, "9", "text", "doc nine"); > + indexr(id, "10", "text", "doc ten"); > + > + commit(); > + > + handle.clear(); > + handle.put("QTime", SKIPVAL); > + handle.put("timestamp", SKIPVAL); > + handle.put("maxScore", SKIPVAL); > + handle.put("_version_", SKIPVAL); > + } > + > + private void testAuth() throws Exception { > + QueryResponse rsp = query("q","text:doc", "fl", "id,text", "sort", "id > asc"); > + assertEquals(10, rsp.getResults().getNumFound()); > + > + // Enable authentication > + for (JettySolrRunner j : jettys) { > + writeSecurityJson(j.getCoreContainer()); > + } > + > + HttpSolrClient.RemoteSolrException expected = > expectThrows(HttpSolrClient.RemoteSolrException.class, () -> { > + query("q","text:doc-fail", "fl", "id,text", "sort", "id asc"); > + }); > + assertEquals(401, expected.code()); > + > + // Add auth > + ModifiableSolrParams params = new ModifiableSolrParams(); > + params.add("q", "text:doc").add("fl", "id,text").add("sort", "id asc"); > + QueryRequest req = new QueryRequest(params); > + req.setBasicAuthCredentials("solr", "SolrRocks"); > + rsp = req.process(clients.get(0), null); > + if (jettys.size() > 1) { > + assertTrue(rsp.getResults().getNumFound() < 10); > + rsp = query(true, params, "solr", "SolrRocks"); > + } > + assertEquals(10, rsp.getResults().getNumFound()); > + > + // Disable auth > + for (JettySolrRunner j : jettys) { > + deleteSecurityJson(j.getCoreContainer()); > + } > + > + } > + > + private void deleteSecurityJson(CoreContainer coreContainer) throws > IOException { > + securityConfHandler = new > SecurityConfHandlerLocalForTesting(coreContainer); > + > Files.delete(Paths.get(coreContainer.getSolrHome()).resolve("security.json")) > ; > + coreContainer.securityNodeChanged(); > + } > + > + private void writeSecurityJson(CoreContainer coreContainer) throws > IOException { > + securityConfHandler = new > SecurityConfHandlerLocalForTesting(coreContainer); > + securityConfHandler.persistConf(new > SecurityConfHandler.SecurityConfig() > + .setData(Utils.fromJSONString(ALL_CONF.replaceAll("'", "\"")))); > + coreContainer.securityNodeChanged(); > + } > + > + protected static final String ALL_CONF = "{\n" + > + " 'authentication':{\n" + > + " 'blockUnknown':true,\n" + > + " 'class':'solr.BasicAuthPlugin',\n" + > + " > 'credentials':{'solr':'orwp2Ghgj39lmnrZOTm7Qtre1VqHFDfwAEzr0ApbN3Y= > Ju5osoAqOX8iafhWpPP01E5P+sg8tK8tHON7rCYZRRw='}},\n" + > + " 'authorization':{\n" + > + " 'class':'solr.RuleBasedAuthorizationPlugin',\n" + > + " 'user-role':{'solr':'admin'},\n" + > + " 'permissions':[{'name':'all','role':'admin'}]}}"; > +} > > http://git-wip-us.apache.org/repos/asf/lucene- > solr/blob/95d6fc25/solr/core/src/test/org/apache/solr/security/TestPKIAuth > enticationPlugin.java > ---------------------------------------------------------------------- > diff --git > a/solr/core/src/test/org/apache/solr/security/TestPKIAuthenticationPlugin.ja > va > b/solr/core/src/test/org/apache/solr/security/TestPKIAuthenticationPlugin.j > ava > index a5a279f..90c5bd2 100644 > --- > a/solr/core/src/test/org/apache/solr/security/TestPKIAuthenticationPlugin.ja > va > +++ > b/solr/core/src/test/org/apache/solr/security/TestPKIAuthenticationPlugin.j > ava > @@ -35,7 +35,11 @@ import > org.apache.solr.request.LocalSolrQueryRequest; > import org.apache.solr.request.SolrRequestInfo; > import org.apache.solr.response.SolrQueryResponse; > import org.apache.solr.util.CryptoKeys; > -import static org.mockito.Mockito.*; > +import org.junit.Test; > + > +import static org.mockito.Mockito.any; > +import static org.mockito.Mockito.mock; > +import static org.mockito.Mockito.when; > > public class TestPKIAuthenticationPlugin extends SolrTestCaseJ4 { > > @@ -141,10 +145,38 @@ public class TestPKIAuthenticationPlugin extends > SolrTestCaseJ4 { > mock1.doAuthenticate(mockReq, null,filterChain ); > assertNotNull(wrappedRequestByFilter.get()); > assertEquals("$", ((HttpServletRequest) > wrappedRequestByFilter.get()).getUserPrincipal().getName()); > + } > > + @Test > + public void testGetBaseUrlForNodeNameLocal() { > + synchronized (this) { > + final MockPKIAuthenticationPlugin mock = new > MockPKIAuthenticationPlugin(null, "myName"); > + System.clearProperty("solr.jetty.keystore"); > + assertEquals("http://my.host:9876/solr2", > mock.getBaseUrlForNodeNameLocal("my.host:9876_solr2")); > + System.setProperty("solr.jetty.keystore", "foo"); > + assertEquals("https://my.host:9876/solr2", > mock.getBaseUrlForNodeNameLocal("my.host:9876_solr2")); > + System.clearProperty("solr.jetty.keystore"); > + } > + } > > - > - > + @Test > + public void testResolveUrlScheme() { > + synchronized (this) { > + System.clearProperty("urlScheme"); > + System.clearProperty("solr.jetty.keystore"); > + assertEquals("http", MockPKIAuthenticationPlugin.resolveUrlScheme()); > + System.setProperty("urlScheme", "http"); > + assertEquals("http", MockPKIAuthenticationPlugin.resolveUrlScheme()); > + System.setProperty("urlScheme", "https"); > + assertEquals("https", MockPKIAuthenticationPlugin.resolveUrlScheme()); > + System.setProperty("urlScheme", "ftp"); > + System.clearProperty("solr.jetty.keystore"); > + assertEquals("http", MockPKIAuthenticationPlugin.resolveUrlScheme()); > + System.setProperty("solr.jetty.keystore", "foo"); > + assertEquals("https", MockPKIAuthenticationPlugin.resolveUrlScheme()); > + System.clearProperty("urlScheme"); > + System.clearProperty("solr.jetty.keystore"); > + } > } > > private HttpServletRequest createMockRequest(final > AtomicReference<Header> header) { > > http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/95d6fc25/solr/test- > framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java > ---------------------------------------------------------------------- > diff --git a/solr/test- > framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java > b/solr/test- > framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java > index 8c6eb60..bbfc048 100644 > --- a/solr/test- > framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java > +++ b/solr/test- > framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java > @@ -50,6 +50,7 @@ import org.apache.solr.client.solrj.SolrServerException; > import org.apache.solr.client.solrj.embedded.JettyConfig; > import org.apache.solr.client.solrj.embedded.JettySolrRunner; > import org.apache.solr.client.solrj.impl.HttpSolrClient; > +import org.apache.solr.client.solrj.request.QueryRequest; > import org.apache.solr.client.solrj.request.UpdateRequest; > import org.apache.solr.client.solrj.response.QueryResponse; > import org.apache.solr.client.solrj.response.UpdateResponse; > @@ -558,6 +559,12 @@ public abstract class BaseDistributedSearchTestCase > extends SolrTestCaseJ4 { > return rsp; > } > > + protected QueryResponse queryServer(QueryRequest req) throws > IOException, SolrServerException { > + int which = r.nextInt(clients.size()); > + SolrClient client = clients.get(which); > + return req.process(client, null); > + } > + > /** > * Sets distributed params. > * Returns the QueryResponse from {@link #queryServer}, > @@ -591,18 +598,31 @@ public abstract class > BaseDistributedSearchTestCase extends SolrTestCaseJ4 { > * Returns the QueryResponse from {@link #queryServer} > */ > protected QueryResponse query(boolean setDistribParams, SolrParams p) > throws Exception { > + return query(setDistribParams, p, null, null); > + } > + > + /** > + * Returns the QueryResponse from {@link #queryServer} > + * @param setDistribParams whether to do a distributed request > + * @param user basic auth username (set to null if not in use) > + * @param pass basic auth password (set to null if not in use) > + * @return the query response > + */ > + protected QueryResponse query(boolean setDistribParams, SolrParams p, > String user, String pass) throws Exception { > > final ModifiableSolrParams params = new ModifiableSolrParams(p); > > // TODO: look into why passing true causes fails > params.set("distrib", "false"); > - final QueryResponse controlRsp = controlClient.query(params); > + QueryRequest req = generateQueryRequest(params, user, pass); > + final QueryResponse controlRsp = req.process(controlClient, null); > validateControlData(controlRsp); > > params.remove("distrib"); > if (setDistribParams) setDistributedParams(params); > + req = generateQueryRequest(params, user, pass); > > - QueryResponse rsp = queryServer(params); > + QueryResponse rsp = queryServer(req); > > compareResponses(rsp, controlRsp); > > @@ -617,7 +637,8 @@ public abstract class BaseDistributedSearchTestCase > extends SolrTestCaseJ4 { > int which = r.nextInt(clients.size()); > SolrClient client = clients.get(which); > try { > - QueryResponse rsp = client.query(new > ModifiableSolrParams(params)); > + QueryRequest qreq = generateQueryRequest(new > ModifiableSolrParams(params), user, pass); > + QueryResponse rsp = qreq.process(client, null); > if (verifyStress) { > compareResponses(rsp, controlRsp); > } > @@ -636,7 +657,15 @@ public abstract class BaseDistributedSearchTestCase > extends SolrTestCaseJ4 { > } > return rsp; > } > - > + > + private QueryRequest generateQueryRequest(ModifiableSolrParams > params, String user, String pass) { > + QueryRequest req = new QueryRequest(params); > + if (user != null && pass != null) { > + req.setBasicAuthCredentials(user, pass); > + } > + return req; > + } > + > public QueryResponse queryAndCompare(SolrParams params, SolrClient... > clients) throws SolrServerException, IOException { > return queryAndCompare(params, Arrays.<SolrClient>asList(clients)); > } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
