This is an automated email from the ASF dual-hosted git repository. rabbah 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 6711118 Adds method deleteAttachments to ArtifactStore (#3366) 6711118 is described below commit 6711118387281774c7015b51a763b31a47e94811 Author: Chetan Mehrotra <chet...@apache.org> AuthorDate: Wed Mar 7 00:19:59 2018 +0530 Adds method deleteAttachments to ArtifactStore (#3366) --- .../scala/whisk/core/database/ArtifactStore.scala | 5 +++++ .../scala/whisk/core/database/CouchDbRestStore.scala | 5 +++++ .../scala/whisk/core/database/DocumentFactory.scala | 14 ++++++++++++++ .../main/scala/whisk/core/entity/WhiskAction.scala | 18 ++++++++++++++++++ tests/build.gradle | 3 ++- .../scala/whisk/core/entity/test/DatastoreTests.scala | 19 ++++++++++++++++--- 6 files changed, 60 insertions(+), 4 deletions(-) diff --git a/common/scala/src/main/scala/whisk/core/database/ArtifactStore.scala b/common/scala/src/main/scala/whisk/core/database/ArtifactStore.scala index 33ea805..631f60a 100644 --- a/common/scala/src/main/scala/whisk/core/database/ArtifactStore.scala +++ b/common/scala/src/main/scala/whisk/core/database/ArtifactStore.scala @@ -129,6 +129,11 @@ trait ArtifactStore[DocumentAbstraction] { protected[core] def readAttachment[T](doc: DocInfo, name: String, sink: Sink[ByteString, Future[T]])( implicit transid: TransactionId): Future[(ContentType, T)] + /** + * Deletes all attachments linked to given document + */ + protected[core] def deleteAttachments[T](doc: DocInfo)(implicit transid: TransactionId): Future[Boolean] + /** Shut it down. After this invocation, every other call is invalid. */ def shutdown(): Unit } diff --git a/common/scala/src/main/scala/whisk/core/database/CouchDbRestStore.scala b/common/scala/src/main/scala/whisk/core/database/CouchDbRestStore.scala index efc03cc..d55db65 100644 --- a/common/scala/src/main/scala/whisk/core/database/CouchDbRestStore.scala +++ b/common/scala/src/main/scala/whisk/core/database/CouchDbRestStore.scala @@ -456,6 +456,11 @@ class CouchDbRestStore[DocumentAbstraction <: DocumentSerializer](dbProtocol: St ErrorLevel)) } + override protected[core] def deleteAttachments[T](doc: DocInfo)(implicit transid: TransactionId): Future[Boolean] = + // NOTE: this method is not intended for standalone use for CouchDB. + // To delete attachments, it is expected that the entire document is deleted. + Future.successful(true) + override def shutdown(): Unit = { Await.ready(client.shutdown(), 1.minute) } diff --git a/common/scala/src/main/scala/whisk/core/database/DocumentFactory.scala b/common/scala/src/main/scala/whisk/core/database/DocumentFactory.scala index 59e0487..b6e346b 100644 --- a/common/scala/src/main/scala/whisk/core/database/DocumentFactory.scala +++ b/common/scala/src/main/scala/whisk/core/database/DocumentFactory.scala @@ -227,4 +227,18 @@ trait DocumentFactory[W <: DocumentRevisionProvider] extends MultipleReadersSing case Failure(t) => Future.failed(t) } } + + def deleteAttachments[Wsuper >: W](db: ArtifactStore[Wsuper], doc: DocInfo)( + implicit transid: TransactionId): Future[Boolean] = { + Try { + require(db != null, "db defined") + require(doc != null, "doc undefined") + } map { _ => + implicit val ec = db.executionContext + db.deleteAttachments(doc) + } match { + case Success(f) => f + case Failure(t) => Future.failed(t) + } + } } diff --git a/common/scala/src/main/scala/whisk/core/entity/WhiskAction.scala b/common/scala/src/main/scala/whisk/core/entity/WhiskAction.scala index 92b7db3..07b9efe 100644 --- a/common/scala/src/main/scala/whisk/core/entity/WhiskAction.scala +++ b/common/scala/src/main/scala/whisk/core/entity/WhiskAction.scala @@ -376,6 +376,24 @@ object WhiskAction extends DocumentFactory[WhiskAction] with WhiskEntityQueries[ } } + override def del[Wsuper >: WhiskAction](db: ArtifactStore[Wsuper], doc: DocInfo)( + implicit transid: TransactionId, + notifier: Option[CacheChangeNotification]): Future[Boolean] = { + Try { + require(db != null, "db undefined") + require(doc != null, "doc undefined") + }.map { _ => + val fa = super.del(db, doc) + implicit val ec = db.executionContext + fa.flatMap { _ => + super.deleteAttachments(db, doc) + } + } match { + case Success(f) => f + case Failure(f) => Future.failed(f) + } + } + /** * Resolves an action name if it is contained in a package. * Look up the package to determine if it is a binding or the actual package. diff --git a/tests/build.gradle b/tests/build.gradle index 9d68ed2..70eaa30 100644 --- a/tests/build.gradle +++ b/tests/build.gradle @@ -66,7 +66,8 @@ dependencies { compile 'org.scalamock:scalamock-scalatest-support_2.11:3.4.2' compile 'com.typesafe.akka:akka-testkit_2.11:2.4.16' compile 'com.typesafe.akka:akka-http-testkit_2.11:10.0.10' - compile 'com.github.java-json-tools:json-schema-validator:2.2.8'; + compile 'com.github.java-json-tools:json-schema-validator:2.2.8' + compile "org.mockito:mockito-core:2.15.0" compile project(':common:scala') compile project(':core:controller') diff --git a/tests/src/test/scala/whisk/core/entity/test/DatastoreTests.scala b/tests/src/test/scala/whisk/core/entity/test/DatastoreTests.scala index ec4a998..601efec 100644 --- a/tests/src/test/scala/whisk/core/entity/test/DatastoreTests.scala +++ b/tests/src/test/scala/whisk/core/entity/test/DatastoreTests.scala @@ -19,18 +19,17 @@ package whisk.core.entity.test import java.time.Instant -import scala.Vector import scala.concurrent.Await - import org.junit.runner.RunWith import org.scalatest.BeforeAndAfterEach import org.scalatest.BeforeAndAfterAll import org.scalatest.FlatSpec import org.scalatest.junit.JUnitRunner - import akka.stream.ActorMaterializer import common.StreamLogging import common.WskActorSystem +import org.scalatest.mockito.MockitoSugar +import org.mockito.Mockito._ import whisk.core.WhiskConfig import whisk.core.database.DocumentConflictException import whisk.core.database.CacheChangeNotification @@ -46,6 +45,7 @@ class DatastoreTests with WskActorSystem with DbUtils with ExecHelpers + with MockitoSugar with StreamLogging { implicit val materializer = ActorMaterializer() @@ -208,6 +208,19 @@ class DatastoreTests putGetCheck(datastore, revAction, WhiskAction) } + it should "delete action attachments" in { + implicit val tid = transid() + implicit val basename = EntityName("attachment action") + val javaAction = + WhiskAction(namespace, aname, javaDefault("ZHViZWU=", Some("hello")), annotations = Parameters("exec", "java")) + val docinfo = putGetCheck(datastore, javaAction, WhiskAction, false)._2.docinfo + + val proxy = spy(datastore) + Await.result(WhiskAction.del(proxy, docinfo), dbOpTimeout) + + verify(proxy).deleteAttachments(docinfo) + } + it should "update trigger with a revision" in { implicit val tid = transid() implicit val basename = EntityName("update trigger") -- To stop receiving notification emails like this one, please contact rab...@apache.org.