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 9132ddf Make ActivationId implementation leaner. (#3362) 9132ddf is described below commit 9132ddf1ec9dacfc1d74f46b516138397018b327 Author: Markus Thömmes <markusthoem...@me.com> AuthorDate: Tue Mar 6 12:53:42 2018 +0100 Make ActivationId implementation leaner. (#3362) * Rework activation id to ignore uuid semantics * Take out arg normalizer * Rename apply to generate for more explicitness --- .../scala/whisk/core/entity/ActivationId.scala | 112 +++++++-------------- .../scala/whisk/core/controller/Activations.scala | 14 +-- .../connector/tests/CompletionMessageTests.scala | 6 +- .../logging/SplunkLogStoreTests.scala | 2 +- .../test/DockerToActivationLogStoreTests.scala | 8 +- .../containerpool/test/ContainerPoolTests.scala | 2 +- .../containerpool/test/ContainerProxyTests.scala | 2 +- .../actions/test/SequenceAccountingTests.scala | 4 +- .../core/controller/test/ActivationsApiTests.scala | 74 ++++++++++---- .../controller/test/ControllerTestCommon.scala | 2 +- .../core/controller/test/TriggersApiTests.scala | 4 +- .../core/controller/test/WebActionsApiTests.scala | 4 +- .../whisk/core/database/test/RemoveLogsTests.scala | 4 +- .../whisk/core/entity/test/DatastoreTests.scala | 12 +-- .../scala/whisk/core/entity/test/SchemaTests.scala | 18 ++-- .../scala/whisk/core/entity/test/ViewTests.scala | 20 ++-- .../whisk/core/entity/test/WhiskEntityTests.scala | 4 +- .../loadBalancer/test/LoadBalancerDataTests.scala | 10 +- 18 files changed, 150 insertions(+), 152 deletions(-) diff --git a/common/scala/src/main/scala/whisk/core/entity/ActivationId.scala b/common/scala/src/main/scala/whisk/core/entity/ActivationId.scala index 0a1cb25..85c59be 100644 --- a/common/scala/src/main/scala/whisk/core/entity/ActivationId.scala +++ b/common/scala/src/main/scala/whisk/core/entity/ActivationId.scala @@ -17,18 +17,13 @@ package whisk.core.entity -import java.math.BigInteger - -import scala.language.postfixOps -import scala.util.Failure -import scala.util.Success -import scala.util.Try - import spray.json.DefaultJsonProtocol.StringJsonFormat import spray.json._ +import whisk.http.Messages import whisk.core.entity.size._ -import whisk.http.Messages + +import scala.util.{Failure, Success, Try} /** * An activation id, is a unique id assigned to activations (invoke action or fire trigger). @@ -38,97 +33,64 @@ import whisk.http.Messages * The constructor is private so that argument requirements are checked and normalized * before creating a new instance. * - * @param id the activation id, required not null + * @param asString the activation id */ -protected[whisk] class ActivationId private (private val id: java.util.UUID) extends AnyVal { - def asString = toString - override def toString = id.toString.replaceAll("-", "") - def toJsObject = JsObject("activationId" -> toString.toJson) +protected[whisk] class ActivationId private (val asString: String) extends AnyVal { + override def toString: String = asString + def toJsObject: JsObject = JsObject("activationId" -> asString.toJson) } -protected[core] object ActivationId extends ArgNormalizer[ActivationId] { +protected[core] object ActivationId { protected[core] trait ActivationIdGenerator { - def make(): ActivationId = new ActivationId(UUIDs.randomUUID()) + def make(): ActivationId = ActivationId.generate() } - /** - * Unapply method for convenience of case matching. - */ - protected[core] def unapply(name: String): Option[ActivationId] = { - Try { ActivationId(name) } toOption - } + /** Checks if the current character is hexadecimal */ + private def isHexadecimal(c: Char) = c.isDigit || c == 'a' || c == 'b' || c == 'c' || c == 'd' || c == 'e' || c == 'f' /** - * Creates an activation id from a java.util.UUID. + * Parses an activation id from a string. * - * @param uuid the activation id as UUID + * @param id the activation id as string * @return ActivationId instance - * @throws IllegalArgumentException is argument is not defined */ - @throws[IllegalArgumentException] - private def apply(uuid: java.util.UUID): ActivationId = { - require(uuid != null, "argument undefined") - new ActivationId(uuid) + def parse(id: String): Try[ActivationId] = { + val length = id.length + if (length != 32) { + Failure( + new IllegalArgumentException(Messages.activationIdLengthError(SizeError("Activation id", length.B, 32.B)))) + } else if (!id.forall(isHexadecimal)) { + Failure(new IllegalArgumentException(Messages.activationIdIllegal)) + } else { + Success(new ActivationId(id)) + } } /** * Generates a random activation id using java.util.UUID factory. * + * Uses fast path to generate the ActivationId without additional requirement checks. + * * @return new ActivationId */ - protected[core] def apply(): ActivationId = new ActivationId(UUIDs.randomUUID()) + protected[core] def generate(): ActivationId = new ActivationId(UUIDs.randomUUID().toString.filterNot(_ == '-')) - /** - * Overrides factory method so that string is not interpreted as number - * e.g., 2e11. - */ - override protected[entity] def factory(s: String): ActivationId = { - serdes.read(JsString(s)) - } - - override protected[core] implicit val serdes = new RootJsonFormat[ActivationId] { + protected[core] implicit val serdes: RootJsonFormat[ActivationId] = new RootJsonFormat[ActivationId] { def write(d: ActivationId) = JsString(d.toString) - def read(value: JsValue) = - Try { - value match { - case JsString(s) => stringToActivationId(s) - case JsNumber(n) => bigIntToActivationId(n.toBigInt) - case _ => deserializationError(Messages.activationIdIllegal) - } - } match { - case Success(a) => a - case Failure(DeserializationException(t, _, _)) => deserializationError(t) - case Failure(t) => deserializationError(Messages.activationIdIllegal) + def read(value: JsValue): ActivationId = { + val parsed = value match { + case JsString(s) => ActivationId.parse(s) + case JsNumber(n) => ActivationId.parse(n.toString) + case _ => Failure(DeserializationException(Messages.activationIdIllegal)) } - } - private def bigIntToActivationId(n: BigInt): ActivationId = { - // print the bigint using base 10 then convert to base 16 - val bn = new BigInteger(n.bigInteger.toString(10), 16) - // mask out the upper 16 ints - val lb = bn.and(new BigInteger("f" * 16, 16)) - // drop the lower 16 ints - val up = bn.shiftRight(16) - val uuid = new java.util.UUID(lb.longValue, up.longValue) - ActivationId(uuid) - } - - private def stringToActivationId(s: String): ActivationId = { - if (!s.contains("-")) { - if (s.length == 32) { - val lb = new BigInteger(s.substring(0, 16), 16) - val up = new BigInteger(s.substring(16, 32), 16) - val uuid = new java.util.UUID(lb.longValue, up.longValue) - ActivationId(uuid) - } else - deserializationError { - Messages.activationIdLengthError(SizeError("Activation id", s.length.B, 32.B)) - } - } else { - ActivationId(java.util.UUID.fromString(s)) + parsed match { + case Success(aid) => aid + case Failure(t: IllegalArgumentException) => deserializationError(t.getMessage) + case Failure(_) => deserializationError(Messages.activationIdIllegal) + } } - } } diff --git a/core/controller/src/main/scala/whisk/core/controller/Activations.scala b/core/controller/src/main/scala/whisk/core/controller/Activations.scala index 6cc4ef7..3c57d0d 100644 --- a/core/controller/src/main/scala/whisk/core/controller/Activations.scala +++ b/core/controller/src/main/scala/whisk/core/controller/Activations.scala @@ -27,7 +27,6 @@ import akka.http.scaladsl.model.StatusCodes.BadRequest import akka.http.scaladsl.server.Directives import akka.http.scaladsl.unmarshalling._ -import spray.json._ import spray.json.DefaultJsonProtocol.RootJsObjectFormat import whisk.common.TransactionId import whisk.core.containerpool.logging.LogStore @@ -93,10 +92,10 @@ trait WhiskActivationsApi extends Directives with AuthenticatedRouteProvider wit /** Validated entity name as an ActivationId from the matched path segment. */ protected override def entityname(n: String) = { - val activationId = Try { ActivationId(n) } + val activationId = ActivationId.parse(n) validate(activationId.isSuccess, activationId match { - case Failure(DeserializationException(t, _, _)) => t - case _ => Messages.activationIdIllegal + case Failure(t: IllegalArgumentException) => t.getMessage + case _ => Messages.activationIdIllegal }) & extract(_ => n) } @@ -118,10 +117,11 @@ trait WhiskActivationsApi extends Directives with AuthenticatedRouteProvider wit /** Dispatches resource to the proper handler depending on context. */ protected override def dispatchOp(user: Identity, op: Privilege, resource: Resource)( implicit transid: TransactionId) = { - resource.entity match { - case Some(ActivationId(id)) => + + resource.entity.flatMap(e => ActivationId.parse(e).toOption) match { + case Some(aid) => op match { - case READ => fetch(user, resource.namespace, id) + case READ => fetch(user, resource.namespace, aid) case _ => reject // should not get here } case None => diff --git a/tests/src/test/scala/whisk/core/connector/tests/CompletionMessageTests.scala b/tests/src/test/scala/whisk/core/connector/tests/CompletionMessageTests.scala index 7a50111..3a9a16e 100644 --- a/tests/src/test/scala/whisk/core/connector/tests/CompletionMessageTests.scala +++ b/tests/src/test/scala/whisk/core/connector/tests/CompletionMessageTests.scala @@ -45,7 +45,7 @@ class CompletionMessageTests extends FlatSpec with Matchers { namespace = EntityPath("ns"), name = EntityName("a"), Subject(), - activationId = ActivationId(), + activationId = ActivationId.generate(), start = Instant.now(), end = Instant.now(), response = ActivationResponse.success(Some(JsObject("res" -> JsNumber(1)))), @@ -53,7 +53,7 @@ class CompletionMessageTests extends FlatSpec with Matchers { duration = Some(123)) it should "serialize a left completion message" in { - val m = CompletionMessage(TransactionId.testing, Left(ActivationId()), InstanceId(0)) + val m = CompletionMessage(TransactionId.testing, Left(ActivationId.generate()), InstanceId(0)) m.serialize shouldBe JsObject( "transid" -> m.transid.toJson, "response" -> m.response.left.get.toJson, @@ -69,7 +69,7 @@ class CompletionMessageTests extends FlatSpec with Matchers { } it should "deserialize a left completion message" in { - val m = CompletionMessage(TransactionId.testing, Left(ActivationId()), InstanceId(0)) + val m = CompletionMessage(TransactionId.testing, Left(ActivationId.generate()), InstanceId(0)) CompletionMessage.parse(m.serialize) shouldBe Success(m) } diff --git a/tests/src/test/scala/whisk/core/containerpool/logging/SplunkLogStoreTests.scala b/tests/src/test/scala/whisk/core/containerpool/logging/SplunkLogStoreTests.scala index 60213dc..86541ca 100644 --- a/tests/src/test/scala/whisk/core/containerpool/logging/SplunkLogStoreTests.scala +++ b/tests/src/test/scala/whisk/core/containerpool/logging/SplunkLogStoreTests.scala @@ -79,7 +79,7 @@ class SplunkLogStoreTests namespace = EntityPath("ns"), name = EntityName("a"), Subject(), - activationId = ActivationId(), + activationId = ActivationId.generate(), start = ZonedDateTime.parse(startTime).toInstant, end = ZonedDateTime.parse(endTime).toInstant, response = ActivationResponse.success(Some(JsObject("res" -> JsNumber(1)))), diff --git a/tests/src/test/scala/whisk/core/containerpool/logging/test/DockerToActivationLogStoreTests.scala b/tests/src/test/scala/whisk/core/containerpool/logging/test/DockerToActivationLogStoreTests.scala index dc46bff..ae5249e 100644 --- a/tests/src/test/scala/whisk/core/containerpool/logging/test/DockerToActivationLogStoreTests.scala +++ b/tests/src/test/scala/whisk/core/containerpool/logging/test/DockerToActivationLogStoreTests.scala @@ -44,7 +44,13 @@ class DockerToActivationLogStoreTests extends FlatSpec with Matchers with WskAct val exec = CodeExecAsString(RuntimeManifest("actionKind", ImageName("testImage")), "testCode", None) val action = ExecutableWhiskAction(user.namespace.toPath, EntityName("actionName"), exec) val activation = - WhiskActivation(user.namespace.toPath, action.name, user.subject, ActivationId(), Instant.EPOCH, Instant.EPOCH) + WhiskActivation( + user.namespace.toPath, + action.name, + user.subject, + ActivationId.generate(), + Instant.EPOCH, + Instant.EPOCH) def toByteString(logs: List[LogLine]) = logs.map(_.toJson.compactPrint).map(ByteString.apply) diff --git a/tests/src/test/scala/whisk/core/containerpool/test/ContainerPoolTests.scala b/tests/src/test/scala/whisk/core/containerpool/test/ContainerPoolTests.scala index 0b53103..ff6d49e 100644 --- a/tests/src/test/scala/whisk/core/containerpool/test/ContainerPoolTests.scala +++ b/tests/src/test/scala/whisk/core/containerpool/test/ContainerPoolTests.scala @@ -76,7 +76,7 @@ class ContainerPoolTests action.fullyQualifiedName(true), action.rev, Identity(Subject(), invocationNamespace, AuthKey(), Set()), - ActivationId(), + ActivationId.generate(), InstanceId(0), blocking = false, content = None) diff --git a/tests/src/test/scala/whisk/core/containerpool/test/ContainerProxyTests.scala b/tests/src/test/scala/whisk/core/containerpool/test/ContainerProxyTests.scala index b624a49..5a13084 100644 --- a/tests/src/test/scala/whisk/core/containerpool/test/ContainerProxyTests.scala +++ b/tests/src/test/scala/whisk/core/containerpool/test/ContainerProxyTests.scala @@ -96,7 +96,7 @@ class ContainerProxyTests action.fullyQualifiedName(true), action.rev, Identity(Subject(), invocationNamespace, AuthKey(), Set()), - ActivationId(), + ActivationId.generate(), InstanceId(0), blocking = false, content = None) diff --git a/tests/src/test/scala/whisk/core/controller/actions/test/SequenceAccountingTests.scala b/tests/src/test/scala/whisk/core/controller/actions/test/SequenceAccountingTests.scala index 7f2a13e..c7cf1c6 100644 --- a/tests/src/test/scala/whisk/core/controller/actions/test/SequenceAccountingTests.scala +++ b/tests/src/test/scala/whisk/core/controller/actions/test/SequenceAccountingTests.scala @@ -47,7 +47,7 @@ class SequenceAccountingTests extends FlatSpec with Matchers with WskActorSystem namespace = EntityPath("ns"), name = EntityName("a"), Subject(), - activationId = ActivationId(), + activationId = ActivationId.generate(), start = Instant.now(), end = Instant.now(), response = okRes2, @@ -58,7 +58,7 @@ class SequenceAccountingTests extends FlatSpec with Matchers with WskActorSystem namespace = EntityPath("ns"), name = EntityName("a"), Subject(), - activationId = ActivationId(), + activationId = ActivationId.generate(), start = Instant.now(), end = Instant.now(), response = failedRes, diff --git a/tests/src/test/scala/whisk/core/controller/test/ActivationsApiTests.scala b/tests/src/test/scala/whisk/core/controller/test/ActivationsApiTests.scala index cf9303d..d01398f 100644 --- a/tests/src/test/scala/whisk/core/controller/test/ActivationsApiTests.scala +++ b/tests/src/test/scala/whisk/core/controller/test/ActivationsApiTests.scala @@ -82,14 +82,20 @@ class ActivationsApiTests extends ControllerTestCommon with WhiskActivationsApi EntityPath(creds1.subject.asString), aname(), creds1.subject, - ActivationId(), + ActivationId.generate(), start = Instant.now, end = Instant.now) } foreach { put(entityStore, _) } val actionName = aname() val activations = (1 to 2).map { i => - WhiskActivation(namespace, actionName, creds.subject, ActivationId(), start = Instant.now, end = Instant.now) + WhiskActivation( + namespace, + actionName, + creds.subject, + ActivationId.generate(), + start = Instant.now, + end = Instant.now) }.toList activations foreach { put(activationStore, _) } waitOnView(activationStore, namespace.root, 2, WhiskActivation.view) @@ -151,7 +157,7 @@ class ActivationsApiTests extends ControllerTestCommon with WhiskActivationsApi EntityPath(creds1.subject.asString), aname(), creds1.subject, - ActivationId(), + ActivationId.generate(), start = Instant.now, end = Instant.now) } foreach { put(entityStore, _) } @@ -162,7 +168,7 @@ class ActivationsApiTests extends ControllerTestCommon with WhiskActivationsApi namespace, actionName, creds.subject, - ActivationId(), + ActivationId.generate(), start = Instant.now, end = Instant.now, response = ActivationResponse.success(Some(JsNumber(5)))) @@ -192,7 +198,7 @@ class ActivationsApiTests extends ControllerTestCommon with WhiskActivationsApi EntityPath(creds1.subject.asString), aname(), creds1.subject, - ActivationId(), + ActivationId.generate(), start = Instant.now, end = Instant.now) } foreach { put(activationStore, _) } @@ -206,35 +212,35 @@ class ActivationsApiTests extends ControllerTestCommon with WhiskActivationsApi namespace, actionName, creds.subject, - ActivationId(), + ActivationId.generate(), start = now.plusSeconds(9), end = now.plusSeconds(9)), WhiskActivation( namespace, actionName, creds.subject, - ActivationId(), + ActivationId.generate(), start = now.plusSeconds(20), end = now.plusSeconds(20)), // should match WhiskActivation( namespace, actionName, creds.subject, - ActivationId(), + ActivationId.generate(), start = now.plusSeconds(10), end = now.plusSeconds(20)), // should match WhiskActivation( namespace, actionName, creds.subject, - ActivationId(), + ActivationId.generate(), start = now.plusSeconds(31), end = now.plusSeconds(31)), WhiskActivation( namespace, actionName, creds.subject, - ActivationId(), + ActivationId.generate(), start = now.plusSeconds(30), end = now.plusSeconds(30))) // should match activations foreach { put(activationStore, _) } @@ -316,7 +322,7 @@ class ActivationsApiTests extends ControllerTestCommon with WhiskActivationsApi EntityPath(creds1.subject.asString), aname(), creds1.subject, - ActivationId(), + ActivationId.generate(), start = Instant.now, end = Instant.now) } foreach { put(activationStore, _) } @@ -326,7 +332,7 @@ class ActivationsApiTests extends ControllerTestCommon with WhiskActivationsApi namespace, EntityName(s"xyz"), creds.subject, - ActivationId(), + ActivationId.generate(), start = Instant.now, end = Instant.now) }.toList @@ -337,7 +343,7 @@ class ActivationsApiTests extends ControllerTestCommon with WhiskActivationsApi namespace, EntityName(s"xyz"), creds.subject, - ActivationId(), + ActivationId.generate(), start = Instant.now, end = Instant.now, annotations = Parameters("path", s"${namespace.asString}/pkg/xyz")) @@ -416,7 +422,13 @@ class ActivationsApiTests extends ControllerTestCommon with WhiskActivationsApi it should "get activation by id" in { implicit val tid = transid() val activation = - WhiskActivation(namespace, aname(), creds.subject, ActivationId(), start = Instant.now, end = Instant.now) + WhiskActivation( + namespace, + aname(), + creds.subject, + ActivationId.generate(), + start = Instant.now, + end = Instant.now) put(activationStore, activation) Get(s"$collectionPath/${activation.activationId.asString}") ~> Route.seal(routes(creds)) ~> check { @@ -443,7 +455,13 @@ class ActivationsApiTests extends ControllerTestCommon with WhiskActivationsApi it should "get activation result by id" in { implicit val tid = transid() val activation = - WhiskActivation(namespace, aname(), creds.subject, ActivationId(), start = Instant.now, end = Instant.now) + WhiskActivation( + namespace, + aname(), + creds.subject, + ActivationId.generate(), + start = Instant.now, + end = Instant.now) put(activationStore, activation) Get(s"$collectionPath/${activation.activationId.asString}/result") ~> Route.seal(routes(creds)) ~> check { @@ -457,7 +475,13 @@ class ActivationsApiTests extends ControllerTestCommon with WhiskActivationsApi it should "get activation logs by id" in { implicit val tid = transid() val activation = - WhiskActivation(namespace, aname(), creds.subject, ActivationId(), start = Instant.now, end = Instant.now) + WhiskActivation( + namespace, + aname(), + creds.subject, + ActivationId.generate(), + start = Instant.now, + end = Instant.now) put(activationStore, activation) Get(s"$collectionPath/${activation.activationId.asString}/logs") ~> Route.seal(routes(creds)) ~> check { @@ -471,7 +495,13 @@ class ActivationsApiTests extends ControllerTestCommon with WhiskActivationsApi it should "reject request to get invalid activation resource" in { implicit val tid = transid() val activation = - WhiskActivation(namespace, aname(), creds.subject, ActivationId(), start = Instant.now, end = Instant.now) + WhiskActivation( + namespace, + aname(), + creds.subject, + ActivationId.generate(), + start = Instant.now, + end = Instant.now) put(entityStore, activation) Get(s"$collectionPath/${activation.activationId.asString}/bogus") ~> Route.seal(routes(creds)) ~> check { @@ -481,7 +511,7 @@ class ActivationsApiTests extends ControllerTestCommon with WhiskActivationsApi it should "reject get requests with invalid activation ids" in { implicit val tid = transid() - val activationId = ActivationId().toString + val activationId = ActivationId.generate().toString val tooshort = activationId.substring(0, 31) val toolong = activationId + "xxx" val malformed = tooshort + "z" @@ -503,21 +533,21 @@ class ActivationsApiTests extends ControllerTestCommon with WhiskActivationsApi it should "reject request with put" in { implicit val tid = transid() - Put(s"$collectionPath/${ActivationId()}") ~> Route.seal(routes(creds)) ~> check { + Put(s"$collectionPath/${ActivationId.generate()}") ~> Route.seal(routes(creds)) ~> check { status should be(MethodNotAllowed) } } it should "reject request with post" in { implicit val tid = transid() - Post(s"$collectionPath/${ActivationId()}") ~> Route.seal(routes(creds)) ~> check { + Post(s"$collectionPath/${ActivationId.generate()}") ~> Route.seal(routes(creds)) ~> check { status should be(MethodNotAllowed) } } it should "reject request with delete" in { implicit val tid = transid() - Delete(s"$collectionPath/${ActivationId()}") ~> Route.seal(routes(creds)) ~> check { + Delete(s"$collectionPath/${ActivationId.generate()}") ~> Route.seal(routes(creds)) ~> check { status should be(MethodNotAllowed) } } @@ -534,7 +564,7 @@ class ActivationsApiTests extends ControllerTestCommon with WhiskActivationsApi logging, materializer) implicit val tid = transid() - val entity = BadEntity(namespace, EntityName(ActivationId().toString)) + val entity = BadEntity(namespace, EntityName(ActivationId.generate().toString)) put(activationStore, entity) Get(s"$collectionPath/${entity.name}") ~> Route.seal(routes(creds)) ~> check { diff --git a/tests/src/test/scala/whisk/core/controller/test/ControllerTestCommon.scala b/tests/src/test/scala/whisk/core/controller/test/ControllerTestCommon.scala index ffedc81..e4d7904 100644 --- a/tests/src/test/scala/whisk/core/controller/test/ControllerTestCommon.scala +++ b/tests/src/test/scala/whisk/core/controller/test/ControllerTestCommon.scala @@ -79,7 +79,7 @@ protected trait ControllerTestCommon override val activationIdFactory = new ActivationId.ActivationIdGenerator() { // need a static activation id to test activations api - private val fixedId = ActivationId() + private val fixedId = ActivationId.generate() override def make = fixedId } diff --git a/tests/src/test/scala/whisk/core/controller/test/TriggersApiTests.scala b/tests/src/test/scala/whisk/core/controller/test/TriggersApiTests.scala index 44ab26b..9f79540 100644 --- a/tests/src/test/scala/whisk/core/controller/test/TriggersApiTests.scala +++ b/tests/src/test/scala/whisk/core/controller/test/TriggersApiTests.scala @@ -333,7 +333,7 @@ class TriggersApiTests extends ControllerTestCommon with WhiskTriggersApi { status should be(Accepted) val response = responseAs[JsObject] val JsString(id) = response.fields("activationId") - val activationId = ActivationId(id) + val activationId = ActivationId.parse(id).get response.fields("activationId") should not be None val activationDoc = DocId(WhiskEntity.qualifiedName(namespace, activationId)) @@ -358,7 +358,7 @@ class TriggersApiTests extends ControllerTestCommon with WhiskTriggersApi { Post(s"$collectionPath/${trigger.name}") ~> Route.seal(routes(creds)) ~> check { val response = responseAs[JsObject] val JsString(id) = response.fields("activationId") - val activationId = ActivationId(id) + val activationId = ActivationId.parse(id).get val activationDoc = DocId(WhiskEntity.qualifiedName(namespace, activationId)) whisk.utils.retry({ println(s"trying to delete async activation doc: '${activationDoc}'") diff --git a/tests/src/test/scala/whisk/core/controller/test/WebActionsApiTests.scala b/tests/src/test/scala/whisk/core/controller/test/WebActionsApiTests.scala index 2f47595..044ab53 100644 --- a/tests/src/test/scala/whisk/core/controller/test/WebActionsApiTests.scala +++ b/tests/src/test/scala/whisk/core/controller/test/WebActionsApiTests.scala @@ -262,7 +262,7 @@ trait WebActionsApiBaseTests extends ControllerTestCommon with BeforeAndAfterEac action.namespace, action.name, user.subject, - ActivationId(), + ActivationId.generate(), start = Instant.now, end = Instant.now, response = { @@ -290,7 +290,7 @@ trait WebActionsApiBaseTests extends ControllerTestCommon with BeforeAndAfterEac Future.successful(Right(activation)) } else if (failActivation == 1) { - Future.successful(Left(ActivationId())) + Future.successful(Left(ActivationId.generate())) } else { Future.failed(new IllegalStateException("bad activation")) } diff --git a/tests/src/test/scala/whisk/core/database/test/RemoveLogsTests.scala b/tests/src/test/scala/whisk/core/database/test/RemoveLogsTests.scala index a71240c..fc116d0 100644 --- a/tests/src/test/scala/whisk/core/database/test/RemoveLogsTests.scala +++ b/tests/src/test/scala/whisk/core/database/test/RemoveLogsTests.scala @@ -75,7 +75,7 @@ class RemoveLogsTests extends FlatSpec with DatabaseScriptTestUtils with StreamL namespace = EntityPath("testns1"), name = EntityName("testname1"), subject = Subject("test-sub1"), - activationId = ActivationId(), + activationId = ActivationId.generate(), start = Instant.now.minus(2, ChronoUnit.DAYS), end = Instant.now, logs = ActivationLogs(Vector("first line1", "second line1"))) @@ -84,7 +84,7 @@ class RemoveLogsTests extends FlatSpec with DatabaseScriptTestUtils with StreamL namespace = EntityPath("testns2"), name = EntityName("testname2"), subject = Subject("test-sub2"), - activationId = ActivationId(), + activationId = ActivationId.generate(), start = Instant.now, end = Instant.now, logs = ActivationLogs(Vector("first line2", "second line2"))) 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 abf9e9f..ec4a998 100644 --- a/tests/src/test/scala/whisk/core/entity/test/DatastoreTests.scala +++ b/tests/src/test/scala/whisk/core/entity/test/DatastoreTests.scala @@ -134,8 +134,8 @@ class DatastoreTests implicit val tid = transid() implicit val basename = EntityName("create action blackbox") val activations = Seq( - WhiskActivation(namespace, aname, Subject(), ActivationId(), start = Instant.now, end = Instant.now), - WhiskActivation(namespace, aname, Subject(), ActivationId(), start = Instant.now, end = Instant.now)) + WhiskActivation(namespace, aname, Subject(), ActivationId.generate(), start = Instant.now, end = Instant.now), + WhiskActivation(namespace, aname, Subject(), ActivationId.generate(), start = Instant.now, end = Instant.now)) val docs = activations.map { entity => putGetCheck(datastore, entity, WhiskActivation) } @@ -149,7 +149,7 @@ class DatastoreTests namespace, aname, Subject(), - ActivationId(), + ActivationId.generate(), start = Instant.now, end = Instant.now, logs = ActivationLogs(Vector("Prote\u00EDna")))) @@ -230,7 +230,7 @@ class DatastoreTests implicit val tid = transid() implicit val basename = EntityName("update activation") val activation = - WhiskActivation(namespace, aname, Subject(), ActivationId(), start = Instant.now, end = Instant.now) + WhiskActivation(namespace, aname, Subject(), ActivationId.generate(), start = Instant.now, end = Instant.now) val docinfo = putGetCheck(datastore, activation, WhiskActivation, false)._2.docinfo val revActivation = WhiskActivation( namespace, @@ -277,7 +277,7 @@ class DatastoreTests implicit val tid = transid() implicit val basename = EntityName("create activation twice") val activation = - WhiskActivation(namespace, aname, Subject(), ActivationId(), start = Instant.now, end = Instant.now) + WhiskActivation(namespace, aname, Subject(), ActivationId.generate(), start = Instant.now, end = Instant.now) putGetCheck(datastore, activation, WhiskActivation) intercept[DocumentConflictException] { putGetCheck(datastore, activation, WhiskActivation) @@ -325,7 +325,7 @@ class DatastoreTests implicit val tid = transid() implicit val basename = EntityName("delete activation twice") val activation = - WhiskActivation(namespace, aname, Subject(), ActivationId(), start = Instant.now, end = Instant.now) + WhiskActivation(namespace, aname, Subject(), ActivationId.generate(), start = Instant.now, end = Instant.now) val doc = putGetCheck(datastore, activation, WhiskActivation, false)._1 assert(Await.result(WhiskActivation.del(datastore, doc), dbOpTimeout)) intercept[NoDocumentException] { diff --git a/tests/src/test/scala/whisk/core/entity/test/SchemaTests.scala b/tests/src/test/scala/whisk/core/entity/test/SchemaTests.scala index b5cb9f4..daf8998 100644 --- a/tests/src/test/scala/whisk/core/entity/test/SchemaTests.scala +++ b/tests/src/test/scala/whisk/core/entity/test/SchemaTests.scala @@ -767,22 +767,22 @@ class SchemaTests extends FlatSpec with BeforeAndAfter with ExecHelpers with Mat it should "parse activation id as uuid" in { val id = "213174381920559471141441e1111111" - val aid = ActivationId.unapply(id) - assert(aid.isDefined) + val aid = ActivationId.parse(id) + assert(aid.isSuccess) assert(aid.get.toString == id) } it should "parse activation id as uuid when made up of no numbers" in { val id = "a" * 32 - val aid = ActivationId.unapply(id) - assert(aid.isDefined) + val aid = ActivationId.parse(id) + assert(aid.isSuccess) assert(aid.get.toString == id) } it should "parse activation id as uuid when made up of no letters" in { val id = "1" * 32 - val aid = ActivationId.unapply(id) - assert(aid.isDefined) + val aid = ActivationId.parse(id) + assert(aid.isSuccess) assert(aid.get.toString == id) } @@ -795,7 +795,7 @@ class SchemaTests extends FlatSpec with BeforeAndAfter with ExecHelpers with Mat it should "not parse invalid activation id" in { val id = "213174381920559471141441e111111z" - assert(ActivationId.unapply(id).isEmpty) + assert(ActivationId.parse(id).isFailure) Try(ActivationId.serdes.read(JsString(id))) shouldBe Failure { DeserializationException(Messages.activationIdIllegal) } @@ -803,7 +803,7 @@ class SchemaTests extends FlatSpec with BeforeAndAfter with ExecHelpers with Mat it should "not parse activation id if longer than uuid" in { val id = "213174381920559471141441e1111111abc" - assert(ActivationId.unapply(id).isEmpty) + assert(ActivationId.parse(id).isFailure) Try(ActivationId.serdes.read(JsString(id))) shouldBe Failure { DeserializationException(Messages.activationIdLengthError(SizeError("Activation id", id.length.B, 32.B))) } @@ -811,7 +811,7 @@ class SchemaTests extends FlatSpec with BeforeAndAfter with ExecHelpers with Mat it should "not parse activation id if shorter than uuid" in { val id = "213174381920559471141441e1" - ActivationId.unapply(id) shouldBe empty + ActivationId.parse(id) shouldBe 'failure Try(ActivationId.serdes.read(JsString(id))) shouldBe Failure { DeserializationException(Messages.activationIdLengthError(SizeError("Activation id", id.length.B, 32.B))) } 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 d4e0b16..ef85ee4 100644 --- a/tests/src/test/scala/whisk/core/entity/test/ViewTests.scala +++ b/tests/src/test/scala/whisk/core/entity/test/ViewTests.scala @@ -312,11 +312,11 @@ class ViewTests // creates 5 entities in each namespace as follows: // - some activations in each namespace (some may have prescribed action name to query by name) implicit val entities = Seq( - WhiskActivation(namespace1, aname(), Subject(), ActivationId(), start = now, end = now), - WhiskActivation(namespace1, aname(), Subject(), ActivationId(), start = now, end = now), - WhiskActivation(namespace2, aname(), Subject(), ActivationId(), start = now, end = now), - WhiskActivation(namespace2, actionName, Subject(), ActivationId(), start = now, end = now), - WhiskActivation(namespace2, actionName, Subject(), ActivationId(), start = now, end = now)) + WhiskActivation(namespace1, aname(), Subject(), ActivationId.generate(), start = now, end = now), + WhiskActivation(namespace1, aname(), Subject(), ActivationId.generate(), start = now, end = now), + WhiskActivation(namespace2, aname(), Subject(), ActivationId.generate(), start = now, end = now), + WhiskActivation(namespace2, actionName, Subject(), ActivationId.generate(), start = now, end = now), + WhiskActivation(namespace2, actionName, Subject(), ActivationId.generate(), start = now, end = now)) entities foreach { put(activationStore, _) } waitOnView(activationStore, namespace1.root, 2, WhiskActivation.view) @@ -344,33 +344,33 @@ class ViewTests val actionName = aname() val now = Instant.now(Clock.systemUTC()) implicit val entities = Seq( - WhiskActivation(namespace1, actionName, Subject(), ActivationId(), start = now, end = now), + WhiskActivation(namespace1, actionName, Subject(), ActivationId.generate(), start = now, end = now), WhiskActivation( namespace1, actionName, Subject(), - ActivationId(), + ActivationId.generate(), start = now.plusSeconds(20), end = now.plusSeconds(20)), WhiskActivation( namespace1, actionName, Subject(), - ActivationId(), + ActivationId.generate(), start = now.plusSeconds(10), end = now.plusSeconds(20)), WhiskActivation( namespace1, actionName, Subject(), - ActivationId(), + ActivationId.generate(), start = now.plusSeconds(40), end = now.plusSeconds(20)), WhiskActivation( namespace1, actionName, Subject(), - ActivationId(), + ActivationId.generate(), start = now.plusSeconds(30), end = now.plusSeconds(20))) diff --git a/tests/src/test/scala/whisk/core/entity/test/WhiskEntityTests.scala b/tests/src/test/scala/whisk/core/entity/test/WhiskEntityTests.scala index 1812f5a..6918ea2 100644 --- a/tests/src/test/scala/whisk/core/entity/test/WhiskEntityTests.scala +++ b/tests/src/test/scala/whisk/core/entity/test/WhiskEntityTests.scala @@ -103,7 +103,7 @@ class WhiskEntityTests extends FlatSpec with ExecHelpers with Matchers { behavior of "WhiskActivation" it should "add and remove logs and preserve revision in the process" in { - val activation = WhiskActivation(namespace, name, Subject(), ActivationId(), Instant.now(), Instant.now()) + val activation = WhiskActivation(namespace, name, Subject(), ActivationId.generate(), Instant.now(), Instant.now()) .revision[WhiskActivation](revision) val logs = ActivationLogs(Vector("testlog")) @@ -149,7 +149,7 @@ class WhiskEntityTests extends FlatSpec with ExecHelpers with Matchers { val action = WhiskAction(namespace, name, jsDefault("code"), Parameters()) assertType(action, "action") - val activation = WhiskActivation(namespace, name, Subject(), ActivationId(), Instant.now(), Instant.now()) + val activation = WhiskActivation(namespace, name, Subject(), ActivationId.generate(), Instant.now(), Instant.now()) assertType(activation, "activation") val whiskPackage = WhiskPackage(namespace, name) diff --git a/tests/src/test/scala/whisk/core/loadBalancer/test/LoadBalancerDataTests.scala b/tests/src/test/scala/whisk/core/loadBalancer/test/LoadBalancerDataTests.scala index b60989a..5a4edb6 100644 --- a/tests/src/test/scala/whisk/core/loadBalancer/test/LoadBalancerDataTests.scala +++ b/tests/src/test/scala/whisk/core/loadBalancer/test/LoadBalancerDataTests.scala @@ -41,9 +41,9 @@ class LoadBalancerDataTests extends FlatSpec with Matchers with StreamLogging { val activationIdPromise = Promise[Either[ActivationId, WhiskActivation]]() val firstEntry: ActivationEntry = - ActivationEntry(ActivationId(), UUID(), InstanceId(0), emptyCancellable, activationIdPromise) + ActivationEntry(ActivationId.generate(), UUID(), InstanceId(0), emptyCancellable, activationIdPromise) val secondEntry: ActivationEntry = - ActivationEntry(ActivationId(), UUID(), InstanceId(1), emptyCancellable, activationIdPromise) + ActivationEntry(ActivationId.generate(), UUID(), InstanceId(1), emptyCancellable, activationIdPromise) val port = 2552 val host = "127.0.0.1" @@ -159,9 +159,9 @@ class LoadBalancerDataTests extends FlatSpec with Matchers with StreamLogging { it should "respond with different values accordingly" in { - val entry = ActivationEntry(ActivationId(), UUID(), InstanceId(1), emptyCancellable, activationIdPromise) - val entrySameInvokerAndNamespace = entry.copy(id = ActivationId()) - val entrySameInvoker = entry.copy(id = ActivationId(), namespaceId = UUID()) + val entry = ActivationEntry(ActivationId.generate(), UUID(), InstanceId(1), emptyCancellable, activationIdPromise) + val entrySameInvokerAndNamespace = entry.copy(id = ActivationId.generate()) + val entrySameInvoker = entry.copy(id = ActivationId.generate(), namespaceId = UUID()) val distributedLoadBalancerData = new DistributedLoadBalancerData() val localLoadBalancerData = new LocalLoadBalancerData() -- To stop receiving notification emails like this one, please contact rab...@apache.org.