@@ -484,3 +484,166 @@ object StatusData extends DefaultJsonProtocol {
484
484
implicit val serdes =
485
485
jsonFormat(StatusData .apply _, " invocationNamespace" , " fqn" , " waitingActivation" , " status" , " data" )
486
486
}
487
+
488
+
489
+ case class ContainerCreationMessage (override val transid : TransactionId ,
490
+ invocationNamespace : String ,
491
+ action : FullyQualifiedEntityName ,
492
+ revision : DocRevision ,
493
+ whiskActionMetaData : WhiskActionMetaData ,
494
+ rootSchedulerIndex : SchedulerInstanceId ,
495
+ schedulerHost : String ,
496
+ rpcPort : Int ,
497
+ retryCount : Int = 0 ,
498
+ creationId : CreationId = CreationId .generate())
499
+ extends ContainerMessage (transid) {
500
+
501
+ override def toJson : JsValue = ContainerCreationMessage .serdes.write(this )
502
+ override def serialize : String = toJson.compactPrint
503
+ }
504
+
505
+ object ContainerCreationMessage extends DefaultJsonProtocol {
506
+ def parse (msg : String ): Try [ContainerCreationMessage ] = Try (serdes.read(msg.parseJson))
507
+
508
+ private implicit val fqnSerdes = FullyQualifiedEntityName .serdes
509
+ private implicit val instanceIdSerdes = SchedulerInstanceId .serdes
510
+ private implicit val byteSizeSerdes = size.serdes
511
+ implicit val serdes = jsonFormat10(
512
+ ContainerCreationMessage .apply(
513
+ _ : TransactionId ,
514
+ _ : String ,
515
+ _ : FullyQualifiedEntityName ,
516
+ _ : DocRevision ,
517
+ _ : WhiskActionMetaData ,
518
+ _ : SchedulerInstanceId ,
519
+ _ : String ,
520
+ _ : Int ,
521
+ _ : Int ,
522
+ _ : CreationId ))
523
+ }
524
+
525
+ case class ContainerDeletionMessage (override val transid : TransactionId ,
526
+ invocationNamespace : String ,
527
+ action : FullyQualifiedEntityName ,
528
+ revision : DocRevision ,
529
+ whiskActionMetaData : WhiskActionMetaData )
530
+ extends ContainerMessage (transid) {
531
+ override def toJson : JsValue = ContainerDeletionMessage .serdes.write(this )
532
+ override def serialize : String = toJson.compactPrint
533
+ }
534
+
535
+ object ContainerDeletionMessage extends DefaultJsonProtocol {
536
+ def parse (msg : String ): Try [ContainerDeletionMessage ] = Try (serdes.read(msg.parseJson))
537
+
538
+ private implicit val fqnSerdes = FullyQualifiedEntityName .serdes
539
+ private implicit val instanceIdSerdes = SchedulerInstanceId .serdes
540
+ private implicit val byteSizeSerdes = size.serdes
541
+ implicit val serdes = jsonFormat5(
542
+ ContainerDeletionMessage
543
+ .apply(_ : TransactionId , _ : String , _ : FullyQualifiedEntityName , _ : DocRevision , _ : WhiskActionMetaData ))
544
+ }
545
+
546
+ abstract class ContainerMessage (private val tid : TransactionId ) extends Message {
547
+ override val transid : TransactionId = tid
548
+ override def serialize : String = ContainerMessage .serdes.write(this ).compactPrint
549
+
550
+ /** Serializes the message to JSON. */
551
+ def toJson : JsValue
552
+ }
553
+
554
+ object ContainerMessage extends DefaultJsonProtocol {
555
+ def parse (msg : String ): Try [ContainerMessage ] = Try (serdes.read(msg.parseJson))
556
+
557
+ implicit val serdes = new RootJsonFormat [ContainerMessage ] {
558
+ override def write (m : ContainerMessage ): JsValue = m.toJson
559
+
560
+ override def read (json : JsValue ): ContainerMessage = {
561
+ val JsObject (fields) = json
562
+ val creation = fields.contains(" creationId" )
563
+ if (creation) {
564
+ json.convertTo[ContainerCreationMessage ]
565
+ } else {
566
+ json.convertTo[ContainerDeletionMessage ]
567
+ }
568
+ }
569
+ }
570
+ }
571
+
572
+ sealed trait ContainerCreationError
573
+ object ContainerCreationError extends Enumeration {
574
+ case object NoAvailableInvokersError extends ContainerCreationError
575
+ case object NoAvailableResourceInvokersError extends ContainerCreationError
576
+ case object ResourceNotEnoughError extends ContainerCreationError
577
+ case object WhiskError extends ContainerCreationError
578
+ case object UnknownError extends ContainerCreationError
579
+ case object TimeoutError extends ContainerCreationError
580
+ case object ShuttingDownError extends ContainerCreationError
581
+ case object NonExecutableActionError extends ContainerCreationError
582
+ case object DBFetchError extends ContainerCreationError
583
+ case object BlackBoxError extends ContainerCreationError
584
+ case object ZeroNamespaceLimit extends ContainerCreationError
585
+ case object TooManyConcurrentRequests extends ContainerCreationError
586
+
587
+ val whiskErrors : Set [ContainerCreationError ] =
588
+ Set (
589
+ NoAvailableInvokersError ,
590
+ NoAvailableResourceInvokersError ,
591
+ ResourceNotEnoughError ,
592
+ WhiskError ,
593
+ ShuttingDownError ,
594
+ UnknownError ,
595
+ TimeoutError ,
596
+ ZeroNamespaceLimit )
597
+
598
+ private def parse (name : String ) = name.toUpperCase match {
599
+ case " NOAVAILABLEINVOKERSERROR" => NoAvailableInvokersError
600
+ case " NOAVAILABLERESOURCEINVOKERSERROR" => NoAvailableResourceInvokersError
601
+ case " RESOURCENOTENOUGHERROR" => ResourceNotEnoughError
602
+ case " NONEXECUTBLEACTIONERROR" => NonExecutableActionError
603
+ case " DBFETCHERROR" => DBFetchError
604
+ case " WHISKERROR" => WhiskError
605
+ case " BLACKBOXERROR" => BlackBoxError
606
+ case " TIMEOUTERROR" => TimeoutError
607
+ case " ZERONAMESPACELIMIT" => ZeroNamespaceLimit
608
+ case " TOOMANYCONCURRENTREQUESTS" => TooManyConcurrentRequests
609
+ case " UNKNOWNERROR" => UnknownError
610
+ }
611
+
612
+ implicit val serds = new RootJsonFormat [ContainerCreationError ] {
613
+ override def write (error : ContainerCreationError ): JsValue = JsString (error.toString)
614
+ override def read (json : JsValue ): ContainerCreationError =
615
+ Try {
616
+ val JsString (str) = json
617
+ ContainerCreationError .parse(str.trim.toUpperCase)
618
+ } getOrElse {
619
+ throw deserializationError(" ContainerCreationError must be a valid string" )
620
+ }
621
+ }
622
+ }
623
+
624
+ case class ContainerCreationAckMessage (override val transid : TransactionId ,
625
+ creationId : CreationId ,
626
+ invocationNamespace : String ,
627
+ action : FullyQualifiedEntityName ,
628
+ revision : DocRevision ,
629
+ actionMetaData : WhiskActionMetaData ,
630
+ rootInvokerIndex : InvokerInstanceId ,
631
+ schedulerHost : String ,
632
+ rpcPort : Int ,
633
+ retryCount : Int = 0 ,
634
+ error : Option [ContainerCreationError ] = None ,
635
+ reason : Option [String ] = None )
636
+ extends Message {
637
+
638
+ /**
639
+ * Serializes message to string. Must be idempotent.
640
+ */
641
+ override def serialize : String = ContainerCreationAckMessage .serdes.write(this ).compactPrint
642
+ }
643
+
644
+ object ContainerCreationAckMessage extends DefaultJsonProtocol {
645
+ def parse (msg : String ): Try [ContainerCreationAckMessage ] = Try (serdes.read(msg.parseJson))
646
+ private implicit val fqnSerdes = FullyQualifiedEntityName .serdes
647
+ private implicit val byteSizeSerdes = size.serdes
648
+ implicit val serdes = jsonFormat12(ContainerCreationAckMessage .apply)
649
+ }
0 commit comments