forked from D-Net/dnet-hadoop
Add support to cretate/update solr collection aliases
This commit is contained in:
parent
6421f8fece
commit
9f6e16a03c
|
@ -14,4 +14,7 @@ public class ProvisionConstants {
|
||||||
return format + SEPARATOR + LAYOUT + SEPARATOR + INTERPRETATION;
|
return format + SEPARATOR + LAYOUT + SEPARATOR + INTERPRETATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final String PUBLIC_ALIAS_NAME = "public";
|
||||||
|
public static final String SHADOW_ALIAS_NAME = "shadow";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.solr.client.solrj.SolrResponse;
|
import org.apache.solr.client.solrj.SolrResponse;
|
||||||
import org.apache.solr.client.solrj.SolrServerException;
|
import org.apache.solr.client.solrj.SolrServerException;
|
||||||
import org.apache.solr.client.solrj.impl.CloudSolrClient;
|
import org.apache.solr.client.solrj.impl.CloudSolrClient;
|
||||||
|
import org.apache.solr.client.solrj.request.CollectionAdminRequest;
|
||||||
import org.apache.solr.client.solrj.response.UpdateResponse;
|
import org.apache.solr.client.solrj.response.UpdateResponse;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -23,7 +24,7 @@ public class SolrAdminApplication implements Closeable {
|
||||||
private static final Logger log = LoggerFactory.getLogger(SolrAdminApplication.class);
|
private static final Logger log = LoggerFactory.getLogger(SolrAdminApplication.class);
|
||||||
|
|
||||||
enum Action {
|
enum Action {
|
||||||
DELETE_BY_QUERY, COMMIT
|
DELETE_BY_QUERY, COMMIT, UPDATE_ALIASES
|
||||||
}
|
}
|
||||||
|
|
||||||
private final CloudSolrClient solrClient;
|
private final CloudSolrClient solrClient;
|
||||||
|
@ -62,8 +63,21 @@ public class SolrAdminApplication implements Closeable {
|
||||||
final String collection = ProvisionConstants.getCollectionName(format);
|
final String collection = ProvisionConstants.getCollectionName(format);
|
||||||
log.info("collection: {}", collection);
|
log.info("collection: {}", collection);
|
||||||
|
|
||||||
|
final String publicFormat = parser.get("publicFormat");
|
||||||
|
log.info("publicFormat: {}", publicFormat);
|
||||||
|
|
||||||
|
final String shadowFormat = parser.get("shadowFormat");
|
||||||
|
log.info("shadowFormat: {}", shadowFormat);
|
||||||
|
|
||||||
|
// get collection names from metadata format profiles names
|
||||||
|
final String publicCollection = ProvisionConstants.getCollectionName(publicFormat);
|
||||||
|
log.info("publicCollection: {}", publicCollection);
|
||||||
|
|
||||||
|
final String shadowCollection = ProvisionConstants.getCollectionName(shadowFormat);
|
||||||
|
log.info("shadowCollection: {}", shadowCollection);
|
||||||
|
|
||||||
try (SolrAdminApplication app = new SolrAdminApplication(zkHost)) {
|
try (SolrAdminApplication app = new SolrAdminApplication(zkHost)) {
|
||||||
app.execute(action, collection, query, commit);
|
app.execute(action, collection, query, commit, publicCollection, shadowCollection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,21 +87,28 @@ public class SolrAdminApplication implements Closeable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public SolrResponse commit(String collection) throws IOException, SolrServerException {
|
public SolrResponse commit(String collection) throws IOException, SolrServerException {
|
||||||
return execute(Action.COMMIT, collection, null, true);
|
return execute(Action.COMMIT, collection, null, true, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public SolrResponse execute(Action action, String collection, String query, boolean commit)
|
public SolrResponse execute(Action action, String collection, String query, boolean commit,
|
||||||
|
String publicCollection, String shadowCollection)
|
||||||
throws IOException, SolrServerException {
|
throws IOException, SolrServerException {
|
||||||
switch (action) {
|
switch (action) {
|
||||||
|
|
||||||
case DELETE_BY_QUERY:
|
case DELETE_BY_QUERY:
|
||||||
UpdateResponse rsp = solrClient.deleteByQuery(collection, query);
|
UpdateResponse rsp = solrClient.deleteByQuery(collection, query);
|
||||||
if (commit) {
|
if (commit) {
|
||||||
solrClient.commit(collection);
|
return solrClient.commit(collection);
|
||||||
}
|
}
|
||||||
return rsp;
|
return rsp;
|
||||||
|
|
||||||
case COMMIT:
|
case COMMIT:
|
||||||
return solrClient.commit(collection);
|
return solrClient.commit(collection);
|
||||||
|
|
||||||
|
case UPDATE_ALIASES:
|
||||||
|
this.updateAliases(publicCollection, shadowCollection);
|
||||||
|
return null;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new IllegalArgumentException("action not managed: " + action);
|
throw new IllegalArgumentException("action not managed: " + action);
|
||||||
}
|
}
|
||||||
|
@ -98,4 +119,28 @@ public class SolrAdminApplication implements Closeable {
|
||||||
solrClient.close();
|
solrClient.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateAliases(String publicCollection, String shadowCollection)
|
||||||
|
throws SolrServerException, IOException {
|
||||||
|
|
||||||
|
// delete current aliases
|
||||||
|
this.deleteAlias(ProvisionConstants.PUBLIC_ALIAS_NAME);
|
||||||
|
this.deleteAlias(ProvisionConstants.SHADOW_ALIAS_NAME);
|
||||||
|
|
||||||
|
// create aliases
|
||||||
|
this.createAlias(ProvisionConstants.PUBLIC_ALIAS_NAME, publicCollection);
|
||||||
|
this.createAlias(ProvisionConstants.SHADOW_ALIAS_NAME, shadowCollection);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public SolrResponse deleteAlias(String aliasName) throws SolrServerException, IOException {
|
||||||
|
CollectionAdminRequest.DeleteAlias deleteAliasRequest = CollectionAdminRequest.deleteAlias(aliasName);
|
||||||
|
return deleteAliasRequest.process(solrClient);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SolrResponse createAlias(String aliasName, String collection) throws IOException, SolrServerException {
|
||||||
|
CollectionAdminRequest.CreateAlias createAliasRequest = CollectionAdminRequest
|
||||||
|
.createAlias(aliasName, collection);
|
||||||
|
return createAliasRequest.process(solrClient);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,5 +28,18 @@
|
||||||
"paramLongName": "commit",
|
"paramLongName": "commit",
|
||||||
"paramDescription": "should the action be followed by a commit?",
|
"paramDescription": "should the action be followed by a commit?",
|
||||||
"paramRequired": false
|
"paramRequired": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"paramName": "pf",
|
||||||
|
"paramLongName": "publicFormat",
|
||||||
|
"paramDescription": "the name of the public metadata format profile - used to create an alias",
|
||||||
|
"paramRequired": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"paramName": "sf",
|
||||||
|
"paramLongName": "shadowFormat",
|
||||||
|
"paramDescription": "the name of the shadow metadata format profile - used to create an alias",
|
||||||
|
"paramRequired": false
|
||||||
}
|
}
|
||||||
|
|
||||||
]
|
]
|
|
@ -110,6 +110,14 @@
|
||||||
<name>sparkNetworkTimeout</name>
|
<name>sparkNetworkTimeout</name>
|
||||||
<description>configures spark.network.timeout</description>
|
<description>configures spark.network.timeout</description>
|
||||||
</property>
|
</property>
|
||||||
|
<property>
|
||||||
|
<name>publicFormat</name>
|
||||||
|
<description>the public metadata format - used to create the public collection alias</description>
|
||||||
|
</property>
|
||||||
|
<property>
|
||||||
|
<name>shadowFormat</name>
|
||||||
|
<description>the shadow metadata format - used to create the shadow collection alias</description>
|
||||||
|
</property>
|
||||||
</parameters>
|
</parameters>
|
||||||
|
|
||||||
<global>
|
<global>
|
||||||
|
@ -133,6 +141,7 @@
|
||||||
<case to="create_payloads">${wf:conf('resumeFrom') eq 'create_payloads'}</case>
|
<case to="create_payloads">${wf:conf('resumeFrom') eq 'create_payloads'}</case>
|
||||||
<case to="drop_solr_collection">${wf:conf('resumeFrom') eq 'drop_solr_collection'}</case>
|
<case to="drop_solr_collection">${wf:conf('resumeFrom') eq 'drop_solr_collection'}</case>
|
||||||
<case to="to_solr_index">${wf:conf('resumeFrom') eq 'to_solr_index'}</case>
|
<case to="to_solr_index">${wf:conf('resumeFrom') eq 'to_solr_index'}</case>
|
||||||
|
<case to="update_solr_aliases">${wf:conf('resumeFrom') eq 'update_solr_aliases'}</case>
|
||||||
<default to="prepare_relations"/>
|
<default to="prepare_relations"/>
|
||||||
</switch>
|
</switch>
|
||||||
</decision>
|
</decision>
|
||||||
|
@ -721,5 +730,25 @@
|
||||||
<error to="Kill"/>
|
<error to="Kill"/>
|
||||||
</action>
|
</action>
|
||||||
|
|
||||||
|
<!-- Action that updates the solr core aliases - out of order execution, only using the 'resume_from' param -->
|
||||||
|
<action name="update_solr_aliases">
|
||||||
|
<java>
|
||||||
|
<configuration>
|
||||||
|
<property>
|
||||||
|
<name>oozie.launcher.mapreduce.user.classpath.first</name>
|
||||||
|
<value>true</value>
|
||||||
|
</property>
|
||||||
|
</configuration>
|
||||||
|
<main-class>eu.dnetlib.dhp.oa.provision.SolrAdminApplication</main-class>
|
||||||
|
<arg>--isLookupUrl</arg><arg>${isLookupUrl}</arg>
|
||||||
|
<arg>--format</arg><arg>${format}</arg>
|
||||||
|
<arg>--action</arg><arg>UPDATE_ALIASES</arg>
|
||||||
|
<arg>--publicFormat</arg><arg>${publicFormat}</arg>
|
||||||
|
<arg>--shadowFormat</arg><arg>${shadowFormat}</arg>
|
||||||
|
</java>
|
||||||
|
<ok to="End"/>
|
||||||
|
<error to="Kill"/>
|
||||||
|
</action>
|
||||||
|
|
||||||
<end name="End"/>
|
<end name="End"/>
|
||||||
</workflow-app>
|
</workflow-app>
|
|
@ -4,9 +4,9 @@ package eu.dnetlib.dhp.oa.provision;
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
import org.apache.solr.client.solrj.response.CollectionAdminResponse;
|
||||||
import org.apache.solr.client.solrj.response.SolrPingResponse;
|
import org.apache.solr.client.solrj.response.SolrPingResponse;
|
||||||
import org.apache.solr.client.solrj.response.UpdateResponse;
|
import org.apache.solr.client.solrj.response.UpdateResponse;
|
||||||
import org.junit.jupiter.api.Assertions;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
class SolrAdminApplicationTest extends SolrTest {
|
class SolrAdminApplicationTest extends SolrTest {
|
||||||
|
@ -24,7 +24,7 @@ class SolrAdminApplicationTest extends SolrTest {
|
||||||
SolrAdminApplication admin = new SolrAdminApplication(miniCluster.getSolrClient().getZkHost());
|
SolrAdminApplication admin = new SolrAdminApplication(miniCluster.getSolrClient().getZkHost());
|
||||||
|
|
||||||
UpdateResponse rsp = (UpdateResponse) admin
|
UpdateResponse rsp = (UpdateResponse) admin
|
||||||
.execute(SolrAdminApplication.Action.DELETE_BY_QUERY, DEFAULT_COLLECTION, "*:*", false);
|
.execute(SolrAdminApplication.Action.DELETE_BY_QUERY, DEFAULT_COLLECTION, "*:*", false, null, null);
|
||||||
|
|
||||||
assertEquals(0, rsp.getStatus());
|
assertEquals(0, rsp.getStatus());
|
||||||
}
|
}
|
||||||
|
@ -39,4 +39,25 @@ class SolrAdminApplicationTest extends SolrTest {
|
||||||
assertEquals(0, rsp.getStatus());
|
assertEquals(0, rsp.getStatus());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testAdminApplication_CREATE_ALIAS() throws Exception {
|
||||||
|
|
||||||
|
SolrAdminApplication admin = new SolrAdminApplication(miniCluster.getSolrClient().getZkHost());
|
||||||
|
|
||||||
|
CollectionAdminResponse rsp = (CollectionAdminResponse) admin
|
||||||
|
.createAlias(ProvisionConstants.PUBLIC_ALIAS_NAME, DEFAULT_COLLECTION);
|
||||||
|
assertEquals(0, rsp.getStatus());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testAdminApplication_DELETE_ALIAS() throws Exception {
|
||||||
|
|
||||||
|
SolrAdminApplication admin = new SolrAdminApplication(miniCluster.getSolrClient().getZkHost());
|
||||||
|
|
||||||
|
CollectionAdminResponse rsp = (CollectionAdminResponse) admin.deleteAlias(ProvisionConstants.PUBLIC_ALIAS_NAME);
|
||||||
|
assertEquals(0, rsp.getStatus());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue