This is an automated email from the ASF dual-hosted git repository.

gerlowskija pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/branch_9x by this push:
     new d5792c9  SOLR-15745: Convert remaining 'core-admin' v2 APIs to 
annotations (#577)
d5792c9 is described below

commit d5792c9e70502b84e9920b3f6e3f40adc3ea1cb9
Author: Jason Gerlowski <[email protected]>
AuthorDate: Mon Feb 21 13:36:42 2022 -0500

    SOLR-15745: Convert remaining 'core-admin' v2 APIs to annotations (#577)
    
    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 various internal core admin commands
    (prep-recovery, reuqest-apply-updates, request-buffer-updates,
    request-recovery, and request-sync-shard) over to the preferred
    framework.
---
 .../solr/handler/admin/CoreAdminHandler.java       | 20 +++--
 .../solr/handler/admin/CoreAdminHandlerApi.java    | 85 -------------------
 .../handler/admin/api/PrepareCoreRecoveryAPI.java  | 66 +++++++++++++++
 .../admin/api/RequestApplyCoreUpdatesAPI.java      | 66 +++++++++++++++
 .../handler/admin/api/RequestBufferUpdatesAPI.java | 66 +++++++++++++++
 .../admin/api/RequestCoreCommandStatusAPI.java     | 62 ++++++++++++++
 .../handler/admin/api/RequestCoreRecoveryAPI.java  | 66 +++++++++++++++
 .../handler/admin/api/RequestSyncShardAPI.java     | 66 +++++++++++++++
 .../handler/admin/api/V2CoreAPIMappingTest.java    | 76 +++++++++++++++++
 .../solr/client/solrj/request/CoreApiMapping.java  | 95 ----------------------
 .../request/beans/PrepareCoreRecoveryPayload.java  | 41 ++++++++++
 .../beans/RequestApplyCoreUpdatesPayload.java      | 22 +++++
 .../request/beans/RequestBufferUpdatesPayload.java | 22 +++++
 .../request/beans/RequestCoreRecoveryPayload.java  | 22 +++++
 .../request/beans/RequestSyncShardPayload.java     | 22 +++++
 .../src/resources/apispec/cores.core.Commands.json | 43 ----------
 .../apache/solr/common/util/JsonValidatorTest.java |  1 -
 17 files changed, 612 insertions(+), 229 deletions(-)

diff --git 
a/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java 
b/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
index 27e6116..088de63 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
@@ -37,13 +37,19 @@ import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.CoreDescriptor;
 import org.apache.solr.handler.RequestHandlerBase;
 import org.apache.solr.handler.admin.api.AllCoresStatusAPI;
+import org.apache.solr.handler.admin.api.RequestCoreCommandStatusAPI;
 import org.apache.solr.handler.admin.api.CreateCoreAPI;
 import org.apache.solr.handler.admin.api.InvokeClassAPI;
 import org.apache.solr.handler.admin.api.MergeIndexesAPI;
 import org.apache.solr.handler.admin.api.OverseerOperationAPI;
+import org.apache.solr.handler.admin.api.PrepareCoreRecoveryAPI;
 import org.apache.solr.handler.admin.api.RejoinLeaderElectionAPI;
 import org.apache.solr.handler.admin.api.ReloadCoreAPI;
 import org.apache.solr.handler.admin.api.RenameCoreAPI;
+import org.apache.solr.handler.admin.api.RequestApplyCoreUpdatesAPI;
+import org.apache.solr.handler.admin.api.RequestBufferUpdatesAPI;
+import org.apache.solr.handler.admin.api.RequestCoreRecoveryAPI;
+import org.apache.solr.handler.admin.api.RequestSyncShardAPI;
 import org.apache.solr.handler.admin.api.SingleCoreStatusAPI;
 import org.apache.solr.handler.admin.api.SplitCoreAPI;
 import org.apache.solr.handler.admin.api.SwapCoresAPI;
@@ -86,7 +92,6 @@ public class CoreAdminHandler extends RequestHandlerBase 
implements PermissionNa
   private static final Logger log = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   protected final CoreContainer coreContainer;
   protected final Map<String, Map<String, TaskObject>> requestStatusMap;
-  private final CoreAdminHandlerApi coreAdminHandlerApi;
 
   protected ExecutorService parallelExecutor = 
ExecutorUtil.newMDCAwareFixedThreadPool(50,
       new SolrNamedThreadFactory("parallelCoreAdminExecutor"));
@@ -109,7 +114,6 @@ public class CoreAdminHandler extends RequestHandlerBase 
implements PermissionNa
     map.put(COMPLETED, Collections.synchronizedMap(new LinkedHashMap<String, 
TaskObject>()));
     map.put(FAILED, Collections.synchronizedMap(new LinkedHashMap<String, 
TaskObject>()));
     requestStatusMap = Collections.unmodifiableMap(map);
-    coreAdminHandlerApi = new CoreAdminHandlerApi(this);
   }
 
 
@@ -125,7 +129,6 @@ public class CoreAdminHandler extends RequestHandlerBase 
implements PermissionNa
     map.put(COMPLETED, Collections.synchronizedMap(new LinkedHashMap<String, 
TaskObject>()));
     map.put(FAILED, Collections.synchronizedMap(new LinkedHashMap<String, 
TaskObject>()));
     requestStatusMap = Collections.unmodifiableMap(map);
-    coreAdminHandlerApi = new CoreAdminHandlerApi(this);
   }
 
 
@@ -427,8 +430,7 @@ public class CoreAdminHandler extends RequestHandlerBase 
implements PermissionNa
 
   @Override
   public Collection<Api> getApis() {
-    final List<Api> apis = Lists.newArrayList(coreAdminHandlerApi.getApis());
-    // Only some core-admin APIs use the v2 AnnotatedApi framework
+    final List<Api> apis = Lists.newArrayList();
     apis.addAll(AnnotatedApi.getApis(new AllCoresStatusAPI(this)));
     apis.addAll(AnnotatedApi.getApis(new SingleCoreStatusAPI(this)));
     apis.addAll(AnnotatedApi.getApis(new CreateCoreAPI(this)));
@@ -441,6 +443,14 @@ public class CoreAdminHandler extends RequestHandlerBase 
implements PermissionNa
     apis.addAll(AnnotatedApi.getApis(new UnloadCoreAPI(this)));
     apis.addAll(AnnotatedApi.getApis(new MergeIndexesAPI(this)));
     apis.addAll(AnnotatedApi.getApis(new SplitCoreAPI(this)));
+    apis.addAll(AnnotatedApi.getApis(new RequestCoreCommandStatusAPI(this)));
+    // Internal APIs
+    apis.addAll(AnnotatedApi.getApis(new RequestCoreRecoveryAPI(this)));
+    apis.addAll(AnnotatedApi.getApis(new PrepareCoreRecoveryAPI(this)));
+    apis.addAll(AnnotatedApi.getApis(new RequestApplyCoreUpdatesAPI(this)));
+    apis.addAll(AnnotatedApi.getApis(new RequestSyncShardAPI(this)));
+    apis.addAll(AnnotatedApi.getApis(new RequestBufferUpdatesAPI(this)));
+
     return apis;
   }
 
diff --git 
a/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandlerApi.java 
b/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandlerApi.java
deleted file mode 100644
index ca14ba2..0000000
--- a/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandlerApi.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.EnumMap;
-import java.util.Map;
-
-import org.apache.solr.client.solrj.request.ApiMapping.CommandMeta;
-import org.apache.solr.client.solrj.request.ApiMapping.V2EndPoint;
-import org.apache.solr.client.solrj.request.CoreApiMapping;
-import org.apache.solr.request.SolrQueryRequest;
-import org.apache.solr.response.SolrQueryResponse;
-
-public class CoreAdminHandlerApi extends BaseHandlerApiSupport {
-  private final CoreAdminHandler handler;
-  static Collection<ApiCommand> apiCommands = createMapping();
-
-  private static Collection<ApiCommand> createMapping() {
-    Map<CoreApiMapping.Meta, ApiCommand> result = new 
EnumMap<>(CoreApiMapping.Meta.class);
-
-    for (CoreApiMapping.Meta meta : CoreApiMapping.Meta.values()) {
-
-      for (CoreAdminOperation op : CoreAdminOperation.values()) {
-        if (op.action == meta.action) {
-          result.put(meta, new ApiCommand() {
-            @Override
-            public CommandMeta meta() {
-              return meta;
-            }
-
-            @Override
-            public void invoke(SolrQueryRequest req, SolrQueryResponse rsp, 
BaseHandlerApiSupport apiHandler) throws Exception {
-              op.execute(new CoreAdminHandler.CallInfo(((CoreAdminHandlerApi) 
apiHandler).handler,
-                  req,
-                  rsp,
-                  op));
-            }
-          });
-        }
-      }
-    }
-
-    for (CoreApiMapping.Meta meta : CoreApiMapping.Meta.values()) {
-      if (result.get(meta) == null) {
-        throw new RuntimeException("No implementation for " + meta.name());
-      }
-    }
-
-    return result.values();
-  }
-
-  public CoreAdminHandlerApi(CoreAdminHandler handler) {
-    this.handler = handler;
-  }
-
-
-  @Override
-  protected Collection<ApiCommand> getCommands() {
-    return apiCommands;
-  }
-
-  @Override
-  protected Collection<V2EndPoint> getEndPoints() {
-    return Arrays.asList(CoreApiMapping.EndPoint.values());
-  }
-
-
-}
diff --git 
a/solr/core/src/java/org/apache/solr/handler/admin/api/PrepareCoreRecoveryAPI.java
 
