You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by no...@apache.org on 2016/02/02 14:37:54 UTC

lucene-solr git commit: SOLR-8029 refactored the SpecProvider API. Addressed a few test failures in async API calls

Repository: lucene-solr
Updated Branches:
  refs/heads/apiv2 b7e51075a -> 8b8c9461f


SOLR-8029 refactored the SpecProvider API. Addressed a few test failures in async API calls


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/8b8c9461
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/8b8c9461
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/8b8c9461

Branch: refs/heads/apiv2
Commit: 8b8c9461f296fb9c4f0f3e3ad9378d50a0244eb2
Parents: b7e5107
Author: Noble Paul <no...@apache.org>
Authored: Tue Feb 2 19:05:19 2016 +0530
Committer: Noble Paul <no...@apache.org>
Committed: Tue Feb 2 19:05:19 2016 +0530

----------------------------------------------------------------------
 .../org/apache/solr/core/CoreContainer.java     | 52 ------------------
 .../java/org/apache/solr/core/PluginBag.java    |  2 +-
 .../apache/solr/handler/RequestHandlerBase.java |  4 +-
 .../org/apache/solr/handler/SchemaHandler.java  |  7 +--
 .../apache/solr/handler/SolrConfigHandler.java  |  7 +--
 .../solr/handler/V2UpdateRequestHandler.java    | 11 ++--
 .../solr/handler/admin/CollectionsHandler.java  | 20 +++----
 .../solr/handler/admin/CoreAdminHandler.java    | 10 ++--
 .../apache/solr/handler/admin/InfoHandler.java  |  7 +--
 .../solr/handler/admin/SecurityConfHandler.java | 14 +++--
 .../solr/handler/admin/V2BaseHandler.java       |  9 ++--
 .../apache/solr/security/BasicAuthPlugin.java   |  4 +-
 .../security/RuleBasedAuthorizationPlugin.java  |  5 +-
 .../security/Sha256AuthenticationProvider.java  |  5 +-
 .../src/java/org/apache/solr/v2api/ApiBag.java  | 49 ++++++-----------
 .../org/apache/solr/v2api/SpecProvider.java     |  2 +-
 .../src/java/org/apache/solr/v2api/V2Api.java   |  2 +-
 .../org/apache/solr/v2api/V2ApiSupport.java     |  2 +-
 .../java/org/apache/solr/v2api/V2HttpCall.java  |  4 +-
 ...luster.security.RuleBasedAuthorization..json | 56 --------------------
 ...cluster.security.RuleBasedAuthorization.json | 56 ++++++++++++++++++++
 .../handler/admin/TestV2CollectionAPIs.java     |  9 ++--
 .../solr/handler/admin/TestV2CoreAdminAPIs.java |  2 +-
 .../solr/handler/admin/TestV2Framework.java     | 12 ++---
 24 files changed, 142 insertions(+), 209 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/core/CoreContainer.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/core/CoreContainer.java b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
index a9d429e..8430d77 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -19,10 +19,8 @@ package org.apache.solr.core;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.lang.invoke.MethodHandles;
 import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
@@ -68,17 +66,13 @@ import org.apache.solr.security.AuthorizationPlugin;
 import org.apache.solr.security.HttpClientInterceptorPlugin;
 import org.apache.solr.security.PKIAuthenticationPlugin;
 import org.apache.solr.security.SecurityPluginHolder;
-import org.apache.solr.servlet.SolrDispatchFilter;
 import org.apache.solr.update.UpdateShardHandler;
 import org.apache.solr.util.DefaultSolrThreadFactory;
 import org.apache.zookeeper.KeeperException;
-import org.apache.zookeeper.server.ByteBufferInputStream;
-import org.noggit.JSONParser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.util.Collections.EMPTY_MAP;
 import static org.apache.solr.common.params.CommonParams.AUTHC_PATH;
 import static org.apache.solr.common.params.CommonParams.AUTHZ_PATH;
@@ -1228,52 +1222,6 @@ public class CoreContainer {
     return authenticationPlugin == null ? null : authenticationPlugin.plugin;
   }
 
