rabbah closed pull request #3366: Adds method deleteAttachments to ArtifactStore URL: https://github.com/apache/incubator-openwhisk/pull/3366
This is a PR merged from a forked repository. As GitHub hides the original diff on merge, it is displayed below for the sake of provenance: As this is a foreign pull request (from a fork), the diff is supplied below (as it won't show otherwise due to GitHub magic): 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 33ea80589e..631f60ad1c 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 efc03cca85..d55db6505a 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 59e04879fb..b6e346ba4b 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 92b7db3231..07b9efeb94 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 9d68ed2c6d..70eaa309c2 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 ec4a998bfe..601efec157 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") ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services