You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by cs...@apache.org on 2018/02/21 11:43:00 UTC

[incubator-openwhisk] branch master updated: Remove API for listing all entities in namespace (#3167)

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

csantanapr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk.git


The following commit(s) were added to refs/heads/master by this push:
     new 51e853f  Remove API for listing all entities in namespace (#3167)
51e853f is described below

commit 51e853f54a15cb8c7b36dd84ca72f365d2b1ec32
Author: rodric rabbah <ro...@gmail.com>
AuthorDate: Wed Feb 21 03:42:56 2018 -0800

    Remove API for listing all entities in namespace (#3167)
---
 .../main/scala/whisk/core/entity/WhiskStore.scala  | 46 +---------
 .../src/main/resources/apiv1swagger.json           | 68 ---------------
 .../scala/whisk/core/controller/Namespaces.scala   | 97 ++--------------------
 .../scala/whisk/core/controller/RestAPIs.scala     |  7 +-
 tests/src/test/scala/common/BaseWsk.scala          |  3 -
 tests/src/test/scala/common/Wsk.scala              |  4 +-
 tests/src/test/scala/common/rest/WskRest.scala     | 20 +----
 tests/src/test/scala/services/HeadersTests.scala   | 16 ----
 .../core/controller/test/NamespacesApiTests.scala  | 69 +++------------
 .../scala/whisk/core/entity/test/ViewTests.scala   | 38 +++------
 10 files changed, 36 insertions(+), 332 deletions(-)

diff --git a/common/scala/src/main/scala/whisk/core/entity/WhiskStore.scala b/common/scala/src/main/scala/whisk/core/entity/WhiskStore.scala
index d69f9d7..0a1417e 100644
--- a/common/scala/src/main/scala/whisk/core/entity/WhiskStore.scala
+++ b/common/scala/src/main/scala/whisk/core/entity/WhiskStore.scala
@@ -165,33 +165,19 @@ protected[core] class View(ddoc: String, view: String) {
  * This object provides some utilities that query the whisk datastore.
  * The datastore is assumed to have views (pre-computed joins or indexes)
  * for each of the whisk collection types. Entities may be queries by
- * [namespace, date, name] where
+ * [path, date] where
  *
- * - namespace is the either root namespace for an entity (the owning subject
+ * - path is the either root namespace for an entity (the owning subject
  *   or organization) or a packaged qualified namespace,
  * - date is the date the entity was created or last updated, or for activations
  *   this is the start of the activation. See EntityRecord for the last updated
  *   property.
- * - name is the actual name of the entity (its simple name, not qualified by
- *   a package name)
  *
  * This order is important because the datastore is assumed to sort lexicographically
  * and hence either the fields are ordered according to the set of queries that are
  * desired: all entities in a namespace (by type), further refined by date, further
  * refined by name.
  *
- * In addition, for entities that may be queried across namespaces (currently
- * packages only), there must be a view which omits the namespace from the key,
- * as in [date, name] only. This permits the same queries that work for a collection
- * in a namespace to also work across namespaces.
- *
- * It is also assumed that the "-all" views implement a meaningful reduction for the
- * collection. Namely, the packages-all view will reduce the results to packages that
- * are public.
- *
- * The names of the views are assumed to be either the collection name, or
- * the collection name suffixed with "-all" per the method viewname. All of
- * the required views are installed by wipeTransientDBs.sh.
  */
 object WhiskEntityQueries {
   val TOP = "\ufff0"
@@ -201,34 +187,6 @@ object WhiskEntityQueries {
 
   /** The view name for the collection, within the design document. */
   def view(ddoc: String = designDoc, collection: String) = new View(ddoc, collection)
-
-  /**
-   * Name of view in design-doc that lists all entities in that views regardless of types.
-   * This is uses in the namespace API, and also in tests to check preconditions.
-   */
-  lazy val viewAll: View = view(ddoc = s"all-$designDoc", collection = "all")
-
-  /**
-   * Queries the datastore for all entities in a namespace, and converts the list of entities
-   * to a map that collects the entities by their type. This method applies to only to the main
-   * asset database, not the activations records because it does not offer the required view.
-   */
-  def listAllInNamespace[A <: WhiskEntity](
-    db: ArtifactStore[A],
-    namespace: EntityName,
-    includeDocs: Boolean,
-    stale: StaleParameter = StaleParameter.No)(implicit transid: TransactionId): Future[Map[String, List[JsObject]]] = {
-    implicit val ec = db.executionContext
-    val startKey = List(namespace.asString)
-    val endKey = List(namespace.asString, TOP)
-    db.query(viewAll.name, startKey, endKey, 0, 0, includeDocs, descending = true, reduce = false, stale = stale) map {
-      _ map { row =>
-        val value = row.fields("value").asJsObject
-        val JsString(collection) = value.fields("collection")
-        (collection, JsObject(value.fields.filterNot { _._1 == "collection" }))
-      } groupBy { _._1 } mapValues { _.map(_._2) }
-    }
-  }
 }
 
 trait WhiskEntityQueries[T] {
diff --git a/core/controller/src/main/resources/apiv1swagger.json b/core/controller/src/main/resources/apiv1swagger.json
index 81636a5..599330b 100644
--- a/core/controller/src/main/resources/apiv1swagger.json
+++ b/core/controller/src/main/resources/apiv1swagger.json
@@ -60,74 +60,6 @@
                 }
             }
         },
-        "/namespaces/{namespace}": {
-            "get": {
-                "tags": [
-                    "Namespaces"
-                ],
-                "description": "Get all entities in a namespace",
-                "summary": "Get all entities in a namespace",
-                "operationId": "getAllEntitiesInNamespace",
-                "parameters": [
-                    {
-                        "name": "namespace",
-                        "in": "path",
-                        "description": "The namespace",
-                        "required": true,
-                        "type": "string"
-                    }
-                ],
-                "produces": [
-                    "application/json"
-                ],
-                "responses": {
-                    "200": {
-                        "description": "All entities",
-                        "schema": {
-                            "type": "object",
-                            "required": [
-                                "actions",
-                                "triggers",
-                                "rules",
-                                "packages"
-                            ],
-                            "properties": {
-                                "actions": {
-                                    "type": "array",
-                                    "items": {
-                                        "$ref": "#/definitions/EntityBrief"
-                                    }
-                                },
-                                "triggers": {
-                                    "type": "array",
-                                    "items": {
-                                        "$ref": "#/definitions/EntityBrief"
-                                    }
-                                },
-                                "rules": {
-                                    "type": "array",
-                                    "items": {
-                                        "$ref": "#/definitions/EntityBrief"
-                                    }
-                                },
-                                "packages": {
-                                    "type": "array",
-                                    "items": {
-                                        "$ref": "#/definitions/EntityBrief"
-                                    }
-                                }
-                            }
-                        }
-                    },
-                    "401": {
-                        "$ref": "#/responses/UnauthorizedRequest"
-                    },
-                    "500": {
-                        "$ref": "#/responses/ServerError"
-                    }
-                }
-            }
-        },
         "/namespaces/{namespace}/actions": {
             "get": {
                 "tags": [
diff --git a/core/controller/src/main/scala/whisk/core/controller/Namespaces.scala b/core/controller/src/main/scala/whisk/core/controller/Namespaces.scala
index b1c407a..0afbb40 100644
--- a/core/controller/src/main/scala/whisk/core/controller/Namespaces.scala
+++ b/core/controller/src/main/scala/whisk/core/controller/Namespaces.scala
@@ -17,38 +17,18 @@
 
 package whisk.core.controller
 
-import scala.concurrent.Future
-import scala.util.Failure
-import scala.util.Success
 import akka.http.scaladsl.model.StatusCodes._
 import akka.http.scaladsl.server.Directives
-import akka.http.scaladsl.server.RequestContext
-import akka.http.scaladsl.server.RouteResult
 import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
 import spray.json.DefaultJsonProtocol._
 import whisk.common.TransactionId
-import whisk.core.entitlement.{Collection, Privilege, Resource}
-import whisk.core.entitlement.Privilege.READ
-import whisk.core.entity.EntityPath
+import whisk.core.entitlement.Collection
 import whisk.core.entity.Identity
-import whisk.core.entity.WhiskAction
-import whisk.core.entity.WhiskEntityQueries.listAllInNamespace
-import whisk.core.entity.WhiskPackage
-import whisk.core.entity.WhiskRule
-import whisk.core.entity.WhiskTrigger
-import whisk.core.entity.types.EntityStore
-import whisk.http.ErrorResponse.terminate
 
-trait WhiskNamespacesApi
-    extends Directives
-    with AuthenticatedRouteProvider
-    with BasicAuthorizedRouteProvider
-    with ReadOps {
+trait WhiskNamespacesApi extends Directives with AuthenticatedRouteProvider {
 
-  protected override val collection = Collection(Collection.NAMESPACES)
-
-  /** Database service to lookup entities in a namespace. */
-  protected val entityStore: EntityStore
+  protected val collection = Collection(Collection.NAMESPACES)
+  protected val collectionOps = pathEndOrSingleSlash & get
 
   /** JSON response formatter. */
   import RestApiCommons.jsonDefaultResponsePrinter
@@ -56,76 +36,13 @@ trait WhiskNamespacesApi
   /**
    * Rest API for managing namespaces. Defines all the routes handled by this API. They are:
    *
-   * GET  namespaces[/] -- gets namespaces for authenticated user
-   * GET  namespaces/_[/] -- gets all entities in implicit namespace
-   * GET  namespaces/namespace[/] -- gets all entities in explicit namespace
+   * GET  namespaces[/] -- gets namespace for authenticated user
    *
    * @param user the authenticated user for this route
    */
   override def routes(user: Identity)(implicit transid: TransactionId) = {
-    pathPrefix(collection.path) {
-      (collectionOps & requestMethod) { m =>
-        getNamespaces(user)
-      } ~ (entityOps & entityPrefix & pathEndOrSingleSlash & requestMethod) { (segment, m) =>
-        namespace(user, segment) { ns =>
-          val resource = Resource(ns, collection, None)
-          authorizeAndDispatch(m, user, resource)
-        }
-      }
-    }
-  }
-
-  /**
-   * GET  / -- gets namespaces for authenticated user
-   * GET  /namespace -- gets all entities in namespace
-   *
-   * The namespace of the resource is derived from the authenticated user. The
-   * resource entity name, if it is defined, may be a different namespace.
-   */
-  protected override def dispatchOp(user: Identity, op: Privilege, resource: Resource)(
-    implicit transid: TransactionId) = {
-    resource.entity match {
-      case None if op == READ => getAllInNamespace(resource.namespace)
-      case _                  => reject // should not get here
-    }
-  }
-
-  /**
-   * Gets all entities in namespace.
-   *
-   * Responses are one of (Code, Message)
-   * - 200 Map [ String (collection name), List[EntitySummary] ] as JSON
-   * - 500 Internal Server Error
-   */
-  private def getAllInNamespace(namespace: EntityPath)(
-    implicit transid: TransactionId): RequestContext => Future[RouteResult] = {
-    onComplete(listAllInNamespace(entityStore, namespace.root, false)) {
-      case Success(entities) => {
-        complete(OK, Namespaces.emptyNamespace ++ entities)
-      }
-      case Failure(t) =>
-        logging.error(this, s"[GET] namespaces failed: ${t.getMessage}")
-        terminate(InternalServerError)
+    (pathPrefix(collection.path) & collectionOps) {
+      complete(OK, List(user.namespace))
     }
   }
-
-  /**
-   * Gets namespaces for subject from entitlement service.
-   *
-   * Responses are one of (Code, Message)
-   * - 200 [ Namespaces (as String) ] as JSON
-   * - 401 Unauthorized
-   * - 500 Internal Server Error
-   */
-  private def getNamespaces(user: Identity)(implicit transid: TransactionId) = {
-    complete(OK, List(user.namespace))
-  }
-}
-
-object Namespaces {
-  val emptyNamespace = Map(
-    WhiskAction.collectionName -> List(),
-    WhiskPackage.collectionName -> List(),
-    WhiskRule.collectionName -> List(),
-    WhiskTrigger.collectionName -> List())
 }
diff --git a/core/controller/src/main/scala/whisk/core/controller/RestAPIs.scala b/core/controller/src/main/scala/whisk/core/controller/RestAPIs.scala
index 3c2ac46..afb9d13 100644
--- a/core/controller/src/main/scala/whisk/core/controller/RestAPIs.scala
+++ b/core/controller/src/main/scala/whisk/core/controller/RestAPIs.scala
@@ -229,12 +229,7 @@ class RestAPIVersion(config: WhiskConfig, apiPath: String, apiVersion: String)(
   private val rules = new RulesApi(apiPath, apiVersion)
   private val web = new WebActionsApi(Seq("web"), new WebApiDirectives())
 
-  class NamespacesApi(val apiPath: String, val apiVersion: String)(
-    implicit override val entityStore: EntityStore,
-    override val entitlementProvider: EntitlementProvider,
-    override val executionContext: ExecutionContext,
-    override val logging: Logging)
-      extends WhiskNamespacesApi
+  class NamespacesApi(val apiPath: String, val apiVersion: String) extends WhiskNamespacesApi
 
   class ActionsApi(val apiPath: String, val apiVersion: String)(
     implicit override val actorSystem: ActorSystem,
diff --git a/tests/src/test/scala/common/BaseWsk.scala b/tests/src/test/scala/common/BaseWsk.scala
index 775bfe0..228ef40 100644
--- a/tests/src/test/scala/common/BaseWsk.scala
+++ b/tests/src/test/scala/common/BaseWsk.scala
@@ -304,9 +304,6 @@ trait BaseNamespace extends BaseRunWsk {
   def list(expectedExitCode: Int = SUCCESS_EXIT, nameSort: Option[Boolean] = None)(implicit wp: WskProps): RunResult
 
   def whois()(implicit wskprops: WskProps): String
-
-  def get(namespace: Option[String] = None, expectedExitCode: Int, nameSort: Option[Boolean] = None)(
-    implicit wp: WskProps): RunResult
 }
 
 trait BaseApi extends BaseRunWsk {
diff --git a/tests/src/test/scala/common/Wsk.scala b/tests/src/test/scala/common/Wsk.scala
index 1192e6e..44d5c95 100644
--- a/tests/src/test/scala/common/Wsk.scala
+++ b/tests/src/test/scala/common/Wsk.scala
@@ -716,7 +716,7 @@ class WskNamespace() extends RunWskCmd with FullyQualifiedNames with BaseNamespa
   protected val noun = "namespace"
 
   /**
-   * Lists available namespaces for whisk properties.
+   * Lists available namespaces for whisk key.
    *
    * @param expectedExitCode (optional) the expected exit code for the command
    * if the code is anything but DONTCARE_EXIT, assert the code is as expected
@@ -751,7 +751,7 @@ class WskNamespace() extends RunWskCmd with FullyQualifiedNames with BaseNamespa
    * @param expectedExitCode (optional) the expected exit code for the command
    * if the code is anything but DONTCARE_EXIT, assert the code is as expected
    */
-  override def get(namespace: Option[String] = None, expectedExitCode: Int, nameSort: Option[Boolean] = None)(
+  def get(namespace: Option[String] = None, expectedExitCode: Int, nameSort: Option[Boolean] = None)(
     implicit wp: WskProps): RunResult = {
     val params = {
       nameSort map { n =>
diff --git a/tests/src/test/scala/common/rest/WskRest.scala b/tests/src/test/scala/common/rest/WskRest.scala
index 6e30cd7..0b057ac 100644
--- a/tests/src/test/scala/common/rest/WskRest.scala
+++ b/tests/src/test/scala/common/rest/WskRest.scala
@@ -830,7 +830,7 @@ class WskRestNamespace extends RunWskRestCmd with BaseNamespace {
   protected val noun = "namespaces"
 
   /**
-   * Lists available namespaces for whisk properties.
+   * Lists available namespaces for whisk key.
    *
    * @param expectedExitCode (optional) the expected exit code for the command
    * if the code is anything but DONTCARE_EXIT, assert the code is as expected
@@ -845,24 +845,6 @@ class WskRestNamespace extends RunWskRestCmd with BaseNamespace {
   }
 
   /**
-   * Gets entities in namespace.
-   *
-   * @param namespace (optional) if specified must be  fully qualified namespace
-   * @param expectedExitCode (optional) the expected exit code for the command
-   * if the code is anything but DONTCARE_EXIT, assert the code is as expected
-   */
-  override def get(namespace: Option[String] = None,
-                   expectedExitCode: Int = OK.intValue,
-                   nameSort: Option[Boolean] = None)(implicit wp: WskProps): RestResult = {
-    val (ns, _) = namespace map { this.getNamespaceEntityName(_) } getOrElse (wp.namespace, "")
-    val entPath = Path(s"$basePath/namespaces/$ns/")
-    val resp = requestEntity(GET, entPath)
-    val r = new RestResult(resp.status, getRespData(resp))
-    validateStatusCode(expectedExitCode, r.statusCode.intValue)
-    r
-  }
-
-  /**
    * Looks up namespace for whisk props.
    *
    * @param wskprops instance of WskProps with an auth key to lookup
diff --git a/tests/src/test/scala/services/HeadersTests.scala b/tests/src/test/scala/services/HeadersTests.scala
index f3184c8..ab3792c 100644
--- a/tests/src/test/scala/services/HeadersTests.scala
+++ b/tests/src/test/scala/services/HeadersTests.scala
@@ -196,22 +196,6 @@ class HeadersTests extends FlatSpec with Matchers with ScalaFutures with WskActo
     containsHeaders(response.headers, Some(Set("GET")))
   }
 
-  it should "respond to OPTIONS for namespaces getEntities" in {
-    val path = basePath / "namespaces" / "barfoo"
-    val response = request(OPTIONS, url.withPath(path)).futureValue
-
-    response.status shouldBe OK
-    containsHeaders(response.headers, Some(Set("GET")))
-  }
-
-  it should "respond to GET for namespaces getEntities with Headers" in {
-    val path = basePath / "namespaces" / "_"
-    val response = request(GET, url.withPath(path), Some(List(Authorization(creds)))).futureValue
-
-    response.status shouldBe OK
-    containsHeaders(response.headers)
-  }
-
   // Packages
   it should "respond to OPTIONS for listing packages" in {
     val path = basePath / "namespaces" / "barfoo" / "packages"
diff --git a/tests/src/test/scala/whisk/core/controller/test/NamespacesApiTests.scala b/tests/src/test/scala/whisk/core/controller/test/NamespacesApiTests.scala
index 39e0107..4cb2027 100644
--- a/tests/src/test/scala/whisk/core/controller/test/NamespacesApiTests.scala
+++ b/tests/src/test/scala/whisk/core/controller/test/NamespacesApiTests.scala
@@ -21,21 +21,14 @@ import org.junit.runner.RunWith
 import org.scalatest.junit.JUnitRunner
 
 import akka.http.scaladsl.model.StatusCodes.OK
-import akka.http.scaladsl.model.StatusCodes.Forbidden
-import akka.http.scaladsl.model.StatusCodes.MethodNotAllowed
+import akka.http.scaladsl.model.StatusCodes.NotFound
 import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport.sprayJsonUnmarshaller
 import akka.http.scaladsl.server.Route
 
 import spray.json.DefaultJsonProtocol._
-import spray.json._
 
-import whisk.core.controller.Namespaces
 import whisk.core.controller.WhiskNamespacesApi
 import whisk.core.entity.EntityPath
-import spray.json.JsObject
-import spray.json.JsObject
-import whisk.core.controller.Namespaces
-import spray.json.JsArray
 
 /**
  * Tests Namespaces API.
@@ -61,59 +54,21 @@ class NamespacesApiTests extends ControllerTestCommon with WhiskNamespacesApi {
 
   it should "list namespaces for subject" in {
     implicit val tid = transid()
-    Get(collectionPath) ~> Route.seal(routes(creds)) ~> check {
-      status should be(OK)
-      val ns = responseAs[List[EntityPath]]
-      ns should be(List(EntityPath(creds.subject.asString)))
+    Seq("", "/").foreach { p =>
+      Get(collectionPath + p) ~> Route.seal(routes(creds)) ~> check {
+        status should be(OK)
+        val ns = responseAs[List[EntityPath]]
+        ns should be(List(EntityPath(creds.subject.asString)))
+      }
     }
   }
 
-  it should "list namespaces for subject with trailing /" in {
+  it should "reject request for unsupported method" in {
     implicit val tid = transid()
-    Get(s"$collectionPath/") ~> Route.seal(routes(creds)) ~> check {
-      status should be(OK)
-      val ns = responseAs[List[EntityPath]]
-      ns should be(List(EntityPath(creds.subject.asString)))
-    }
-  }
-
-  it should "get namespace entities for subject" in {
-    implicit val tid = transid()
-    Get(s"$collectionPath/${creds.subject}") ~> Route.seal(routes(creds)) ~> check {
-      status should be(OK)
-      val ns = responseAs[JsObject]
-      ns should be(JsObject(Namespaces.emptyNamespace map { kv =>
-        (kv._1, JsArray())
-      }))
-    }
-  }
-
-  it should "reject get namespace entities for unauthorized subject" in {
-    implicit val tid = transid()
-    val anothercred = WhiskAuthHelpers.newIdentity()
-    Get(s"$collectionPath/${anothercred.subject}") ~> Route.seal(routes(creds)) ~> check {
-      status should be(Forbidden)
-    }
-  }
-
-  it should "reject request with put" in {
-    implicit val tid = transid()
-    Put(s"$collectionPath/${creds.subject}") ~> Route.seal(routes(creds)) ~> check {
-      status should be(MethodNotAllowed)
-    }
-  }
-
-  it should "reject request with post" in {
-    implicit val tid = transid()
-    Post(s"$collectionPath/${creds.subject}") ~> Route.seal(routes(creds)) ~> check {
-      status should be(MethodNotAllowed)
-    }
-  }
-
-  it should "reject request with delete" in {
-    implicit val tid = transid()
-    Delete(s"$collectionPath/${creds.subject}") ~> Route.seal(routes(creds)) ~> check {
-      status should be(MethodNotAllowed)
+    Seq(Get, Put, Post, Delete).foreach { m =>
+      m(s"$collectionPath/${creds.subject}") ~> Route.seal(routes(creds)) ~> check {
+        status should be(NotFound)
+      }
     }
   }
 }
diff --git a/tests/src/test/scala/whisk/core/entity/test/ViewTests.scala b/tests/src/test/scala/whisk/core/entity/test/ViewTests.scala
index 63f720d..ae4e509 100644
--- a/tests/src/test/scala/whisk/core/entity/test/ViewTests.scala
+++ b/tests/src/test/scala/whisk/core/entity/test/ViewTests.scala
@@ -34,7 +34,6 @@ import whisk.core.database.ArtifactStore
 import whisk.core.database.StaleParameter
 import whisk.core.database.test.DbUtils
 import whisk.core.entity._
-import whisk.core.entity.WhiskEntityQueries._
 
 @RunWith(classOf[JUnitRunner])
 class ViewTests
@@ -83,17 +82,6 @@ class ViewTests
 
   behavior of "Datastore View"
 
-  def getEntitiesInNamespace[Au <: WhiskEntity](entityStore: ArtifactStore[Au], ns: EntityPath)(
-    implicit entities: Seq[WhiskEntity]) = {
-    implicit val tid = transid()
-    val map = Await.result(listAllInNamespace(entityStore, ns.root, false, StaleParameter.No), dbOpTimeout)
-    val result = map.values.toList.flatten
-    val expected = entities filter (_.namespace.root.toPath == ns)
-    map.get(WhiskActivation.collectionName) should be(None)
-    result should have length expected.length
-    result should contain theSameElementsAs expected.map(_.summaryAsJson)
-  }
-
   def getAllActivationsInNamespace[Au <: WhiskEntity](store: ArtifactStore[Au], ns: EntityPath)(
     implicit entities: Seq[WhiskEntity]) = {
     implicit val tid = transid()
@@ -228,15 +216,6 @@ class ViewTests
     val actionName = aname()
     def now = Instant.now(Clock.systemUTC())
 
-    // creates 17 entities in each namespace as follows:
-    // - 2 actions in each namespace in the default namespace
-    // - 2 actions in the same package within a namespace
-    // - 1 action in two different packages in the same namespace
-    // - 1 action in package with prescribed name
-    // - 2 triggers in each namespace
-    // - 2 rules in each namespace
-    // - 2 packages in each namespace
-    // - 2 package bindings in each namespace
     implicit val entities = Seq(
       WhiskAction(namespace1, aname(), exec),
       WhiskAction(namespace1, aname(), exec),
@@ -269,10 +248,15 @@ class ViewTests
       WhiskPackage(namespace2, aname(), Some(Binding(namespace1.root, aname()))))
 
     entities foreach { put(entityStore, _) }
-    waitOnView(entityStore, namespace1.root, 15, WhiskEntityQueries.viewAll)
-    waitOnView(entityStore, namespace2.root, 14, WhiskEntityQueries.viewAll)
+    waitOnView(entityStore, namespace1.root, 7, WhiskAction.view)
+    waitOnView(entityStore, namespace1.root, 2, WhiskTrigger.view)
+    waitOnView(entityStore, namespace1.root, 2, WhiskRule.view)
+    waitOnView(entityStore, namespace1.root, 4, WhiskPackage.view)
+    waitOnView(entityStore, namespace2.root, 6, WhiskAction.view)
+    waitOnView(entityStore, namespace2.root, 2, WhiskTrigger.view)
+    waitOnView(entityStore, namespace2.root, 2, WhiskRule.view)
+    waitOnView(entityStore, namespace2.root, 4, WhiskPackage.view)
 
-    getEntitiesInNamespace(entityStore, namespace1)
     getKindInNamespace(entityStore, namespace1, "actions", {
       case (e: WhiskAction) => true
       case (_)              => false
@@ -298,7 +282,6 @@ class ViewTests
       case (_)              => false
     })
 
-    getEntitiesInNamespace(entityStore, namespace2)
     getKindInNamespace(entityStore, namespace2, "actions", {
       case (e: WhiskAction) => true
       case (_)              => false
@@ -425,7 +408,7 @@ class ViewTests
       })
   }
 
-  it should "query whisk and retrieve full documents" in {
+  it should "list actions and retrieve full documents" in {
     implicit val tid = transid()
     val actionName = aname()
     val now = Instant.now(Clock.systemUTC())
@@ -433,7 +416,8 @@ class ViewTests
       Seq(WhiskAction(namespace1, aname(), jsDefault("??")), WhiskAction(namespace1, aname(), jsDefault("??")))
 
     entities foreach { put(entityStore, _) }
-    waitOnView(entityStore, namespace1.root, entities.length, WhiskEntityQueries.viewAll)
+    waitOnView(entityStore, namespace1.root, 2, WhiskAction.view)
+
     getKindInNamespaceWithDoc[WhiskAction](namespace1, "actions", {
       case (e: WhiskAction) => true
       case (_)              => false

-- 
To stop receiving notification emails like this one, please contact
csantanapr@apache.org.