-  private Lookup<String, ByteBuffer> webappResourceLoader;
-
-  private Lookup<String, Map2> resourceLookup;
-
-  public synchronized Lookup<String, Map2> getResourceLookup() {
-    if (resourceLookup == null) {
-      resourceLookup = new Lookup<String, Map2>() {
-        @Override
-        public Map2 get(String key) {
-          return getResourceObject(key);
-        }
-      };
-    }
-    return resourceLookup;
-  }
-
-  private Map<String, Map2> resourceCache = new ConcurrentHashMap<>();
-
-  public Map2 getResourceObject(String name) {
-    if (name == null) throw new NullPointerException("name Cannot be null");
-    if (resourceCache.get(name) != null) return resourceCache.get(name);
-    Map2 map = getResource(name);
-    resourceCache.put(name, map);
-    return map;
-  }
-
-  public static Map2 getResource(String name) {
-    InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(name);
-//    ByteBuffer buf = webappResourceLoader.get(name);
-    if (is == null)
-      throw new RuntimeException("invalid API spec :" + name );
-    Map2 map1 = null;
-    try {
-      map1 = Map2.fromJSON(is);
-    } catch (Exception e) {
-      log.error("Error in JSON : " + name, e);
-      if (e instanceof RuntimeException) {
-        throw (RuntimeException) e;
-      }
-      throw new SolrException(ErrorCode.SERVER_ERROR, e);
-    }
-    if (map1 == null) throw new SolrException(ErrorCode.SERVER_ERROR, "Empty value for " + name);
-
-    return Map2.getDeepCopy(map1, 5, false);
-  }
-
 }
 
 class CloserThread extends Thread {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/core/PluginBag.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/core/PluginBag.java b/solr/core/src/java/org/apache/solr/core/PluginBag.java
index 4e45a39..cec8b9d 100644
--- a/solr/core/src/java/org/apache/solr/core/PluginBag.java
+++ b/solr/core/src/java/org/apache/solr/core/PluginBag.java
@@ -194,7 +194,7 @@ public class PluginBag<T> implements AutoCloseable {
       if (plugin.isLoaded()) {
         T inst = plugin.get();
         if (inst instanceof V2ApiSupport && ((V2ApiSupport) inst).registerAutomatically()) {
-          Collection<V2Api> apis = ((V2ApiSupport) inst).getApis(apiBag.getSpecLookup());
+          Collection<V2Api> apis = ((V2ApiSupport) inst).getApis();
           if (apis != null) {
             Map<String, String> nameSubstitutes = singletonMap(HANDLER_NAME, name);
             for (V2Api api : apis) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/handler/RequestHandlerBase.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/RequestHandlerBase.java b/solr/core/src/java/org/apache/solr/handler/RequestHandlerBase.java
index 17ce345..c16e02f 100644
--- a/solr/core/src/java/org/apache/solr/handler/RequestHandlerBase.java
+++ b/solr/core/src/java/org/apache/solr/handler/RequestHandlerBase.java
@@ -286,9 +286,9 @@ public abstract class RequestHandlerBase implements SolrRequestHandler, SolrInfo
   }
 
   @Override
-  public Collection<V2Api> getApis(Lookup<String, Map2> specLookup) {
+  public Collection<V2Api> getApis() {
     return ImmutableList.of(
-        wrapRequestHandler(this, ApiBag.constructSpec(pluginInfo,specLookup), null)
+        wrapRequestHandler(this, ApiBag.constructSpec(pluginInfo), null)
     );
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java b/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java
index 9aee57f..94d8276 100644
--- a/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java
@@ -42,6 +42,7 @@ import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.ManagedIndexSchema;
 import org.apache.solr.schema.SchemaManager;
 import org.apache.solr.schema.ZkIndexSchemaReader;
+import org.apache.solr.v2api.ApiBag;
 import org.apache.solr.v2api.V2Api;
 import org.apache.solr.v2api.V2ApiSupport;
 import org.slf4j.Logger;
@@ -191,10 +192,10 @@ public class SchemaHandler extends RequestHandlerBase implements V2ApiSupport {
   }
 
   @Override
-  public Collection<V2Api> getApis(Lookup<String, Map2> specLookup) {
+  public Collection<V2Api> getApis() {
     return ImmutableList.of(
-        wrapRequestHandler(this, specLookup.get("core.SchemaRead"), null) ,
-        wrapRequestHandler(this, specLookup.get("core.SchemaEdit"), null));
+        wrapRequestHandler(this, ApiBag.getSpec("core.SchemaRead"), null) ,
+        wrapRequestHandler(this, ApiBag.getSpec("core.SchemaEdit"), null));
   }
 
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
index cedc397..b7b2145 100644
--- a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
@@ -76,6 +76,7 @@ import org.apache.solr.schema.SchemaManager;
 import org.apache.solr.util.CommandOperation;
 import org.apache.solr.util.DefaultSolrThreadFactory;
 import org.apache.solr.util.RTimer;
+import org.apache.solr.v2api.ApiBag;
 import org.apache.solr.v2api.V2Api;
 import org.apache.solr.v2api.V2ApiSupport;
 import org.slf4j.Logger;
@@ -812,10 +813,10 @@ public class SolrConfigHandler extends RequestHandlerBase implements V2ApiSuppor
   }
 
   @Override
-  public Collection<V2Api> getApis(Lookup<String, Map2> specLookup) {
+  public Collection<V2Api> getApis() {
     return ImmutableList.of(
-        wrapRequestHandler(this, specLookup.get("core.ConfigRead"), null),
-        wrapRequestHandler(this, specLookup.get("core.ConfigEdit"), null)
+        wrapRequestHandler(this, ApiBag.getSpec("core.ConfigRead"), null),
+        wrapRequestHandler(this, ApiBag.getSpec("core.ConfigEdit"), null)
 
     );
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/handler/V2UpdateRequestHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/V2UpdateRequestHandler.java b/solr/core/src/java/org/apache/solr/handler/V2UpdateRequestHandler.java
index 6f603c8..2f89647 100644
--- a/solr/core/src/java/org/apache/solr/handler/V2UpdateRequestHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/V2UpdateRequestHandler.java
@@ -26,6 +26,7 @@ import com.google.common.collect.ImmutableMap;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.util.Lookup;
 import org.apache.solr.common.util.Map2;
+import org.apache.solr.v2api.ApiBag;
 import org.apache.solr.v2api.V2Api;
 import org.apache.solr.v2api.V2RequestContext;
 
@@ -39,19 +40,19 @@ public class V2UpdateRequestHandler extends UpdateRequestHandler  {
   }
 
   @Override
-  public Collection<V2Api> getApis(Lookup<String, Map2> specLookup) {
-    return Collections.singleton(getApiImpl(specLookup));
+  public Collection<V2Api> getApis() {
+    return Collections.singleton(getApiImpl());
   }
 
-  private V2Api getApiImpl(Lookup<String, Map2> specLookup) {
-    return new V2Api(specLookup.get("core.Update")) {
+  private V2Api getApiImpl() {
+    return new V2Api(ApiBag.getSpec("core.Update")) {
       @Override
       public void call(V2RequestContext ctx) {
         String path = ctx.getPath();
         String target =  mapping.get(path);
         if(target != null) ctx.getSolrRequest().getContext().put("path", target);
         try {
-          handleRequest(ctx.getSolrRequest(),ctx.getResponse());
+          handleRequest(ctx.getSolrRequest(), ctx.getResponse());
         } catch (RuntimeException e) {
           throw e;
         } catch (Exception e){

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
index 22ec758..d0f74c0 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
@@ -124,8 +124,6 @@ import org.apache.solr.common.params.CoreAdminParams;
 import org.apache.solr.common.params.CoreAdminParams.CoreAdminAction;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
-import org.apache.solr.common.util.Lookup;
-import org.apache.solr.common.util.Map2;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.common.util.Utils;
@@ -223,11 +221,15 @@ public class CollectionsHandler extends RequestHandlerBase implements V2ApiSuppo
           "Invalid request. collections can be accessed only in SolrCloud mode");
     }
 
-    Map<String, Object> result = operation.call(req, rsp, this);
-    if (result != null) {
-      result.put(QUEUE_OPERATION, operation.action.toLower());
-      ZkNodeProps props = new ZkNodeProps(result);
-      if (operation.sendToOCPQueue) handleResponse(operation.action.toLower(), props, rsp, operation.timeOut);
+    Map<String, Object> props = operation.call(req, rsp, this);
+    String asyncId = req.getParams().get(ASYNC);
+    if (props != null) {
+      if (asyncId != null) {
+        props.put(ASYNC, asyncId);
+      }
+      props.put(QUEUE_OPERATION, operation.action.toLower());
+      ZkNodeProps zkProps = new ZkNodeProps(props);
+      if (operation.sendToOCPQueue) handleResponse(operation.action.toLower(), zkProps, rsp, operation.timeOut);
       else Overseer.getInQueue(coreContainer.getZkController().getZkClient()).offer(Utils.toJSON(props));
     }
   }
@@ -895,8 +897,8 @@ public class CollectionsHandler extends RequestHandlerBase implements V2ApiSuppo
 
 
   @Override
-  public Collection<V2Api> getApis(Lookup<String, Map2> specLookup) {
-    return v2Handler.getApis(specLookup);
+  public Collection<V2Api> getApis() {
+    return v2Handler.getApis();
   }
 
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
----------------------------------------------------------------------
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 303cc9d..276658d 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
@@ -86,9 +86,9 @@ public class CoreAdminHandler extends RequestHandlerBase implements V2ApiSupport
     // should happen in the constructor...  
     this.coreContainer = null;
     HashMap<String, Map<String, TaskObject>> map = new HashMap<>(3, 1.0f);
-    map.put(RUNNING, Collections.synchronizedMap(new LinkedHashMap<String, TaskObject>()));
-    map.put(COMPLETED, Collections.synchronizedMap(new LinkedHashMap<String, TaskObject>()));
-    map.put(FAILED, Collections.synchronizedMap(new LinkedHashMap<String, TaskObject>()));
+    map.put(RUNNING, Collections.synchronizedMap(new LinkedHashMap<>()));
+    map.put(COMPLETED, Collections.synchronizedMap(new LinkedHashMap<>()));
+    map.put(FAILED, Collections.synchronizedMap(new LinkedHashMap<>()));
     requestStatusMap = Collections.unmodifiableMap(map);
     v2CoreAdminHandler = new V2CoreAdminHandler(this);
   }
@@ -366,8 +366,8 @@ public class CoreAdminHandler extends RequestHandlerBase implements V2ApiSupport
   }
 
   @Override
-  public Collection<V2Api> getApis(Lookup<String, Map2> specLookup) {
-    return v2CoreAdminHandler.getApis(specLookup);
+  public Collection<V2Api> getApis() {
+    return v2CoreAdminHandler.getApis();
   }
 
   static {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/handler/admin/InfoHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/InfoHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/InfoHandler.java
index d2108b9..a06e3d5 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/InfoHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/InfoHandler.java
@@ -32,6 +32,7 @@ import org.apache.solr.handler.RequestHandlerBase;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.SolrRequestHandler;
 import org.apache.solr.response.SolrQueryResponse;
+import org.apache.solr.v2api.ApiBag;
 import org.apache.solr.v2api.V2Api;
 import org.apache.solr.v2api.V2ApiSupport;
 import org.apache.solr.v2api.V2RequestContext;
@@ -111,7 +112,7 @@ public class InfoHandler extends RequestHandlerBase implements V2ApiSupport {
   }
 
   protected ThreadDumpHandler getThreadDumpHandler() {
-    return new ThreadDumpHandler();
+    return (ThreadDumpHandler) handlers.get("threads");
   }
 
   protected LoggingHandler getLoggingHandler() {
@@ -146,8 +147,8 @@ public class InfoHandler extends RequestHandlerBase implements V2ApiSupport {
   private Map<String, RequestHandlerBase> handlers = new ConcurrentHashMap<>();
 
   @Override
-  public Collection<V2Api> getApis(Lookup<String, Map2> specLookup) {
-    return Collections.singletonList(new V2Api(specLookup.get("node.Info")) {
+  public Collection<V2Api> getApis() {
+    return Collections.singletonList(new V2Api(ApiBag.getSpec("node.Info")) {
       @Override
       public void call(V2RequestContext ctx) {
         handle(ctx.getSolrRequest(), ctx.getResponse(), ctx.getPath());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandler.java
index 310ed1f..ea2c9ef 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandler.java
@@ -173,10 +173,8 @@ public class SecurityConfHandler extends RequestHandlerBase implements V2ApiSupp
   }
 
 
-  private ApiBag apiBag;
-
   @Override
-  public Collection<V2Api> getApis(Lookup<String, Map2> specLookup) {
+  public Collection<V2Api> getApis() {
     return
     ImmutableList.of(
         getApi("authentication"),
@@ -186,17 +184,17 @@ public class SecurityConfHandler extends RequestHandlerBase implements V2ApiSupp
   private V2Api getApi( String type) {
     return ApiBag.wrapRequestHandler(this, null, new SpecProvider() {
       @Override
-      public Map2 getSpec(Lookup<String, Map2> specLookup) {
+      public Map2 getSpec() {
         if (type.equals("authentication")) {
           AuthenticationPlugin plugin = cores.getAuthenticationPlugin();
-          if (plugin == null || !(plugin instanceof SpecProvider)) return specLookup.get("cluster.security.authentication");
-          return ((SpecProvider) plugin).getSpec(specLookup);
+          if (plugin == null || !(plugin instanceof SpecProvider)) return ApiBag.getSpec("cluster.security.authentication");
+          return ((SpecProvider) plugin).getSpec();
         } else {
           AuthorizationPlugin plugin = cores.getAuthorizationPlugin();
           if (plugin == null || !(plugin instanceof SpecProvider)){
-            return specLookup.get("cluster.security.authorization");
+            return ApiBag.getSpec("cluster.security.authorization");
           }
-          return ((SpecProvider) plugin).getSpec(specLookup);
+          return ((SpecProvider) plugin).getSpec();
 
         }
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/handler/admin/V2BaseHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/V2BaseHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/V2BaseHandler.java
index ed2f277..3b28c80 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/V2BaseHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/V2BaseHandler.java
@@ -37,6 +37,7 @@ import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.util.CommandOperation;
+import org.apache.solr.v2api.ApiBag;
 import org.apache.solr.v2api.V2Api;
 import org.apache.solr.v2api.V2ApiSupport;
 import org.apache.solr.v2api.V2RequestContext;
@@ -60,15 +61,15 @@ public abstract class V2BaseHandler implements V2ApiSupport {
   }
 
   @Override
-  public synchronized Collection<V2Api> getApis(Lookup<String, Map2> specLookup) {
+  public synchronized Collection<V2Api> getApis() {
     ImmutableList.Builder<V2Api> l = ImmutableList.builder();
-    for (V2EndPoint op : getEndPoints()) l.add(getApi(op, specLookup));
+    for (V2EndPoint op : getEndPoints()) l.add(getApi(op));
     return l.build();
   }
 
 
-  private V2Api getApi(final V2EndPoint op, Lookup<String, Map2> specLookup) {
-    final Map2 spec = specLookup.get(op.getSpecName());
+  private V2Api getApi(final V2EndPoint op) {
+    final Map2 spec = ApiBag.getSpec(op.getSpecName());
     return new V2Api(spec) {
       @Override
       public void call(V2RequestContext ctx) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java b/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
index 51c0db1..a041262 100644
--- a/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
@@ -171,8 +171,8 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
   }
 
   @Override
-  public Map2 getSpec(Lookup<String, Map2> specLookup) {
-    return zkAuthentication.getSpec(specLookup);
+  public Map2 getSpec() {
+    return zkAuthentication.getSpec();
   }
   public boolean getBlockUnknown(){
     return blockUnknown;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java b/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
index d928a54..49e335a 100644
--- a/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
@@ -39,6 +39,7 @@ import org.apache.solr.common.util.Lookup;
 import org.apache.solr.common.util.Map2;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.util.CommandOperation;
+import org.apache.solr.v2api.ApiBag;
 import org.apache.solr.v2api.SpecProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -503,8 +504,8 @@ public class RuleBasedAuthorizationPlugin implements AuthorizationPlugin, Config
   private Map2 spec;
 
   @Override
-  public Map2 getSpec(Lookup<String, Map2> specLookup) {
-    if(spec == null) spec = specLookup.get("cluster.security.RuleBasedAuthorization");
+  public Map2 getSpec() {
+    if(spec == null) spec = ApiBag.getSpec("cluster.security.RuleBasedAuthorization");
     return spec;
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java b/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
index 5b457b6..78d4e80 100644
--- a/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
+++ b/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
@@ -34,6 +34,7 @@ import org.apache.commons.codec.binary.Base64;
 import org.apache.solr.common.util.Lookup;
 import org.apache.solr.common.util.Map2;
 import org.apache.solr.util.CommandOperation;
+import org.apache.solr.v2api.ApiBag;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -156,8 +157,8 @@ public class Sha256AuthenticationProvider implements ConfigEditablePlugin,  Basi
   }
 
   @Override
-  public Map2 getSpec(Lookup<String, Map2> specLookup) {
-    return specLookup.get("cluster.security.BasicAuth");
+  public Map2 getSpec() {
+    return ApiBag.getSpec("cluster.security.BasicAuth");
   }
 
   static final Set<String> supported_ops = ImmutableSet.of("set-user", "delete-user");

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/v2api/ApiBag.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/v2api/ApiBag.java b/solr/core/src/java/org/apache/solr/v2api/ApiBag.java
index f33091d..9967999 100644
--- a/solr/core/src/java/org/apache/solr/v2api/ApiBag.java
+++ b/solr/core/src/java/org/apache/solr/v2api/ApiBag.java
@@ -28,13 +28,10 @@ import java.util.concurrent.ConcurrentHashMap;
 
 import com.google.common.collect.ImmutableSet;
 import org.apache.solr.common.SolrException;
-import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.util.Lookup;
 import org.apache.solr.common.util.Map2;
-import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.core.PluginBag;
 import org.apache.solr.core.PluginInfo;
-import org.apache.solr.handler.RequestHandlerBase;
 import org.apache.solr.request.SolrRequestHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,17 +45,6 @@ public class ApiBag {
   private static final Logger log = LoggerFactory.getLogger(ApiBag.class);
 
   private final Map<String, PathTrie<V2Api>> apis = new ConcurrentHashMap<>();
-  private final Lookup<String, Map2> specProvider;
-
-
-  public ApiBag() {
-    this.specProvider = new Lookup<String, Map2>() {
-      @Override
-      public Map2 get(String key) {
-        return getMap(key);
-      }
-    };
-  }
 
   public static Map2 getResource(String name) {
     InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(name);
@@ -85,7 +71,7 @@ public class ApiBag {
     try {
       validateAndRegister(api, nameSubstitutes);
     } catch (Exception e) {
-      log.error("Unable to register plugin:" + api.getClass().getName() + "with spec :" + api.getSpec(specProvider), e);
+      log.error("Unable to register plugin:" + api.getClass().getName() + "with spec :" + api.getSpec(), e);
       if (e instanceof RuntimeException) {
         throw (RuntimeException) e;
       } else {
@@ -96,8 +82,8 @@ public class ApiBag {
   }
 
   private void validateAndRegister(V2Api api, Map<String, String> nameSubstitutes) {
-    Map2 spec = api.getSpec(getSpecLookup());
-    V2Api introspect = getIntrospect(this, api);
+    Map2 spec = api.getSpec();
+    V2Api introspect = getIntrospect(api);
     List<String> methods = spec.getList("methods", ENUM_OF, SUPPORTED_METHODS);
     for (String method : methods) {
       PathTrie<V2Api> registry = apis.get(method);
@@ -122,7 +108,7 @@ public class ApiBag {
           pathMeta.get("type", ENUM_OF, ImmutableSet.of("enum", "string", "int", "number", "boolean"));
         }
       }
-      verifyCommands(api.getSpec(getSpecLookup()));
+      verifyCommands(api.getSpec());
       for (String path : paths) {
         registry.insert(path, nameSubstitutes, api);
         registry.insert(path + INTROSPECT, nameSubstitutes, introspect);
@@ -130,11 +116,11 @@ public class ApiBag {
     }
   }
 
-  private V2Api getIntrospect(final ApiBag apiBag, final V2Api baseApi) {
+  private V2Api getIntrospect(final V2Api baseApi) {
     return new V2Api(Map2.EMPTY) {
 
       @Override
-      public Map2 getSpec(Lookup<String, Map2> specLookup) {
+      public Map2 getSpec() {
         return INTROSPECT_SPEC;
       }
 
@@ -143,9 +129,9 @@ public class ApiBag {
         String cmd = ctx.getSolrRequest().getParams().get("command");
         Map2 result = null;
         if (cmd == null) {
-          result = baseApi.getSpec(apiBag.getSpecLookup());
+          result = baseApi.getSpec();
         } else {
-          Map2 specCopy = Map2.getDeepCopy(baseApi.getSpec(apiBag.getSpecLookup()), 5, true);
+          Map2 specCopy = Map2.getDeepCopy(baseApi.getSpec(), 5, true);
           Map2 commands = specCopy.getMap("commands", null);
           if (commands != null) {
             Map2 m = commands.getMap(cmd, null);
@@ -194,7 +180,7 @@ public class ApiBag {
     }
   }
 
-  private static Map2 getMap(String name) {
+  public static Map2 getSpec(String name) {
     Map2 map = getResource(APISPEC_LOCATION + name + ".json");
     Map2 result = map.getMap(name, NOT_NULL);
     Map2 cmds = result.getMap("commands", null);
@@ -227,10 +213,10 @@ public class ApiBag {
       }
 
       @Override
-      public Map2 getSpec(Lookup<String, Map2> specLookup) {
+      public Map2 getSpec() {
         return specProvider != null ?
-            specProvider.getSpec(specLookup) :
-            super.getSpec(specLookup);
+            specProvider.getSpec() :
+            super.getSpec();
       }
     };
   }
@@ -239,11 +225,6 @@ public class ApiBag {
   public static final String INTROSPECT = "/_introspect";
 
 
-  public Lookup<String, Map2> getSpecLookup() {
-    return specProvider;
-  }
-
-
   public static final Map2 INTROSPECT_SPEC = new Map2(Collections.EMPTY_MAP);
   public static final String HANDLER_NAME = "handlerName";
   public static final Set<String> KNOWN_TYPES = ImmutableSet.of("string", "boolean", "list", "int", "double");
@@ -255,18 +236,18 @@ public class ApiBag {
   public <T> void registerLazy(PluginBag.PluginHolder<SolrRequestHandler> holder, PluginInfo info) {
     String specName = info.attributes.get("spec");
     if (specName == null) specName = "emptySpec";
-    Map2 spec = getSpecLookup().get(specName);
+    Map2 spec = ApiBag.getSpec(specName);
     register(new LazyLoadedApi(spec, holder), Collections.singletonMap(HANDLER_NAME, info.attributes.get(NAME)));
   }
 
-  public static Map2 constructSpec(PluginInfo info, Lookup<String, Map2> specLookup) {
+  public static Map2 constructSpec(PluginInfo info) {
     Object specObj = info == null ? null : info.attributes.get("spec");
     if (specObj == null) specObj = "emptySpec";
     if (specObj instanceof Map) {
       Map map = (Map) specObj;
       return Map2.getDeepCopy(map, 4, false);
     } else {
-      return specLookup.get((String) specObj);
+      return ApiBag.getSpec((String) specObj);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/v2api/SpecProvider.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/v2api/SpecProvider.java b/solr/core/src/java/org/apache/solr/v2api/SpecProvider.java
index 0b4e81a..1cb8336 100644
--- a/solr/core/src/java/org/apache/solr/v2api/SpecProvider.java
+++ b/solr/core/src/java/org/apache/solr/v2api/SpecProvider.java
@@ -21,5 +21,5 @@ import org.apache.solr.common.util.Lookup;
 import org.apache.solr.common.util.Map2;
 
 public interface SpecProvider {
-  Map2 getSpec(Lookup<String, Map2> specLookup);
+  Map2 getSpec();
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/v2api/V2Api.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/v2api/V2Api.java b/solr/core/src/java/org/apache/solr/v2api/V2Api.java
index de7ca93..031a1cd 100644
--- a/solr/core/src/java/org/apache/solr/v2api/V2Api.java
+++ b/solr/core/src/java/org/apache/solr/v2api/V2Api.java
@@ -32,7 +32,7 @@ public abstract class V2Api implements SpecProvider {
   public abstract void call(V2RequestContext ctx);
 
   @Override
-  public Map2 getSpec(Lookup<String, Map2> specLookup) {
+  public Map2 getSpec() {
     return spec;
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/v2api/V2ApiSupport.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/v2api/V2ApiSupport.java b/solr/core/src/java/org/apache/solr/v2api/V2ApiSupport.java
index 6210f1a..fa86b7b 100644
--- a/solr/core/src/java/org/apache/solr/v2api/V2ApiSupport.java
+++ b/solr/core/src/java/org/apache/solr/v2api/V2ApiSupport.java
@@ -24,7 +24,7 @@ import org.apache.solr.common.util.Map2;
 
 public interface V2ApiSupport {
 
-  Collection<V2Api> getApis(Lookup<String, Map2> specLookup);
+  Collection<V2Api> getApis();
 
 
   default boolean registerAutomatically() {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/java/org/apache/solr/v2api/V2HttpCall.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/v2api/V2HttpCall.java b/solr/core/src/java/org/apache/solr/v2api/V2HttpCall.java
index 25f5e2b..67a6c12 100644
--- a/solr/core/src/java/org/apache/solr/v2api/V2HttpCall.java
+++ b/solr/core/src/java/org/apache/solr/v2api/V2HttpCall.java
@@ -198,7 +198,7 @@ public class V2HttpCall extends HttpSolrCall {
         return getSubPathImpl(subpaths, fullPath);
       }
     }
-    if (api.getSpec(requestHandlers.getApiBag().getSpecLookup()) == ApiBag.INTROSPECT_SPEC)
+    if (api.getSpec() == ApiBag.INTROSPECT_SPEC)
       api = mergeIntrospect(requestHandlers, path, method, parts);
     return api;
   }
@@ -324,7 +324,7 @@ public class V2HttpCall extends HttpSolrCall {
           if (contentStreams == null) throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No content stream");
           for (ContentStream contentStream : contentStreams) {
             parsedCommands = getCommandOperations(new InputStreamReader((InputStream) contentStream, UTF_8),
-                api.getSpec(cores.getRequestHandlers().getApiBag().getSpecLookup()), solrResp);
+                api.getSpec(), solrResp);
 
           }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/resources/v2apispec/cluster.security.RuleBasedAuthorization..json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/v2apispec/cluster.security.RuleBasedAuthorization..json b/solr/core/src/resources/v2apispec/cluster.security.RuleBasedAuthorization..json
deleted file mode 100644
index d914e73..0000000
--- a/solr/core/src/resources/v2apispec/cluster.security.RuleBasedAuthorization..json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
-  "cluster.security.RuleBasedAuthorization.": {
-    "documentation": "https://cwiki.apache.org",
-    "methods": [
-      "POST",
-      "GET"
-    ],
-    "url": {
-      "paths": [
-        "/cluster/security/authorization"
-      ]
-    },
-    "commands": {
-      "set-permission": {
-        "description": "create a new permission, overwrite an existing permission definition, or assign a pre-defined permission to a role.",
-        "properties": {
-          "name":{
-            "type":"string",
-            "description":""
-          },
-          "method":{
-            "type":"string",
-            "description":""
-          },
-
-          "collection":{
-            "type":"list",
-            "description":""
-          },
-
-          "path":{
-            "type":"list",
-            "description":""
-          },
-          "before":{
-            "type":"string",
-            "description":""
-          },
-          "params":{
-            "type":"object",
-            "properties":{},
-            "additionalProperties":true,
-            "description":""
-          }
-        },
-        "required":["name","role"]
-      },
-      "set-user-role": {
-        "description": "A single command allows roles to be mapped to users. To remove a user's permission, you should set the role to null. The key is always a user id and the value is one or more role names",
-        "properties":{},
-        "additionalProperties":true
-
-      }
-    }
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/resources/v2apispec/cluster.security.RuleBasedAuthorization.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/v2apispec/cluster.security.RuleBasedAuthorization.json b/solr/core/src/resources/v2apispec/cluster.security.RuleBasedAuthorization.json
new file mode 100644
index 0000000..4d28fec
--- /dev/null
+++ b/solr/core/src/resources/v2apispec/cluster.security.RuleBasedAuthorization.json
@@ -0,0 +1,56 @@
+{
+  "cluster.security.RuleBasedAuthorization": {
+    "documentation": "https://cwiki.apache.org",
+    "methods": [
+      "POST",
+      "GET"
+    ],
+    "url": {
+      "paths": [
+        "/cluster/security/authorization"
+      ]
+    },
+    "commands": {
+      "set-permission": {
+        "description": "create a new permission, overwrite an existing permission definition, or assign a pre-defined permission to a role.",
+        "properties": {
+          "name":{
+            "type":"string",
+            "description":""
+          },
+          "method":{
+            "type":"string",
+            "description":""
+          },
+
+          "collection":{
+            "type":"list",
+            "description":""
+          },
+
+          "path":{
+            "type":"list",
+            "description":""
+          },
+          "before":{
+            "type":"string",
+            "description":""
+          },
+          "params":{
+            "type":"object",
+            "properties":{},
+            "additionalProperties":true,
+            "description":""
+          }
+        },
+        "required":["name","role"]
+      },
+      "set-user-role": {
+        "description": "A single command allows roles to be mapped to users. To remove a user's permission, you should set the role to null. The key is always a user id and the value is one or more role names",
+        "properties":{},
+        "additionalProperties":true
+
+      }
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/test/org/apache/solr/handler/admin/TestV2CollectionAPIs.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/TestV2CollectionAPIs.java b/solr/core/src/test/org/apache/solr/handler/admin/TestV2CollectionAPIs.java
index 2c3c34a..8f87352 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/TestV2CollectionAPIs.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/TestV2CollectionAPIs.java
@@ -54,7 +54,7 @@ public class TestV2CollectionAPIs extends SolrTestCaseJ4 {
   public void testCreate() throws Exception{
     MockCollectionsHandler collectionsHandler = new MockCollectionsHandler();
     ApiBag apiBag = new ApiBag();
-    Collection<V2Api> apis = collectionsHandler.getApis(apiBag.getSpecLookup());
+    Collection<V2Api> apis = collectionsHandler.getApis();
     for (V2Api api : apis) apiBag.register(api, Collections.EMPTY_MAP);
     //test a simple create collection call
     V2RequestContext ctx = makeCall(apiBag, "/collections", SolrRequest.METHOD.POST,
@@ -78,13 +78,12 @@ public class TestV2CollectionAPIs extends SolrTestCaseJ4 {
     V2Api api = apiBag.lookup(path, method.toString(), parts);
     if (api == null) throw new RuntimeException("No handler at path :" + path);
     LocalSolrQueryRequest req = new LocalSolrQueryRequest(null, new MapSolrParams(new HashMap<String, String>()));
-    V2RequestContext ctx = getV2RequestContext(apiBag.getSpecLookup(), path, method, payload, cc, parts, api, req);
+    V2RequestContext ctx = getV2RequestContext(path, method, payload, cc, parts, api, req);
     api.call(ctx);
     return ctx;
   }
 
-  public static V2RequestContext getV2RequestContext(final Lookup<String,Map2> lookup,
-                                                     final String path,
+  public static V2RequestContext getV2RequestContext(final String path,
                                                      final SolrRequest.METHOD method,
                                                      final String payload,
                                                      final CoreContainer cc,
@@ -121,7 +120,7 @@ public class TestV2CollectionAPIs extends SolrTestCaseJ4 {
 
       @Override
       public List<CommandOperation> getCommands(boolean validateInput) {
-        return V2HttpCall.getCommandOperations(new StringReader(payload), api.getSpec(lookup), rsp);
+        return V2HttpCall.getCommandOperations(new StringReader(payload), api.getSpec(), rsp);
       }
 
       @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/test/org/apache/solr/handler/admin/TestV2CoreAdminAPIs.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/TestV2CoreAdminAPIs.java b/solr/core/src/test/org/apache/solr/handler/admin/TestV2CoreAdminAPIs.java
index 36ebc99..aeee949 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/TestV2CoreAdminAPIs.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/TestV2CoreAdminAPIs.java
@@ -47,7 +47,7 @@ public class TestV2CoreAdminAPIs extends SolrTestCaseJ4 {
 
     CoreAdminHandler  coreAdminHandler = new CoreAdminHandler(mockCC);
     ApiBag apiBag = new ApiBag();
-    for (V2Api v2Api : coreAdminHandler.getApis(apiBag.getSpecLookup())) {
+    for (V2Api v2Api : coreAdminHandler.getApis()) {
       apiBag.register(v2Api, Collections.EMPTY_MAP);
     }
     TestV2CollectionAPIs.makeCall(apiBag,"/cores", SolrRequest.METHOD.POST ,

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8b8c9461/solr/core/src/test/org/apache/solr/handler/admin/TestV2Framework.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/TestV2Framework.java b/solr/core/src/test/org/apache/solr/handler/admin/TestV2Framework.java
index 5dd4376..81104c8 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/TestV2Framework.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/TestV2Framework.java
@@ -64,14 +64,12 @@ public class TestV2Framework extends SolrTestCaseJ4 {
     coreHandlers.put("/config", new SolrConfigHandler());
     coreHandlers.put("/admin/ping", new PingRequestHandler());
 
-    Lookup<String, Map2> lookup = coreHandlers.getApiBag().getSpecLookup();
-
     Map<String, String> parts = new HashMap<>();
     String fullPath = "/collections/hello/shards";
     V2Api api = V2HttpCall.getApiInfo(containerHandlers, fullPath, "GET",
         mockCC, "collections", fullPath, parts);
     assertNotNull(api);
-    assertConditions(api.getSpec(null), Utils.makeMap(
+    assertConditions(api.getSpec(), Utils.makeMap(
         "/methods[0]", "GET",
         "/methods[1]", "POST",
         "/commands/create", NOT_NULL));
@@ -80,7 +78,7 @@ public class TestV2Framework extends SolrTestCaseJ4 {
     parts = new HashMap<>();
     api = V2HttpCall.getApiInfo(containerHandlers, "/collections/hello/shards/shard1", "GET",
         mockCC, "collections", null, parts);
-    assertConditions(api.getSpec(null), Utils.makeMap(
+    assertConditions(api.getSpec(), Utils.makeMap(
         "/methods[0]", "POST",
         "/methods[1]", "GET",
         "/methods[2]", "DELETE",
@@ -95,7 +93,7 @@ public class TestV2Framework extends SolrTestCaseJ4 {
     parts = new HashMap<>();
     api = V2HttpCall.getApiInfo(containerHandlers, "/collections/hello/shards/shard1/replica1", "GET",
         mockCC, "collections", null, parts);
-    assertConditions(api.getSpec(null), Utils.makeMap(
+    assertConditions(api.getSpec(), Utils.makeMap(
         "/methods[0]", "GET",
         "/methods[1]", "POST",
         "/commands/set", NOT_NULL
@@ -106,7 +104,7 @@ public class TestV2Framework extends SolrTestCaseJ4 {
 
     api = V2HttpCall.getApiInfo(containerHandlers, "/collections/hello/shards/shard1/replica1", "DELETE",
         mockCC, "collections", null, parts);
-    assertConditions(api.getSpec(null), Utils.makeMap(
+    assertConditions(api.getSpec(), Utils.makeMap(
         "/methods[0]", "DELETE",
         "/url/params/onlyIfDown/type", "boolean"
     ));
@@ -157,7 +155,7 @@ public class TestV2Framework extends SolrTestCaseJ4 {
 
     V2Api api = V2HttpCall.getApiInfo(reqHandlers, path, "GET", mockCC, prefix, fullPath, parts);
     LocalSolrQueryRequest req = new LocalSolrQueryRequest(null, new MapSolrParams(new HashMap<>()));
-    V2RequestContext ctx = getV2RequestContext(reqHandlers.getApiBag().getSpecLookup() , path, method, null, mockCC, parts, api, req);
+    V2RequestContext ctx = getV2RequestContext( path, method, null, mockCC, parts, api, req);
     api.call(ctx);
     return ctx.getResponse();