Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
SOLR-15745: Move public v2 "core-admin" APIs to annotation framework (#…
…565) Solr's been in the slow process of moving its v2 APIs away from the existing apispec/mapping framework towards one that relies on more explicit annotations to specify API properties. This commit converts the 'reload', 'swap', 'rename', 'unload', 'merge-indexes', and 'split' commands of `/v2/cores/<core>` over to the preferred framework. (NOTE: the spelling 'indexes' in the 'merge-indexes' command was retained here for consistency/compatibility. We should consider changing it going forward.)
- Loading branch information
1 parent
cfacd18
commit df88d65
Showing
13 changed files
with
721 additions
and
170 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
91 changes: 91 additions & 0 deletions
91
solr/core/src/java/org/apache/solr/handler/admin/api/MergeIndexesAPI.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
/* | ||
* 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.handler.admin.api; | ||
|
||
import org.apache.commons.collections4.CollectionUtils; | ||
import org.apache.solr.api.Command; | ||
import org.apache.solr.api.EndPoint; | ||
import org.apache.solr.api.PayloadObj; | ||
import org.apache.solr.common.annotation.JsonProperty; | ||
import org.apache.solr.common.params.CoreAdminParams; | ||
import org.apache.solr.common.params.UpdateParams; | ||
import org.apache.solr.common.util.ReflectMapWriter; | ||
import org.apache.solr.handler.admin.CoreAdminHandler; | ||
|
||
import java.util.HashMap; | ||
import java.util.List; | ||
import java.util.Locale; | ||
import java.util.Map; | ||
|
||
import static org.apache.solr.client.solrj.SolrRequest.METHOD.POST; | ||
import static org.apache.solr.handler.ClusterAPI.wrapParams; | ||
import static org.apache.solr.security.PermissionNameProvider.Name.CORE_EDIT_PERM; | ||
|
||
/** | ||
* V2 API for merging one or more Solr cores into the target core. | ||
* | ||
* The new API (POST /v2/cores/coreName {'merge-indexes': {...}}) is equivalent to the v1 | ||
* /admin/cores?action=mergeindexes command. | ||
*/ | ||
@EndPoint( | ||
path = {"/cores/{core}"}, | ||
method = POST, | ||
permission = CORE_EDIT_PERM) | ||
public class MergeIndexesAPI { | ||
private static final String V2_MERGE_INDEXES_CORE_CMD = "merge-indexes"; | ||
|
||
private final CoreAdminHandler coreHandler; | ||
|
||
public MergeIndexesAPI(CoreAdminHandler coreHandler) { | ||
this.coreHandler = coreHandler; | ||
} | ||
|
||
@Command(name = V2_MERGE_INDEXES_CORE_CMD) | ||
public void mergeIndexesIntoCore(PayloadObj<MergeIndexesPayload> obj) throws Exception { | ||
final MergeIndexesPayload v2Body = obj.get(); | ||
final Map<String, Object> v1Params = v2Body.toMap(new HashMap<>()); | ||
v1Params.put(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.MERGEINDEXES.name().toLowerCase(Locale.ROOT)); | ||
v1Params.put(CoreAdminParams.CORE, obj.getRequest().getPathTemplateValues().get(CoreAdminParams.CORE)); | ||
if (! CollectionUtils.isEmpty(v2Body.indexDir)) { | ||
v1Params.put("indexDir", v2Body.indexDir.toArray(new String[v2Body.indexDir.size()])); | ||
} | ||
if (! CollectionUtils.isEmpty(v2Body.srcCore)) { | ||
v1Params.put("srcCore", v2Body.srcCore.toArray(new String[v2Body.srcCore.size()])); | ||
} | ||
// V1 API uses 'update.chain' instead of 'updateChain'. | ||
if (v2Body.updateChain != null) { | ||
v1Params.put(UpdateParams.UPDATE_CHAIN, v1Params.remove("updateChain")); | ||
} | ||
|
||
coreHandler.handleRequestBody(wrapParams(obj.getRequest(), v1Params), obj.getResponse()); | ||
} | ||
|
||
public static class MergeIndexesPayload implements ReflectMapWriter { | ||
@JsonProperty | ||
public List<String> indexDir; | ||
|
||
@JsonProperty | ||
public List<String> srcCore; | ||
|
||
@JsonProperty | ||
public String updateChain; | ||
|
||
@JsonProperty | ||
public String async; | ||
} | ||
} |
69 changes: 69 additions & 0 deletions
69
solr/core/src/java/org/apache/solr/handler/admin/api/ReloadCoreAPI.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
/* | ||
* 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.handler.admin.api; | ||
|
||
import org.apache.solr.api.Command; | ||
import org.apache.solr.api.EndPoint; | ||
import org.apache.solr.api.PayloadObj; | ||
import org.apache.solr.common.params.CoreAdminParams; | ||
import org.apache.solr.common.util.ReflectMapWriter; | ||
import org.apache.solr.handler.admin.CoreAdminHandler; | ||
|
||
import java.util.HashMap; | ||
import java.util.Locale; | ||
import java.util.Map; | ||
|
||
import static org.apache.solr.client.solrj.SolrRequest.METHOD.POST; | ||
import static org.apache.solr.common.params.CommonParams.ACTION; | ||
import static org.apache.solr.handler.ClusterAPI.wrapParams; | ||
import static org.apache.solr.security.PermissionNameProvider.Name.CORE_EDIT_PERM; | ||
|
||
/** | ||
* V2 API for reloading an individual core. | ||
* | ||
* The new API (POST /v2/cores/coreName {'reload': {...}}) is equivalent to the v1 | ||
* /admin/cores?action=reload command. | ||
* | ||
* @see ReloadCorePayload | ||
*/ | ||
@EndPoint( | ||
path = {"/cores/{core}"}, | ||
method = POST, | ||
permission = CORE_EDIT_PERM) | ||
public class ReloadCoreAPI { | ||
private static final String V2_RELOAD_CORE_CMD = "reload"; | ||
|
||
private final CoreAdminHandler coreHandler; | ||
|
||
public ReloadCoreAPI(CoreAdminHandler coreHandler) { | ||
this.coreHandler = coreHandler; | ||
} | ||
|
||
@Command(name = V2_RELOAD_CORE_CMD) | ||
public void reloadCore(PayloadObj<ReloadCorePayload> obj) throws Exception { | ||
final String coreName = obj.getRequest().getPathTemplateValues().get(CoreAdminParams.CORE); | ||
|
||
final Map<String, Object> v1Params = new HashMap<>(); | ||
v1Params.put(ACTION, CoreAdminParams.CoreAdminAction.RELOAD.name().toLowerCase(Locale.ROOT)); | ||
v1Params.put(CoreAdminParams.CORE, coreName); | ||
|
||
coreHandler.handleRequestBody(wrapParams(obj.getRequest(), v1Params), obj.getResponse()); | ||
} | ||
|
||
public static class ReloadCorePayload implements ReflectMapWriter {} | ||
} |
72 changes: 72 additions & 0 deletions
72
solr/core/src/java/org/apache/solr/handler/admin/api/RenameCoreAPI.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
/* | ||
* 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.handler.admin.api; | ||
|
||
import org.apache.solr.api.Command; | ||
import org.apache.solr.api.EndPoint; | ||
import org.apache.solr.api.PayloadObj; | ||
import org.apache.solr.common.annotation.JsonProperty; | ||
import org.apache.solr.common.params.CoreAdminParams; | ||
import org.apache.solr.common.util.ReflectMapWriter; | ||
import org.apache.solr.handler.admin.CoreAdminHandler; | ||
|
||
import java.util.HashMap; | ||
import java.util.Locale; | ||
import java.util.Map; | ||
|
||
import static org.apache.solr.client.solrj.SolrRequest.METHOD.POST; | ||
import static org.apache.solr.handler.ClusterAPI.wrapParams; | ||
import static org.apache.solr.security.PermissionNameProvider.Name.CORE_EDIT_PERM; | ||
|
||
/** | ||
* V2 API for renaming an existing Solr core. | ||
* | ||
* The new API (POST /v2/cores/coreName {'rename': {...}}) is equivalent to the v1 | ||
* /admin/cores?action=rename command. | ||
*/ | ||
@EndPoint( | ||
path = {"/cores/{core}"}, | ||
method = POST, | ||
permission = CORE_EDIT_PERM) | ||
public class RenameCoreAPI { | ||
private static final String V2_RENAME_CORE_CMD = "rename"; | ||
|
||
private final CoreAdminHandler coreHandler; | ||
|
||
public RenameCoreAPI(CoreAdminHandler coreHandler) { | ||
this.coreHandler = coreHandler; | ||
} | ||
|
||
@Command(name = V2_RENAME_CORE_CMD) | ||
public void renameCore(PayloadObj<RenameCorePayload> obj) throws Exception { | ||
final RenameCorePayload v2Body = obj.get(); | ||
final Map<String, Object> v1Params = v2Body.toMap(new HashMap<>()); | ||
v1Params.put(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.RENAME.name().toLowerCase(Locale.ROOT)); | ||
v1Params.put(CoreAdminParams.CORE, obj.getRequest().getPathTemplateValues().get(CoreAdminParams.CORE)); | ||
|
||
// V1 API uses 'other' instead of 'to' to represent the new core name. | ||
v1Params.put(CoreAdminParams.OTHER, v1Params.remove("to")); | ||
|
||
coreHandler.handleRequestBody(wrapParams(obj.getRequest(), v1Params), obj.getResponse()); | ||
} | ||
|
||
public static class RenameCorePayload implements ReflectMapWriter { | ||
@JsonProperty(required = true) | ||
public String to; | ||
} | ||
} |
Oops, something went wrong.