SOLR-12506: Add SolrJ support for the modify collection API

This commit is contained in:
Shalin Shekhar Mangar 2018-06-25 19:09:57 +05:30
parent ffd9944315
commit 8c714348ae
4 changed files with 146 additions and 9 deletions

View File

@ -86,6 +86,8 @@ New Features
* SOLR-12507: Modify collection API should support un-setting properties. (shalin)
* SOLR-12506: Add SolrJ support for the modify collection API. (shalin)
Bug Fixes
----------------------

View File

@ -493,4 +493,52 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
});
}
@Test
public void testModifyCollectionAttribute() throws IOException, SolrServerException {
final String collection = "testAddAndDeleteCollectionAttribute";
CollectionAdminRequest.createCollection(collection, "conf", 1, 1)
.process(cluster.getSolrClient());
CollectionAdminRequest.modifyCollection(collection, null)
.setAttribute("replicationFactor", 25)
.process(cluster.getSolrClient());
waitForState("Expecting attribute 'replicationFactor' to be 25", collection,
(n, c) -> 25 == c.getReplicationFactor());
CollectionAdminRequest.modifyCollection(collection, null)
.unsetAttribute("maxShardsPerNode")
.process(cluster.getSolrClient());
waitForState("Expecting attribute 'maxShardsPerNode' to be deleted", collection,
(n, c) -> null == c.get("maxShardsPerNode"));
try {
CollectionAdminRequest.modifyCollection(collection, null)
.setAttribute("non_existent_attr", 25)
.process(cluster.getSolrClient());
fail("An attempt to set unknown collection attribute should have failed");
} catch (IllegalArgumentException e) {
// expected
}
try {
CollectionAdminRequest.modifyCollection(collection, null)
.setAttribute("non_existent_attr", null)
.process(cluster.getSolrClient());
fail("An attempt to set null value should have failed");
} catch (IllegalArgumentException e) {
// expected
}
try {
CollectionAdminRequest.modifyCollection(collection, null)
.unsetAttribute("non_existent_attr")
.process(cluster.getSolrClient());
fail("An attempt to unset unknown collection attribute should have failed");
} catch (IllegalArgumentException e) {
// expected
}
}
}

View File

@ -393,6 +393,15 @@ public abstract class CollectionAdminRequest<T extends CollectionAdminResponse>
return new Create(collection, config, ImplicitDocRouter.NAME, null, checkNotNull("shards",shards), numNrtReplicas, numTlogReplicas, numPullReplicas);
}
/**
* Returns a SolrRequest for modifying a collection with the given properties
* @param collection the collection name
* @param properties a map of key and values with which the collection is to be modified
*/
public static Modify modifyCollection(String collection, Map<String, Object> properties) {
return new Modify(collection, properties);
}
// CREATE request
public static class Create extends AsyncCollectionSpecificAdminRequest {
@ -2322,4 +2331,82 @@ public abstract class CollectionAdminRequest<T extends CollectionAdminResponse>
}
/**
* A Modify Collection request
*/
public static class Modify extends AsyncCollectionSpecificAdminRequest {
protected Map<String, Object> attributes;
private Modify(String collection, Map<String, Object> attributes) {
super(CollectionAction.MODIFYCOLLECTION, collection);
this.attributes = attributes;
}
/**
* Sets the attributes to be modified using the Modify Collection API.
* <b>Note: this method will overwrite any previously set attributes</b>
*
* @param attributes a map of attribute key vs value
*/
public void setAttributes(Map<String, Object> attributes) {
this.attributes = attributes;
}
/**
* Sets the collection attribute to the given value
*
* @param key a string attribute key, must be one of the entries documented
* in the <a href="https://lucene.apache.org/solr/guide/collections-api.html#modifycollection">Modify Collection API documentation</a>
* @param value the attribute value for the given key
*/
public Modify setAttribute(String key, Object value) {
if (key == null) {
throw new IllegalArgumentException("Attribute key cannot be null for the modify collection API");
}
if (!MODIFIABLE_COLLECTION_PROPERTIES.contains(key)) {
throw new IllegalArgumentException("Unknown attribute key: "
+ key + ". Must be one of: " + MODIFIABLE_COLLECTION_PROPERTIES);
}
if (value == null) {
throw new IllegalArgumentException("Value cannot be null for key: " + key);
}
if (attributes == null) {
attributes = new HashMap<>();
}
attributes.put(key, value);
return this;
}
/**
* Removes the given key from the collection
*
* @param key the string attribute key, must be one of the entries documented
* in the <a href="https://lucene.apache.org/solr/guide/collections-api.html#modifycollection">Modify Collection API documentation</a>
*/
public Modify unsetAttribute(String key) {
if (key == null) {
throw new IllegalArgumentException("Attribute key cannot be null for the modify collection API");
}
if (!MODIFIABLE_COLLECTION_PROPERTIES.contains(key)) {
throw new IllegalArgumentException("Unknown attribute key: "
+ key + ". Must be one of: " + MODIFIABLE_COLLECTION_PROPERTIES);
}
if (attributes == null) {
attributes = new HashMap<>();
}
attributes.put(key, "");
return this;
}
@Override
public SolrParams getParams() {
ModifiableSolrParams params = new ModifiableSolrParams(super.getParams());
params.set(CoreAdminParams.COLLECTION, collection);
for (Map.Entry<String, Object> entry : attributes.entrySet()) {
params.set(entry.getKey(), String.valueOf(entry.getValue()));
}
return params;
}
}
}

View File

@ -36,47 +36,47 @@ public interface CollectionAdminParams {
/**
* A parameter to specify list of Solr nodes to be used (e.g. for collection creation or restore operation).
*/
public static final String CREATE_NODE_SET_PARAM = "createNodeSet";
String CREATE_NODE_SET_PARAM = "createNodeSet";
/**
* A parameter which specifies if the provided list of Solr nodes (via {@linkplain #CREATE_NODE_SET_PARAM})
* should be shuffled before being used.
*/
public static final String CREATE_NODE_SET_SHUFFLE_PARAM = "createNodeSet.shuffle";
String CREATE_NODE_SET_SHUFFLE_PARAM = "createNodeSet.shuffle";
/**
* A parameter to specify the name of the index backup strategy to be used.
*/
public static final String INDEX_BACKUP_STRATEGY = "indexBackup";
String INDEX_BACKUP_STRATEGY = "indexBackup";
/**
* This constant defines the index backup strategy based on copying index files to desired location.
*/
public static final String COPY_FILES_STRATEGY = "copy-files";
String COPY_FILES_STRATEGY = "copy-files";
/**
* This constant defines the strategy to not copy index files (useful for meta-data only backup).
*/
public static final String NO_INDEX_BACKUP_STRATEGY = "none";
String NO_INDEX_BACKUP_STRATEGY = "none";
/**
* This constant defines a list of valid index backup strategies.
*/
public static final Collection<String> INDEX_BACKUP_STRATEGIES =
Collection<String> INDEX_BACKUP_STRATEGIES =
Arrays.asList(COPY_FILES_STRATEGY, NO_INDEX_BACKUP_STRATEGY);
/**
* Name of collection property to set
*/
public static final String PROPERTY_NAME = "propertyName";
String PROPERTY_NAME = "propertyName";
/**
* Value of collection property to set
*/
public static final String PROPERTY_VALUE = "propertyValue";
String PROPERTY_VALUE = "propertyValue";
/**
* The name of the config set to be used for a collection
*/
public static final String COLL_CONF = "collection.configName";
String COLL_CONF = "collection.configName";
}