b/solr/core/src/java/org/apache/solr/handler/admin/api/PrepareCoreRecoveryAPI.java
new file mode 100644
index 0000000..29cd5cc
--- /dev/null
+++ 
b/solr/core/src/java/org/apache/solr/handler/admin/api/PrepareCoreRecoveryAPI.java
@@ -0,0 +1,66 @@
+/*
+ * 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.client.solrj.request.beans.PrepareCoreRecoveryPayload;
+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.CoreAdminParams.ACTION;
+import static org.apache.solr.common.params.CoreAdminParams.CORE;
+import static 
org.apache.solr.common.params.CoreAdminParams.CoreAdminAction.PREPRECOVERY;
+import static org.apache.solr.handler.ClusterAPI.wrapParams;
+import static 
org.apache.solr.security.PermissionNameProvider.Name.CORE_EDIT_PERM;
+
+/**
+ * Internal V2 API used to prepare a core for recovery.
+ *
+ * Only valid in SolrCloud mode.  This API (POST /v2/cores/coreName 
{'prep-recovery': {...}}) is analogous to the v1
+ * /admin/cores?action=PREPRECOVERY command.
+ *
+ * @see PrepareCoreRecoveryPayload
+ */
+@EndPoint(path = {"/cores/{core}"},
+        method = POST,
+        permission = CORE_EDIT_PERM)
+public class PrepareCoreRecoveryAPI {
+    public static final String V2_PREP_RECOVERY_CMD = "prep-recovery";
+
+    private final CoreAdminHandler coreAdminHandler;
+
+    public PrepareCoreRecoveryAPI(CoreAdminHandler coreAdminHandler) {
+        this.coreAdminHandler = coreAdminHandler;
+    }
+
+    @Command(name = V2_PREP_RECOVERY_CMD)
+    public void prepareCoreForRecovery(PayloadObj<PrepareCoreRecoveryPayload> 
obj) throws Exception {
+        final PrepareCoreRecoveryPayload v2Body = obj.get();
+        final Map<String, Object> v1Params = v2Body.toMap(new HashMap<>());
+        v1Params.put(ACTION, PREPRECOVERY.name().toLowerCase(Locale.ROOT));
+        v1Params.put(CORE, 
obj.getRequest().getPathTemplateValues().get("core"));
+
+        coreAdminHandler.handleRequestBody(wrapParams(obj.getRequest(), 
v1Params), obj.getResponse());
+    }
+}
diff --git 
a/solr/core/src/java/org/apache/solr/handler/admin/api/RequestApplyCoreUpdatesAPI.java
 
b/solr/core/src/java/org/apache/solr/handler/admin/api/RequestApplyCoreUpdatesAPI.java
new file mode 100644
index 0000000..db89f5f
--- /dev/null
+++ 
b/solr/core/src/java/org/apache/solr/handler/admin/api/RequestApplyCoreUpdatesAPI.java
@@ -0,0 +1,66 @@
+/*
+ * 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.client.solrj.request.beans.RequestApplyCoreUpdatesPayload;
+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.CoreAdminParams.ACTION;
+import static 
org.apache.solr.common.params.CoreAdminParams.CoreAdminAction.REQUESTAPPLYUPDATES;
+import static org.apache.solr.common.params.CoreAdminParams.NAME;
+import static org.apache.solr.handler.ClusterAPI.wrapParams;
+import static 
org.apache.solr.security.PermissionNameProvider.Name.CORE_EDIT_PERM;
+
+/**
+ * Internal V2 API used to apply updates to a core.
+ *
+ * Only valid in SolrCloud mode.  This API (POST /v2/cores/coreName 
{'request-apply-updates': {}}) is analogous to the v1
+ * /admin/cores?action=REQUESTAPPLYUPDATES command.
+ *
+ * @see 
org.apache.solr.client.solrj.request.beans.RequestApplyCoreUpdatesPayload
+ */
+@EndPoint(path = {"/cores/{core}"},
+        method = POST,
+        permission = CORE_EDIT_PERM)
+public class RequestApplyCoreUpdatesAPI {
+    public static final String V2_APPLY_CORE_UPDATES_CMD = 
"request-apply-updates";
+
+    private final CoreAdminHandler coreAdminHandler;
+
+    public RequestApplyCoreUpdatesAPI(CoreAdminHandler coreAdminHandler) {
+        this.coreAdminHandler = coreAdminHandler;
+    }
+
+    @Command(name = V2_APPLY_CORE_UPDATES_CMD)
+    public void 
requestApplyCoreUpdates(PayloadObj<RequestApplyCoreUpdatesPayload> obj) throws 
Exception {
+        final RequestApplyCoreUpdatesPayload v2Body = obj.get();
+        final Map<String, Object> v1Params = v2Body.toMap(new HashMap<>());
+        v1Params.put(ACTION, 
REQUESTAPPLYUPDATES.name().toLowerCase(Locale.ROOT));
+        v1Params.put(NAME, 
obj.getRequest().getPathTemplateValues().get("core"));
+
+        coreAdminHandler.handleRequestBody(wrapParams(obj.getRequest(), 
v1Params), obj.getResponse());
+    }
+}
diff --git 
a/solr/core/src/java/org/apache/solr/handler/admin/api/RequestBufferUpdatesAPI.java
 
