Failed on Java 8 too. Build: https://jenkins.thetaphi.de/job/Lucene-Solr-master-Windows/6296/ Java: 32bit/jdk1.8.0_112 -server -XX:+UseG1GC
3 tests failed. FAILED: junit.framework.TestSuite.org.apache.solr.security.hadoop. TestSolrCloudWithHadoopAuthPlugin Kevin Risden On Mon, Dec 19, 2016 at 12:36 PM, Uwe Schindler <[email protected]> wrote: > Hi, > > Something went wrong with the Java 9 assume in > TestSolrCloudWithHadoopAuthPlugin. It should just ignore the test, but > for some reason it fails the test. See recent Jenkins failures! > > Uwe > > ----- > Uwe Schindler > Achterdiek 19, D-28357 Bremen > http://www.thetaphi.de > eMail: [email protected] > > > -----Original Message----- > > From: [email protected] [mailto:[email protected]] > > Sent: Monday, December 19, 2016 4:16 PM > > To: [email protected] > > Subject: [1/2] lucene-solr:master: SOLR-9513: Generic Hadoop > authentication > > plugins, GenericHadoopAuthPlugin and > > ConfigurableInternodeAuthHadoopPlugin > > > > Repository: lucene-solr > > Updated Branches: > > refs/heads/master 321c6f090 -> a1a8b2864 > > > > > > http://git-wip-us.apache.org/repos/asf/lucene- > > solr/blob/a1a8b286/solr/core/src/test/org/apache/solr/security/hadoop/Te > > stImpersonationWithHadoopAuth.java > > ---------------------------------------------------------------------- > > diff --git > > a/solr/core/src/test/org/apache/solr/security/hadoop/TestImpersonationWi > > thHadoopAuth.java > > b/solr/core/src/test/org/apache/solr/security/hadoop/TestImpersonationW > > ithHadoopAuth.java > > new file mode 100644 > > index 0000000..ed8397b > > --- /dev/null > > +++ > > b/solr/core/src/test/org/apache/solr/security/hadoop/TestImpersonationW > > ithHadoopAuth.java > > @@ -0,0 +1,215 @@ > > +/* > > + * 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.hadoop; > > + > > +import static > > org.apache.solr.security.HttpParamDelegationTokenPlugin.USER_PARAM; > > +import static org.apache.solr.security.hadoop.ImpersonationUtil.*; > > + > > +import java.net.InetAddress; > > +import java.nio.charset.Charset; > > +import java.nio.file.Files; > > +import java.nio.file.Path; > > +import java.util.HashMap; > > +import java.util.Map; > > + > > +import org.apache.lucene.util.Constants; > > +import org.apache.solr.client.solrj.SolrClient; > > +import org.apache.solr.client.solrj.embedded.JettySolrRunner; > > +import org.apache.solr.client.solrj.impl.HttpSolrClient; > > +import org.apache.solr.client.solrj.request.CollectionAdminRequest; > > +import org.apache.solr.cloud.SolrCloudTestCase; > > +import org.apache.solr.common.params.ModifiableSolrParams; > > +import org.apache.solr.common.util.Utils; > > +import org.apache.solr.security.HadoopAuthPlugin; > > +import org.apache.solr.servlet.SolrRequestParsers; > > +import org.junit.AfterClass; > > +import org.junit.BeforeClass; > > +import org.junit.Test; > > + > > +public class TestImpersonationWithHadoopAuth extends > > SolrCloudTestCase { > > + protected static final int NUM_SERVERS = 2; > > + private static final boolean defaultAddRequestHeadersToContext = > > + SolrRequestParsers.DEFAULT.isAddRequestHeadersToContext(); > > + > > + @SuppressWarnings("unchecked") > > + @BeforeClass > > + public static void setupClass() throws Exception { > > + assumeFalse("Hadoop does not work on Windows", > > Constants.WINDOWS); > > + > > + InetAddress loopback = InetAddress.getLoopbackAddress(); > > + Path securityJsonPath = > > TEST_PATH().resolve("security").resolve("hadoop_simple_auth_with_delegat > > ion.json"); > > + String securityJson = new String(Files.readAllBytes( > securityJsonPath), > > Charset.defaultCharset()); > > + > > + Map<String, Object> securityConfig = (Map<String, > > Object>)Utils.fromJSONString(securityJson); > > + Map<String, Object> authConfig = (Map<String, > > Object>)securityConfig.get("authentication"); > > + Map<String,String> proxyUserConfigs = (Map<String,String>) > authConfig > > + .getOrDefault(HadoopAuthPlugin.PROXY_USER_CONFIGS, new > > HashMap<>()); > > + proxyUserConfigs.put("proxyuser.noGroups.hosts", "*"); > > + proxyUserConfigs.put("proxyuser.anyHostAnyUser.hosts", "*"); > > + proxyUserConfigs.put("proxyuser.anyHostAnyUser.groups", "*"); > > + proxyUserConfigs.put("proxyuser.wrongHost.hosts", "1.1.1.1.1.1"); > > + proxyUserConfigs.put("proxyuser.wrongHost.groups", "*"); > > + proxyUserConfigs.put("proxyuser.noHosts.groups", "*"); > > + proxyUserConfigs.put("proxyuser.localHostAnyGroup.hosts", > > + loopback.getCanonicalHostName() + "," + loopback.getHostName() > + "," > > + loopback.getHostAddress()); > > + proxyUserConfigs.put("proxyuser.localHostAnyGroup.groups", "*"); > > + proxyUserConfigs.put("proxyuser.bogusGroup.hosts", "*"); > > + proxyUserConfigs.put("proxyuser.bogusGroup.groups", > > "__some_bogus_group"); > > + proxyUserConfigs.put("proxyuser.anyHostUsersGroup.groups", > > ImpersonationUtil.getUsersFirstGroup()); > > + proxyUserConfigs.put("proxyuser.anyHostUsersGroup.hosts", "*"); > > + > > + authConfig.put(HadoopAuthPlugin.PROXY_USER_CONFIGS, > > proxyUserConfigs); > > + > > + SolrRequestParsers.DEFAULT.setAddRequestHeadersToContext(true); > > + System.setProperty("collectionsHandler", > > ImpersonatorCollectionsHandler.class.getName()); > > + > > + configureCluster(NUM_SERVERS)// nodes > > + .withSecurityJson(Utils.toJSONString(securityConfig)) > > + .addConfig("conf1", TEST_PATH().resolve(" > configsets").resolve("cloud- > > minimal").resolve("conf")) > > + .configure(); > > + } > > + > > + @AfterClass > > + public static void tearDownClass() throws Exception { > > + > > SolrRequestParsers.DEFAULT.setAddRequestHeadersToContext(defaultAddR > > equestHeadersToContext); > > + System.clearProperty("collectionsHandler"); > > + } > > + > > + private SolrClient newSolrClient() { > > + return new HttpSolrClient.Builder( > > + cluster.getJettySolrRunner(0).getBaseUrl().toString()).build(); > > + } > > + > > + @Test > > + public void testProxyNoConfigGroups() throws Exception { > > + try (SolrClient solrClient = newSolrClient()) { > > + solrClient.request(getProxyRequest("noGroups","bar")); > > + fail("Expected RemoteSolrException"); > > + } > > + catch (HttpSolrClient.RemoteSolrException ex) { > > + assertTrue(ex.getLocalizedMessage(), > > ex.getMessage().contains(getExpectedGroupExMsg("noGroups", "bar"))); > > + } > > + } > > + > > + @Test > > + public void testProxyWrongHost() throws Exception { > > + try (SolrClient solrClient = newSolrClient()) { > > + solrClient.request(getProxyRequest("wrongHost","bar")); > > + fail("Expected RemoteSolrException"); > > + } > > + catch (HttpSolrClient.RemoteSolrException ex) { > > + > > assertTrue(ex.getMessage().contains(getExpectedHostExMsg("wrongHost"))) > > ; > > + } > > + } > > + > > + @Test > > + public void testProxyNoConfigHosts() throws Exception { > > + try (SolrClient solrClient = newSolrClient()) { > > + solrClient.request(getProxyRequest("noHosts","bar")); > > + fail("Expected RemoteSolrException"); > > + } > > + catch (HttpSolrClient.RemoteSolrException ex) { > > + > > assertTrue(ex.getMessage().contains(getExpectedHostExMsg("noHosts"))); > > + } > > + } > > + > > + @Test > > + public void testProxyValidateAnyHostAnyUser() throws Exception { > > + try (SolrClient solrClient = newSolrClient()) { > > + solrClient.request(getProxyRequest("anyHostAnyUser", "bar")); > > + assertTrue(ImpersonatorCollectionsHandler.called.get()); > > + } > > + } > > + > > + @Test > > + public void testProxyInvalidProxyUser() throws Exception { > > + try (SolrClient solrClient = newSolrClient()) { > > + // wrong direction, should fail > > + solrClient.request(getProxyRequest("bar","anyHostAnyUser")); > > + fail("Expected RemoteSolrException"); > > + } > > + catch (HttpSolrClient.RemoteSolrException ex) { > > + assertTrue(ex.getMessage().contains(getExpectedGroupExMsg("bar", > > "anyHostAnyUser"))); > > + } > > + } > > + > > + @Test > > + public void testProxyValidateHost() throws Exception { > > + try (SolrClient solrClient = newSolrClient()) { > > + solrClient.request(getProxyRequest("localHostAnyGroup", "bar")); > > + assertTrue(ImpersonatorCollectionsHandler.called.get()); > > + } > > + } > > + > > + @Test > > + public void testProxyValidateGroup() throws Exception { > > + try (SolrClient solrClient = newSolrClient()) { > > + solrClient.request(getProxyRequest("anyHostUsersGroup", > > System.getProperty("user.name"))); > > + assertTrue(ImpersonatorCollectionsHandler.called.get()); > > + } > > + } > > + > > + @Test > > + public void testProxyInvalidGroup() throws Exception { > > + try (SolrClient solrClient = newSolrClient()) { > > + solrClient.request(getProxyRequest("bogusGroup","bar")); > > + fail("Expected RemoteSolrException"); > > + } > > + catch (HttpSolrClient.RemoteSolrException ex) { > > + > > assertTrue(ex.getMessage().contains(getExpectedGroupExMsg("bogusGroup > > ", "bar"))); > > + } > > + } > > + > > + @Test > > + public void testProxyNullProxyUser() throws Exception { > > + try (SolrClient solrClient = newSolrClient()) { > > + solrClient.request(getProxyRequest("","bar")); > > + fail("Expected RemoteSolrException"); > > + } > > + catch (HttpSolrClient.RemoteSolrException ex) { > > + // this exception is specific to our implementation, don't check > a specific > > message. > > + } > > + } > > + > > + @Test > > + @AwaitsFix(bugUrl="https://issues.apache.org/jira/browse/HADOOP- > > 9893") > > + public void testForwarding() throws Exception { > > + String collectionName = "forwardingCollection"; > > + > > + // create collection > > + CollectionAdminRequest.Create create = > > CollectionAdminRequest.createCollection(collectionName, "conf1", > > + 1, 1); > > + try (SolrClient solrClient = newSolrClient()) { > > + create.process(solrClient); > > + } > > + > > + // try a command to each node, one of them must be forwarded > > + for (JettySolrRunner jetty : cluster.getJettySolrRunners()) { > > + HttpSolrClient client = > > + new HttpSolrClient.Builder(jetty.getBaseUrl().toString() + > "/" + > > collectionName).build(); > > + try { > > + ModifiableSolrParams params = new ModifiableSolrParams(); > > + params.set("q", "*:*"); > > + params.set(USER_PARAM, "user"); > > + client.query(params); > > + } finally { > > + client.close(); > > + } > > + } > > + } > > + > > +} > > > > http://git-wip-us.apache.org/repos/asf/lucene- > > solr/blob/a1a8b286/solr/core/src/test/org/apache/solr/security/hadoop/Te > > stSolrCloudWithHadoopAuthPlugin.java > > ---------------------------------------------------------------------- > > diff --git > > a/solr/core/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithHa > > doopAuthPlugin.java > > b/solr/core/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithHa > > doopAuthPlugin.java > > new file mode 100644 > > index 0000000..960fd9a > > --- /dev/null > > +++ > > b/solr/core/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithHa > > doopAuthPlugin.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.hadoop; > > + > > +import java.io.File; > > +import java.nio.charset.StandardCharsets; > > + > > +import org.apache.commons.io.FileUtils; > > +import org.apache.lucene.util.Constants; > > +import org.apache.solr.client.solrj.SolrQuery; > > +import org.apache.solr.client.solrj.impl.CloudSolrClient; > > +import org.apache.solr.client.solrj.request.CollectionAdminRequest; > > +import org.apache.solr.client.solrj.response.QueryResponse; > > +import org.apache.solr.cloud.AbstractDistribZkTestBase; > > +import org.apache.solr.cloud.KerberosTestServices; > > +import org.apache.solr.cloud.SolrCloudTestCase; > > +import org.apache.solr.common.SolrInputDocument; > > +import org.junit.AfterClass; > > +import org.junit.BeforeClass; > > +import org.junit.Test; > > + > > +public class TestSolrCloudWithHadoopAuthPlugin extends > > SolrCloudTestCase { > > + protected static final int NUM_SERVERS = 1; > > + protected static final int NUM_SHARDS = 1; > > + protected static final int REPLICATION_FACTOR = 1; > > + private static KerberosTestServices kerberosTestServices; > > + > > + @BeforeClass > > + public static void setupClass() throws Exception { > > + assumeFalse("Hadoop does not work on Windows", > > Constants.WINDOWS); > > + assumeFalse("FIXME: SOLR-8182: This test fails under Java 9", > > Constants.JRE_IS_MINIMUM_JAVA9); > > + > > + setupMiniKdc(); > > + > > + configureCluster(NUM_SERVERS)// nodes > > + > > .withSecurityJson(TEST_PATH().resolve("security").resolve(" > hadoop_kerbero > > s_config.json")) > > + .addConfig("conf1", TEST_PATH().resolve(" > configsets").resolve("cloud- > > minimal").resolve("conf")) > > + .configure(); > > + } > > + > > + @AfterClass > > + public static void tearDownClass() throws Exception { > > + System.clearProperty("java.security.auth.login.config"); > > + System.clearProperty("solr.kerberos.principal"); > > + System.clearProperty("solr.kerberos.keytab"); > > + System.clearProperty("solr.kerberos.name.rules"); > > + System.clearProperty("solr.jaas.debug"); > > + kerberosTestServices.stop(); > > + kerberosTestServices = null; > > + } > > + > > + private static void setupMiniKdc() throws Exception { > > + System.setProperty("solr.jaas.debug", "true"); > > + String kdcDir = createTempDir()+File.separator+"minikdc"; > > + String solrClientPrincipal = "solr"; > > + File keytabFile = new File(kdcDir, "keytabs"); > > + kerberosTestServices = KerberosTestServices.builder() > > + .withKdc(new File(kdcDir)) > > + .withJaasConfiguration(solrClientPrincipal, keytabFile, > "SolrClient") > > + .build(); > > + String solrServerPrincipal = "HTTP/127.0.0.1"; > > + kerberosTestServices.start(); > > + kerberosTestServices.getKdc().createPrincipal(keytabFile, > > solrServerPrincipal, solrClientPrincipal); > > + > > + String jaas = "SolrClient {\n" > > + + " com.sun.security.auth.module.Krb5LoginModule required\n" > > + + " useKeyTab=true\n" > > + + " keyTab=\"" + keytabFile.getAbsolutePath() + "\"\n" > > + + " storeKey=true\n" > > + + " useTicketCache=false\n" > > + + " doNotPrompt=true\n" > > + + " debug=true\n" > > + + " principal=\"" + solrClientPrincipal + "\";\n" > > + + "};"; > > + > > + String jaasFilePath = kdcDir+File.separator+"jaas-client.conf"; > > + FileUtils.write(new File(jaasFilePath), jaas, > StandardCharsets.UTF_8); > > + System.setProperty("java.security.auth.login.config", > jaasFilePath); > > + System.setProperty("solr.kerberos.jaas.appname", "SolrClient"); // > Get > > this app name from the jaas file > > + > > + System.setProperty("solr.kerberos.principal", solrServerPrincipal); > > + System.setProperty("solr.kerberos.keytab", > > keytabFile.getAbsolutePath()); > > + // Extracts 127.0.0.1 from HTTP/[email protected] > > + System.setProperty("solr.kerberos.name.rules", > > "RULE:[1:$1@$0](.*EXAMPLE.COM)s/@.*//" > > + + "\nRULE:[2:$2@$0](.*EXAMPLE.COM)s/@.*//" > > + + "\nDEFAULT" > > + ); > > + } > > + > > + @Test > > + public void testBasics() throws Exception { > > + testCollectionCreateSearchDelete(); > > + // sometimes run a second test e.g. to test collection > create-delete-create > > scenario > > + if (random().nextBoolean()) testCollectionCreateSearchDelete(); > > + } > > + > > + protected void testCollectionCreateSearchDelete() throws Exception { > > + CloudSolrClient solrClient = cluster.getSolrClient(); > > + String collectionName = "testkerberoscollection"; > > + > > + // create collection > > + CollectionAdminRequest.Create create = > > CollectionAdminRequest.createCollection(collectionName, "conf1", > > + NUM_SHARDS, REPLICATION_FACTOR); > > + create.process(solrClient); > > + > > + SolrInputDocument doc = new SolrInputDocument(); > > + doc.setField("id", "1"); > > + solrClient.add(collectionName, doc); > > + solrClient.commit(collectionName); > > + > > + SolrQuery query = new SolrQuery(); > > + query.setQuery("*:*"); > > + QueryResponse rsp = solrClient.query(collectionName, query); > > + assertEquals(1, rsp.getResults().getNumFound()); > > + > > + CollectionAdminRequest.Delete deleteReq = > > CollectionAdminRequest.deleteCollection(collectionName); > > + deleteReq.process(solrClient); > > + AbstractDistribZkTestBase.waitForCollectionToDisappear( > collectionName, > > + solrClient.getZkStateReader(), true, true, 330); > > + } > > + > > +} > > > > http://git-wip-us.apache.org/repos/asf/lucene- > > solr/blob/a1a8b286/solr/solrj/src/java/org/apache/solr/ > client/solrj/impl/Htt > > pClientBuilderFactory.java > > ---------------------------------------------------------------------- > > diff --git > > a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ > HttpClientBuilderFact > > ory.java > > b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ > HttpClientBuilderFact > > ory.java > > new file mode 100644 > > index 0000000..77c4a94 > > --- /dev/null > > +++ > > b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ > HttpClientBuilderFact > > ory.java > > @@ -0,0 +1,41 @@ > > +/* > > + * 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.client.solrj.impl; > > + > > +import java.io.Closeable; > > +import java.util.Optional; > > + > > +/** > > + * Factory interface for configuring {@linkplain > SolrHttpClientBuilder}. This > > + * relies on the internal HttpClient implementation and is subject to > > + * change. > > + * > > + * @lucene.experimental > > + **/ > > +public interface HttpClientBuilderFactory extends Closeable { > > + > > + /** > > + * This method configures the {@linkplain SolrHttpClientBuilder} by > > overriding the > > + * configuration of passed SolrHttpClientBuilder or as a new instance. > > + * > > + * @param builder The instance of the {@linkplain > SolrHttpClientBuilder} > > which should > > + * by configured (optional). > > + * @return the {@linkplain SolrHttpClientBuilder} > > + */ > > + public SolrHttpClientBuilder > > getHttpClientBuilder(Optional<SolrHttpClientBuilder> builder); > > + > > +} > > > > http://git-wip-us.apache.org/repos/asf/lucene- > > solr/blob/a1a8b286/solr/solrj/src/java/org/apache/solr/ > client/solrj/impl/Kr > > b5HttpClientBuilder.java > > ---------------------------------------------------------------------- > > diff --git > > a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ > Krb5HttpClientBuilder > > .java > > b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ > Krb5HttpClientBuilder > > .java > > index 39cc2dc..7f3cf29 100644 > > --- > > a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ > Krb5HttpClientBuilder > > .java > > +++ > > b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ > Krb5HttpClientBuilder > > .java > > @@ -21,6 +21,7 @@ import java.security.Principal; > > import java.util.Arrays; > > import java.util.HashSet; > > import java.util.Locale; > > +import java.util.Optional; > > import java.util.Set; > > > > import javax.security.auth.login.AppConfigurationEntry; > > @@ -46,7 +47,7 @@ import org.slf4j.LoggerFactory; > > /** > > * Kerberos-enabled SolrHttpClientBuilder > > */ > > -public class Krb5HttpClientBuilder { > > +public class Krb5HttpClientBuilder implements HttpClientBuilderFactory { > > > > public static final String LOGIN_CONFIG_PROP = > > "java.security.auth.login.config"; > > private static final Logger logger = > > LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); > > @@ -73,7 +74,12 @@ public class Krb5HttpClientBuilder { > > public void close() { > > HttpClientUtil.removeRequestInterceptor(bufferedEntityInterceptor); > > } > > - > > + > > + @Override > > + public SolrHttpClientBuilder > > getHttpClientBuilder(Optional<SolrHttpClientBuilder> builder) { > > + return builder.isPresent() ? getBuilder(builder.get()) : > getBuilder(); > > + } > > + > > public SolrHttpClientBuilder getBuilder(SolrHttpClientBuilder > builder) { > > if (System.getProperty(LOGIN_CONFIG_PROP) != null) { > > String configValue = System.getProperty(LOGIN_CONFIG_PROP); > > > > http://git-wip-us.apache.org/repos/asf/lucene- > > solr/blob/a1a8b286/solr/test- > > framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java > > ---------------------------------------------------------------------- > > 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 5ebdfb7..81e1f22 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 > > @@ -28,6 +28,7 @@ import java.util.Collection; > > import java.util.Collections; > > import java.util.List; > > import java.util.Objects; > > +import java.util.Optional; > > import java.util.Random; > > import java.util.SortedMap; > > import java.util.concurrent.Callable; > > @@ -68,6 +69,7 @@ public class MiniSolrCloudCluster { > > " <str name=\"shareSchema\">${shareSchema:false}</str>\n" + > > " <str > > name=\"configSetBaseDir\">${configSetBaseDir:configsets}</str>\n" + > > " <str name=\"coreRootDirectory\">${coreRootDirectory:.}</str>\n" > + > > + " <str > > name=\"collectionsHandler\">${collectionsHandler:solr. > CollectionsHandler}< > > /str>\n" + > > "\n" + > > " <shardHandlerFactory name=\"shardHandlerFactory\" > > class=\"HttpShardHandlerFactory\">\n" + > > " <str name=\"urlScheme\">${urlScheme:}</str>\n" + > > @@ -180,8 +182,30 @@ public class MiniSolrCloudCluster { > > * > > * @throws Exception if there was an error starting the cluster > > */ > > - public MiniSolrCloudCluster(int numServers, Path baseDir, String > solrXml, > > JettyConfig jettyConfig, ZkTestServer zkTestServer) throws Exception { > > + public MiniSolrCloudCluster(int numServers, Path baseDir, String > solrXml, > > JettyConfig jettyConfig, > > + ZkTestServer zkTestServer) throws Exception { > > + this(numServers, baseDir, solrXml, jettyConfig, zkTestServer, > > Optional.empty()); > > + } > > > > + /** > > + * Create a MiniSolrCloudCluster. > > + * Note - this constructor visibility is changed to package protected > so as to > > + * discourage its usage. Ideally *new* functionality should use > {@linkplain > > SolrCloudTestCase} > > + * to configure any additional parameters. > > + * > > + * @param numServers number of Solr servers to start > > + * @param baseDir base directory that the mini cluster should be run > from > > + * @param solrXml solr.xml file to be uploaded to ZooKeeper > > + * @param jettyConfig Jetty configuration > > + * @param zkTestServer ZkTestServer to use. If null, one will be > created > > + * @param securityJson A string representation of security.json file > > (optional). > > + * > > + * @throws Exception if there was an error starting the cluster > > + */ > > + MiniSolrCloudCluster(int numServers, Path baseDir, String solrXml, > > JettyConfig jettyConfig, > > + ZkTestServer zkTestServer, Optional<String> securityJson) throws > > Exception { > > + > > + Objects.requireNonNull(securityJson); > > this.baseDir = Objects.requireNonNull(baseDir); > > this.jettyConfig = Objects.requireNonNull(jettyConfig); > > > > @@ -202,6 +226,9 @@ public class MiniSolrCloudCluster { > > if (jettyConfig.sslConfig != null && > > jettyConfig.sslConfig.isSSLMode()) > { > > zkClient.makePath("/solr" + ZkStateReader.CLUSTER_PROPS, > > "{'urlScheme':'https'}".getBytes(StandardCharsets.UTF_8), true); > > } > > + if (securityJson.isPresent()) { // configure Solr security > > + zkClient.makePath("/solr/security.json", > > securityJson.get().getBytes(Charset.defaultCharset()), true); > > + } > > } > > > > // tell solr to look in zookeeper for solr.xml > > > > http://git-wip-us.apache.org/repos/asf/lucene- > > solr/blob/a1a8b286/solr/test- > > framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java > > ---------------------------------------------------------------------- > > 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 9cc4a22..34dc8ac 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 > > @@ -26,6 +26,7 @@ import java.util.Collections; > > import java.util.HashMap; > > import java.util.List; > > import java.util.Map; > > +import java.util.Optional; > > import java.util.concurrent.TimeUnit; > > import java.util.concurrent.atomic.AtomicReference; > > import java.util.function.Predicate; > > @@ -90,6 +91,7 @@ public class SolrCloudTestCase extends SolrTestCaseJ4 { > > private final Path baseDir; > > private String solrxml = > > MiniSolrCloudCluster.DEFAULT_CLOUD_SOLR_XML; > > private JettyConfig jettyConfig = buildJettyConfig("/solr"); > > + private Optional<String> securityJson = Optional.empty(); > > > > private List<Config> configs = new ArrayList<>(); > > private Map<String, String> clusterProperties = new HashMap<>(); > > @@ -133,6 +135,32 @@ public class SolrCloudTestCase extends > > SolrTestCaseJ4 { > > } > > > > /** > > + * Configure the specified security.json for the {@linkplain > > MiniSolrCloudCluster} > > + * > > + * @param securityJson The path specifying the security.json file > > + * @return the instance of {@linkplain Builder} > > + */ > > + public Builder withSecurityJson(Path securityJson) { > > + try { > > + this.securityJson = Optional.of(new > > String(Files.readAllBytes(securityJson), Charset.defaultCharset())); > > + } catch (IOException e) { > > + throw new RuntimeException(e); > > + } > > + return this; > > + } > > + > > + /** > > + * Configure the specified security.json for the {@linkplain > > MiniSolrCloudCluster} > > + * > > + * @param securityJson The string specifying the security.json > > configuration > > + * @return the instance of {@linkplain Builder} > > + */ > > + public Builder withSecurityJson(String securityJson) { > > + this.securityJson = Optional.of(securityJson); > > + return this; > > + } > > + > > + /** > > * Upload a collection config before tests start > > * @param configName the config name > > * @param configPath the path to the config files > > @@ -157,7 +185,7 @@ public class SolrCloudTestCase extends > > SolrTestCaseJ4 { > > * @throws Exception if an error occurs on startup > > */ > > public void configure() throws Exception { > > - cluster = new MiniSolrCloudCluster(nodeCount, baseDir, solrxml, > > jettyConfig); > > + cluster = new MiniSolrCloudCluster(nodeCount, baseDir, solrxml, > > jettyConfig, null, securityJson); > > CloudSolrClient client = cluster.getSolrClient(); > > for (Config config : configs) { > > > > ((ZkClientClusterStateProvider)client.getClusterStateProvider()). > uploadConfig > > (config.path, config.name); > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > >
