package org.apache.solr.cloud;
/*
* 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.
*/
import org.apache.commons.io.FileUtils;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.request.QueryRequest;
import org.apache.solr.common.cloud.SolrZkClient;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.SimpleOrderedMap;
import java.io.File;
public class TestModifyConfFiles extends AbstractFullDistribZkTestBase {
public TestModifyConfFiles() {
super();
}
@Override
public void doTest() throws Exception {
int which = r.nextInt(clients.size());
HttpSolrServer client = (HttpSolrServer) clients.get(which);
ModifiableSolrParams params = new ModifiableSolrParams();
params.set("op", "write");
params.set("file", "schema.xml");
QueryRequest request = new QueryRequest(params);
request.setPath("/admin/fileedit");
try {
client.request(request);
fail("Should have caught exception");
} catch (Exception e) {
assertEquals(e.getMessage(), "Input stream list was null for admin file write operation.");
}
params.remove("file");
params.set("stream.body", "Testing rewrite of schema.xml file.");
params.set("op", "test");
request = new QueryRequest(params);
request.setPath("/admin/fileedit");
try {
client.request(request);
fail("Should have caught exception");
} catch (Exception e) {
assertEquals(e.getMessage(), "No file name specified for write operation.");
}
params.set("op", "write");
params.set("file", "bogus.txt");
request = new QueryRequest(params);
request.setPath("/admin/fileedit");
try {
client.request(request);
fail("Should have caught exception");
} catch (Exception e) {
assertEquals(e.getMessage(), "Can not access: bogus.txt");
}
try {
params.set("file", "schema.xml");
request = new QueryRequest(params);
request.setPath("/admin/fileedit");
client.request(request);
fail("Should have caught exception since it's mal-formed XML");
} catch (Exception e) {
assertTrue("Should have a sax parser exception here!",
e.getMessage().contains("Invalid XML file: org.xml.sax.SAXParseException"));
}
String top = SolrTestCaseJ4.TEST_HOME() + "/collection1/conf";
params.set("stream.body", FileUtils.readFileToString(new File(top, "schema-tiny.xml"), "UTF-8"));
params.set("file", "schema.xml");
request = new QueryRequest(params);
request.setPath("/admin/fileedit");
client.request(request);
SolrZkClient zkClient = cloudClient.getZkStateReader().getZkClient();
String contents = new String(zkClient.getData("/configs/conf1/schema.xml", null, null, true), "UTF-8");
assertTrue("Schema contents should have changed!", contents.contains("<schema name=\"tiny\" version=\"1.1\">"));
// Create a velocity/whatever node. Put a bit of data in it. See if you can change it.
zkClient.makePath("/configs/conf1/velocity/test.vm", false, true);
params.set("stream.body", "Some bogus stuff for a test.");
params.set("file", "velocity/test.vm");
request = new QueryRequest(params);
request.setPath("/admin/fileedit");
client.request(request);
contents = new String(zkClient.getData("/configs/conf1/velocity/test.vm", null, null, true), "UTF-8");
assertTrue("Should have found new content in a velocity/test.vm.",
contents.indexOf("Some bogus stuff for a test.") != -1);
params = new ModifiableSolrParams();
request = new QueryRequest(params);
request.setPath("/admin/file");
NamedList<Object> res = client.request(request);
NamedList files = (NamedList)res.get("files");
assertNotNull("Should have gotten files back", files);
SimpleOrderedMap schema = (SimpleOrderedMap)files.get("schema.xml");
assertNotNull("Should have a schema returned", schema);
assertNull("Schema.xml should not be a directory", schema.get("directory"));
SimpleOrderedMap velocity = (SimpleOrderedMap)files.get("velocity");
assertNotNull("Should have velocity dir returned", velocity);
assertTrue("Velocity should be a directory", (boolean)velocity.get("directory"));
}
}