b/solr/core/src/java/org/apache/solr/handler/admin/api/RequestBufferUpdatesAPI.java
new file mode 100644
index 0000000..579339a
--- /dev/null
+++ 
b/solr/core/src/java/org/apache/solr/handler/admin/api/RequestBufferUpdatesAPI.java
@@ -0,0 +1,66 @@
+/*
+ * 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.client.solrj.request.beans.RequestBufferUpdatesPayload;
+import org.apache.solr.common.params.CoreAdminParams;
+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.CoreAdminParams.ACTION;
+import static 
org.apache.solr.common.params.CoreAdminParams.CoreAdminAction.REQUESTBUFFERUPDATES;
+import static org.apache.solr.handler.ClusterAPI.wrapParams;
+import static 
org.apache.solr.security.PermissionNameProvider.Name.CORE_EDIT_PERM;
+
+/**
+ * Internal V2 API used to start update-buffering on the specified core.
+ *
+ * Only valid in SolrCloud mode.  This API (POST /v2/cores/coreName 
{'request-buffer-updates': {}}) is analogous to the v1
+ * /admin/cores?action=REQUESTBUFFERUPDATES command.
+ *
+ * @see org.apache.solr.client.solrj.request.beans.RequestSyncShardPayload
+ */
+@EndPoint(path = {"/cores/{core}"},
+        method = POST,
+        permission = CORE_EDIT_PERM)
+public class RequestBufferUpdatesAPI {
+    public static final String V2_REQUEST_BUFFER_UPDATES_CMD = 
"request-buffer-updates";
+
+    private final CoreAdminHandler coreAdminHandler;
+
+    public RequestBufferUpdatesAPI(CoreAdminHandler coreAdminHandler) {
+        this.coreAdminHandler = coreAdminHandler;
+    }
+
+    @Command(name = V2_REQUEST_BUFFER_UPDATES_CMD)
+    public void requestBufferUpdates(PayloadObj<RequestBufferUpdatesPayload> 
obj) throws Exception {
+        final RequestBufferUpdatesPayload v2Body = obj.get();
+        final Map<String, Object> v1Params = v2Body.toMap(new HashMap<>());
+        v1Params.put(ACTION, 
REQUESTBUFFERUPDATES.name().toLowerCase(Locale.ROOT));
+        v1Params.put(CoreAdminParams.NAME, 
obj.getRequest().getPathTemplateValues().get("core"));
+
+        coreAdminHandler.handleRequestBody(wrapParams(obj.getRequest(), 
v1Params), obj.getResponse());
+    }
+}
diff --git 
a/solr/core/src/java/org/apache/solr/handler/admin/api/RequestCoreCommandStatusAPI.java
 
b/solr/core/src/java/org/apache/solr/handler/admin/api/RequestCoreCommandStatusAPI.java
new file mode 100644
index 0000000..ee7cce1
--- /dev/null
+++ 
b/solr/core/src/java/org/apache/solr/handler/admin/api/RequestCoreCommandStatusAPI.java
@@ -0,0 +1,62 @@
+/*
+ * 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 com.google.common.collect.Maps;
+import org.apache.solr.api.EndPoint;
+import org.apache.solr.common.params.CoreAdminParams;
+import org.apache.solr.handler.admin.CoreAdminHandler;
+import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.response.SolrQueryResponse;
+
+import java.util.Locale;
+import java.util.Map;
+
+import static org.apache.solr.client.solrj.SolrRequest.METHOD.GET;
+import static org.apache.solr.common.params.CollectionParams.ACTION;
+import static org.apache.solr.handler.ClusterAPI.wrapParams;
+import static 
org.apache.solr.security.PermissionNameProvider.Name.CORE_READ_PERM;
+
+/**
+ * V2 API for checking the status of a core-level asynchronous command.
+ *
+ * This API (GET /v2/cores/command-status/someId is analogous to the v1 
/admin/cores?action=REQUESTSTATUS command.  It is
+ * not to be confused with the more robust asynchronous command support 
offered under the v2 `/cluster/command-status`
+ * path (or the corresponding v1 path 
`/solr/admin/collections?action=REQUESTSTATUS`).  Async support at the core 
level
+ * differs in that command IDs are local to individual Solr nodes and are not 
persisted across restarts.
+ *
+ * @see org.apache.solr.client.solrj.request.beans.RequestSyncShardPayload
+ */
+public class RequestCoreCommandStatusAPI {
+
+    private final CoreAdminHandler coreAdminHandler;
+
+    public RequestCoreCommandStatusAPI(CoreAdminHandler coreAdminHandler) {
+        this.coreAdminHandler = coreAdminHandler;
+    }
+
+    @EndPoint(method = GET,
+            path = "/cores/{core}/command-status/{id}",
+            permission = CORE_READ_PERM)
+    public void getCommandStatus(SolrQueryRequest req, SolrQueryResponse rsp) 
throws Exception {
+        final Map<String, Object> v1Params = Maps.newHashMap();
+        v1Params.put(ACTION, 
CoreAdminParams.CoreAdminAction.REQUESTSTATUS.name().toLowerCase(Locale.ROOT));
+        v1Params.put(CoreAdminParams.REQUESTID, 
req.getPathTemplateValues().get("id"));
+        coreAdminHandler.handleRequestBody(wrapParams(req, v1Params), rsp);
+    }
+}
diff --git 
a/solr/core/src/java/org/apache/solr/handler/admin/api/RequestCoreRecoveryAPI.java
 
b/solr/core/src/java/org/apache/solr/handler/admin/api/RequestCoreRecoveryAPI.java
new file mode 100644
index 0000000..a476fd9
--- /dev/null
+++ 
b/solr/core/src/java/org/apache/solr/handler/admin/api/RequestCoreRecoveryAPI.java
@@ -0,0 +1,66 @@
+/*
+ * 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.client.solrj.request.beans.RequestCoreRecoveryPayload;
+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.CoreAdminParams.ACTION;
+import static org.apache.solr.common.params.CoreAdminParams.CORE;
+import static 
org.apache.solr.common.params.CoreAdminParams.CoreAdminAction.REQUESTRECOVERY;
+import static org.apache.solr.handler.ClusterAPI.wrapParams;
+import static 
org.apache.solr.security.PermissionNameProvider.Name.CORE_EDIT_PERM;
+
+/**
+ * Internal V2 API triggering recovery on a core.
+ *
+ * Only valid in SolrCloud mode.  This API (POST /v2/cores/coreName 
{'request-recovery': {}}) is analogous to the v1
+ * /admin/cores?action=REQUESTRECOVERY command.
+ *
+ * @see RequestCoreRecoveryPayload
+ */
+@EndPoint(path = {"/cores/{core}"},
+        method = POST,
+        permission = CORE_EDIT_PERM)
+public class RequestCoreRecoveryAPI {
+    public static final String V2_REQUEST_RECOVERY_CMD = "request-recovery";
+
+    private final CoreAdminHandler coreAdminHandler;
+
+    public RequestCoreRecoveryAPI(CoreAdminHandler coreAdminHandler) {
+        this.coreAdminHandler = coreAdminHandler;
+    }
+
+    @Command(name = V2_REQUEST_RECOVERY_CMD)
+    public void requestCoreRecovery(PayloadObj<RequestCoreRecoveryPayload> 
obj) throws Exception {
+        final RequestCoreRecoveryPayload v2Body = obj.get();
+        final Map<String, Object> v1Params = v2Body.toMap(new HashMap<>());
+        v1Params.put(ACTION, REQUESTRECOVERY.name().toLowerCase(Locale.ROOT));
+        v1Params.put(CORE, 
obj.getRequest().getPathTemplateValues().get("core"));
+
+        coreAdminHandler.handleRequestBody(wrapParams(obj.getRequest(), 
v1Params), obj.getResponse());
+    }
+}
diff --git 
a/solr/core/src/java/org/apache/solr/handler/admin/api/RequestSyncShardAPI.java 
b/solr/core/src/java/org/apache/solr/handler/admin/api/RequestSyncShardAPI.java
new file mode 100644
index 0000000..e37f65b
--- /dev/null
+++ 
b/solr/core/src/java/org/apache/solr/handler/admin/api/RequestSyncShardAPI.java
@@ -0,0 +1,66 @@
+/*
+ * 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.client.solrj.request.beans.RequestSyncShardPayload;
+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.CoreAdminParams.ACTION;
+import static org.apache.solr.common.params.CoreAdminParams.CORE;
+import static 
org.apache.solr.common.params.CoreAdminParams.CoreAdminAction.REQUESTSYNCSHARD;
+import static org.apache.solr.handler.ClusterAPI.wrapParams;
+import static 
org.apache.solr.security.PermissionNameProvider.Name.CORE_EDIT_PERM;
+
+/**
+ * Internal V2 API used to request a core sync with its shard leader.
+ *
+ * Only valid in SolrCloud mode.  This API (POST /v2/cores/coreName 
{'request-sync-shard': {}}) is analogous to the v1
+ * /admin/cores?action=REQUESTSYNCSHARD command.
+ *
+ * @see org.apache.solr.client.solrj.request.beans.RequestSyncShardPayload
+ */
+@EndPoint(path = {"/cores/{core}"},
+        method = POST,
+        permission = CORE_EDIT_PERM)
+public class RequestSyncShardAPI {
+    public static final String V2_REQUEST_SYNC_SHARD_CMD = 
"request-sync-shard";
+
+    private final CoreAdminHandler coreAdminHandler;
+
+    public RequestSyncShardAPI(CoreAdminHandler coreAdminHandler) {
+        this.coreAdminHandler = coreAdminHandler;
+    }
+
+    @Command(name = V2_REQUEST_SYNC_SHARD_CMD)
+    public void requestSyncShard(PayloadObj<RequestSyncShardPayload> obj) 
throws Exception {
+        final RequestSyncShardPayload v2Body = obj.get();
+        final Map<String, Object> v1Params = v2Body.toMap(new HashMap<>());
+        v1Params.put(ACTION, REQUESTSYNCSHARD.name().toLowerCase(Locale.ROOT));
+        v1Params.put(CORE, 
obj.getRequest().getPathTemplateValues().get("core"));
+
+        coreAdminHandler.handleRequestBody(wrapParams(obj.getRequest(), 
v1Params), obj.getResponse());
+    }
+}
diff --git 
a/solr/core/src/test/org/apache/solr/handler/admin/api/V2CoreAPIMappingTest.java
 
b/solr/core/src/test/org/apache/solr/handler/admin/api/V2CoreAPIMappingTest.java
index 7dbd3f7..0f83e16 100644
--- 
a/solr/core/src/test/org/apache/solr/handler/admin/api/V2CoreAPIMappingTest.java
+++ 
b/solr/core/src/test/org/apache/solr/handler/admin/api/V2CoreAPIMappingTest.java
@@ -21,6 +21,7 @@ import com.google.common.collect.Maps;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.api.Api;
 import org.apache.solr.api.ApiBag;
+import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.params.UpdateParams;
 import org.apache.solr.common.util.CommandOperation;
@@ -80,6 +81,12 @@ public class V2CoreAPIMappingTest extends SolrTestCaseJ4 {
         apiBag.registerObject(new UnloadCoreAPI(mockCoreHandler));
         apiBag.registerObject(new MergeIndexesAPI(mockCoreHandler));
         apiBag.registerObject(new SplitCoreAPI(mockCoreHandler));
+        apiBag.registerObject(new RequestCoreRecoveryAPI(mockCoreHandler));
+        apiBag.registerObject(new PrepareCoreRecoveryAPI(mockCoreHandler));
+        apiBag.registerObject(new RequestApplyCoreUpdatesAPI(mockCoreHandler));
+        apiBag.registerObject(new RequestSyncShardAPI(mockCoreHandler));
+        apiBag.registerObject(new RequestBufferUpdatesAPI(mockCoreHandler));
+        apiBag.registerObject(new 
RequestCoreCommandStatusAPI(mockCoreHandler));
     }
 
     @Test
@@ -173,6 +180,75 @@ public class V2CoreAPIMappingTest extends SolrTestCaseJ4 {
         assertTrue(targetCoreEntries.containsAll(List.of("core1", "core2")));
     }
 
+    @Test
+    public void testRequestCoreRecoveryAllParams() throws Exception {
+        final SolrParams v1Params = 
captureConvertedV1Params("/cores/coreName", "POST",
+                "{\"request-recovery\": {}}");
+
+        assertEquals("requestrecovery", v1Params.get(ACTION));
+        assertEquals("coreName", v1Params.get(CORE));
+    }
+
+    @Test
+    public void testPrepareCoreRecoveryAllParams() throws Exception {
+        final SolrParams v1Params = 
captureConvertedV1Params("/cores/coreName", "POST",
+                "{\"prep-recovery\": {" +
+                        "\"nodeName\": \"someNodeName\", " +
+                        "\"coreNodeName\": \"someCoreNodeName\", " +
+                        "\"state\": \"someState\", " +
+                        "\"checkLive\": true, " +
+                        "\"onlyIfLeader\": true" +
+                        "\"onlyIfLeaderActive\": true " +
+                        "}}");
+
+        assertEquals("preprecovery", v1Params.get(ACTION));
+        assertEquals("coreName", v1Params.get(CORE));
+        assertEquals("someNodeName", v1Params.get("nodeName"));
+        assertEquals("someCoreNodeName", v1Params.get(CORE_NODE_NAME));
+        assertEquals("someState", v1Params.get(ZkStateReader.STATE_PROP));
+        assertEquals(true, v1Params.getPrimitiveBool("checkLive"));
+        assertEquals(true, v1Params.getPrimitiveBool("onlyIfLeader"));
+        assertEquals(true, v1Params.getPrimitiveBool("onlyIfLeaderActive"));
+    }
+
+    @Test
+    public void testApplyCoreUpdatesAllParams() throws Exception {
+        final SolrParams v1Params = 
captureConvertedV1Params("/cores/coreName", "POST",
+                "{\"request-apply-updates\": {}}");
+
+        assertEquals("requestapplyupdates", v1Params.get(ACTION));
+        assertEquals("coreName", v1Params.get(NAME));
+    }
+
+    @Test
+    public void testSyncShardAllParams() throws Exception {
+        final SolrParams v1Params = 
captureConvertedV1Params("/cores/coreName", "POST",
+                "{\"request-sync-shard\": {}}");
+
+        assertEquals("requestsyncshard", v1Params.get(ACTION));
+        assertEquals("coreName", v1Params.get(CORE));
+    }
+
+    @Test
+    public void testRequestBufferUpdatesAllParams() throws Exception {
+        final SolrParams v1Params = 
captureConvertedV1Params("/cores/coreName", "POST",
+                "{\"request-buffer-updates\": {}}");
+
+        assertEquals("requestbufferupdates", v1Params.get(ACTION));
+        assertEquals("coreName", v1Params.get(NAME));
+    }
+
+    // Strictly speaking, this API isn't at the /cores/coreName path, but as 
the only API at its path
+    // (/cores/coreName/command-status/requestId) it doesn't merit its own 
test class.
+    @Test
+    public void testRequestCommandStatusAllParams() throws Exception {
+        final SolrParams v1Params = 
captureConvertedV1Params("/cores/coreName/command-status/someId", "GET",
+                null);
+
+        assertEquals("requeststatus", v1Params.get(ACTION));
+        assertEquals("someId", v1Params.get(REQUESTID));
+    }
+
     private SolrParams captureConvertedV1Params(String path, String method, 
String v2RequestBody) throws Exception {
         final HashMap<String, String> parts = new HashMap<>();
         final Api api = apiBag.lookup(path, method, parts);
diff --git 
a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CoreApiMapping.java 
b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CoreApiMapping.java
deleted file mode 100644
index fbd8444..0000000
--- 
a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CoreApiMapping.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * 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.request;
-
-
-import org.apache.solr.client.solrj.SolrRequest;
-import org.apache.solr.client.solrj.request.ApiMapping.CommandMeta;
-import org.apache.solr.common.params.CoreAdminParams.CoreAdminAction;
-
-import java.util.Collections;
-import java.util.Map;
-
-import static org.apache.solr.client.solrj.SolrRequest.METHOD.GET;
-import static org.apache.solr.client.solrj.SolrRequest.METHOD.POST;
-import static org.apache.solr.client.solrj.request.CoreApiMapping.EndPoint.*;
-
-/** stores the mapping of v1 API parameters to v2 API parameters
- * for core admin API
- *
- */
-public class CoreApiMapping {
-  public enum Meta implements CommandMeta {
-    PREPRECOVERY(PER_CORE_COMMANDS, POST, CoreAdminAction.PREPRECOVERY, 
"prep-recovery", null),
-    REQUESTRECOVERY(PER_CORE_COMMANDS, POST, CoreAdminAction.REQUESTRECOVERY, 
"request-recovery", null),
-    REQUESTSYNCSHARD(PER_CORE_COMMANDS, POST, 
CoreAdminAction.REQUESTSYNCSHARD, "request-sync-shard", null),
-    REQUESTBUFFERUPDATES(PER_CORE_COMMANDS, POST, 
CoreAdminAction.REQUESTBUFFERUPDATES, "request-buffer-updates", null),
-    REQUESTAPPLYUPDATES(PER_CORE_COMMANDS, POST, 
CoreAdminAction.REQUESTAPPLYUPDATES, "request-apply-updates", null),
-    REQUESTSTATUS(PER_CORE_COMMANDS, GET, CoreAdminAction.REQUESTSTATUS, 
"request-status", null)/*TODO*/;
-
-    public final String commandName;
-    public final EndPoint endPoint;
-    public final SolrRequest.METHOD method;
-    public final CoreAdminAction action;
-    public final Map<String, String> paramstoAttr;
-
-    Meta(EndPoint endPoint, SolrRequest.METHOD method, CoreAdminAction action, 
String commandName,
-         Map<String,String> paramstoAttr) {
-      this.commandName = commandName;
-      this.endPoint = endPoint;
-      this.method = method;
-      this.paramstoAttr = paramstoAttr == null ? Collections.emptyMap() : 
paramstoAttr; // expect this to be immutable
-      this.action = action;
-    }
-
-    @Override
-    public String getName() {
-      return commandName;
-    }
-
-    @Override
-    public SolrRequest.METHOD getHttpMethod() {
-      return method;
-    }
-
-    @Override
-    public ApiMapping.V2EndPoint getEndPoint() {
-      return endPoint;
-    }
-
-    @Override
-    public String getParamSubstitute(String param) {
-      return paramstoAttr.containsKey(param) ? paramstoAttr.get(param) : param;
-    }
-  }
-
-  public enum EndPoint implements ApiMapping.V2EndPoint {
-    PER_CORE_COMMANDS("cores.core.Commands");
-
-    final String specName;
-
-    EndPoint(String specName) {
-      this.specName = specName;
-    }
-
-    @Override
-    public String getSpecName() {
-      return specName;
-    }
-  }
-}
diff --git 
a/solr/solrj/src/java/org/apache/solr/client/solrj/request/beans/PrepareCoreRecoveryPayload.java
 
b/solr/solrj/src/java/org/apache/solr/client/solrj/request/beans/PrepareCoreRecoveryPayload.java
new file mode 100644
index 0000000..788576f
--- /dev/null
+++ 
b/solr/solrj/src/java/org/apache/solr/client/solrj/request/beans/PrepareCoreRecoveryPayload.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.request.beans;
+
+import org.apache.solr.common.annotation.JsonProperty;
+import org.apache.solr.common.util.ReflectMapWriter;
+
+public class PrepareCoreRecoveryPayload implements ReflectMapWriter {
+    @JsonProperty
+    public String nodeName;
+
+    @JsonProperty
+    public String coreNodeName;
+
+    @JsonProperty
+    public String state;
+
+    @JsonProperty
+    public Boolean checkLive;
+
+    @JsonProperty
+    public Boolean onlyIfLeader;
+
+    @JsonProperty
+    public Boolean onlyIfLeaderActive;
+}
diff --git 
a/solr/solrj/src/java/org/apache/solr/client/solrj/request/beans/RequestApplyCoreUpdatesPayload.java
 
b/solr/solrj/src/java/org/apache/solr/client/solrj/request/beans/RequestApplyCoreUpdatesPayload.java
new file mode 100644
index 0000000..184b912
--- /dev/null
+++ 
b/solr/solrj/src/java/org/apache/solr/client/solrj/request/beans/RequestApplyCoreUpdatesPayload.java
@@ -0,0 +1,22 @@
+/*
+ * 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.request.beans;
+
+import org.apache.solr.common.util.ReflectMapWriter;
+
+public class RequestApplyCoreUpdatesPayload implements ReflectMapWriter {}
diff --git 
a/solr/solrj/src/java/org/apache/solr/client/solrj/request/beans/RequestBufferUpdatesPayload.java
 
b/solr/solrj/src/java/org/apache/solr/client/solrj/request/beans/RequestBufferUpdatesPayload.java
new file mode 100644
index 0000000..f2a08d2
--- /dev/null
+++ 
b/solr/solrj/src/java/org/apache/solr/client/solrj/request/beans/RequestBufferUpdatesPayload.java
@@ -0,0 +1,22 @@
+/*
+ * 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.request.beans;
+
+import org.apache.solr.common.util.ReflectMapWriter;
+
+public class RequestBufferUpdatesPayload implements ReflectMapWriter {}
diff --git 
a/solr/solrj/src/java/org/apache/solr/client/solrj/request/beans/RequestCoreRecoveryPayload.java
 
b/solr/solrj/src/java/org/apache/solr/client/solrj/request/beans/RequestCoreRecoveryPayload.java
new file mode 100644
index 0000000..241d271
--- /dev/null
+++ 
b/solr/solrj/src/java/org/apache/solr/client/solrj/request/beans/RequestCoreRecoveryPayload.java
@@ -0,0 +1,22 @@
+/*
+ * 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.request.beans;
+
+import org.apache.solr.common.util.ReflectMapWriter;
+
+public class RequestCoreRecoveryPayload implements ReflectMapWriter { }
diff --git 
a/solr/solrj/src/java/org/apache/solr/client/solrj/request/beans/RequestSyncShardPayload.java
 
b/solr/solrj/src/java/org/apache/solr/client/solrj/request/beans/RequestSyncShardPayload.java
new file mode 100644
index 0000000..b1fb8b9
--- /dev/null
+++ 
b/solr/solrj/src/java/org/apache/solr/client/solrj/request/beans/RequestSyncShardPayload.java
@@ -0,0 +1,22 @@
+/*
+ * 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.request.beans;
+
+import org.apache.solr.common.util.ReflectMapWriter;
+
+public class RequestSyncShardPayload implements ReflectMapWriter { }
diff --git a/solr/solrj/src/resources/apispec/cores.core.Commands.json 
b/solr/solrj/src/resources/apispec/cores.core.Commands.json
deleted file mode 100644
index 0afe981..0000000
--- a/solr/solrj/src/resources/apispec/cores.core.Commands.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
-  "documentation": "https://solr.apache.org/guide/coreadmin-api.html";,
-  "description": "Actions that are peformed on individual cores, such as 
reloading, swapping cores, renaming, and others.",
-  "methods": [
-    "POST"
-  ],
-  "url": {
-    "paths": [
-      "/cores/{core}"
-    ]
-  },
-  "commands": {
-    "request-recovery": {
-      "type":"object",
-      "documentation": 
"https://solr.apache.org/guide/coreadmin-api.html#coreadmin-requestrecovery";,
-      "description": "Manually asks a core to recover by synching with a 
leader. It may help SolrCloud clusters where a node refuses to come back up. 
However, it is considered an expert-level command, and should be used very 
carefully."
-    },
-    "force-prepare-for-leadership": {
-      "type": "object",
-      "description": "An internal API used by the Collections API to force 
leader election. This should not be used directly by end-users."
-    },
-    "prep-recovery": {
-      "type": "object",
-      "additionalProperties": true,
-      "description": "An internal API used by the Collections API. This should 
not be used directly by end-users."
-    },
-    "request-apply-updates": {
-      "type": "object",
-      "additionalProperties": true,
-      "description": "An internal API used by the Collections API. This should 
not be used directly by end-users."
-    },
-    "request-sync-shard": {
-      "type": "object",
-      "additionalProperties": true,
-      "description": "An internal API used by the Collections API. This should 
not be used directly by end-users."
-    },
-    "request-buffer-updates": {
-      "type": "object",
-      "additionalProperties": true,
-      "description": "An internal API used by the Collections API. This should 
not be used directly by end-users."
-    }
-  }
-}
diff --git 
a/solr/solrj/src/test/org/apache/solr/common/util/JsonValidatorTest.java 
b/solr/solrj/src/test/org/apache/solr/common/util/JsonValidatorTest.java
index e4c280e..86d01f9 100644
--- a/solr/solrj/src/test/org/apache/solr/common/util/JsonValidatorTest.java
+++ b/solr/solrj/src/test/org/apache/solr/common/util/JsonValidatorTest.java
@@ -25,7 +25,6 @@ import java.util.Map;
 public class JsonValidatorTest extends SolrTestCaseJ4  {
 
   public void testSchema() {
-    checkSchema("cores.core.Commands");
     checkSchema("cluster.security.BasicAuth.Commands");
     checkSchema("cluster.security.RuleBasedAuthorization");
     checkSchema("core.config.Commands");

Reply via email to