From 37370c8b920a65ca6bac2a552b2ce2456ab49d35 Mon Sep 17 00:00:00 2001 From: geoffjentry Date: Mon, 3 Jul 2017 21:47:00 -0400 Subject: [PATCH] Scala 2.12 support for Cromwell --- .travis.yml | 2 +- README.md | 6 +- .../standard/StandardAsyncExecutionActor.scala | 13 +--- .../standard/StandardSyncExecutionActor.scala | 1 - core/src/main/scala/cromwell/core/ConfigUtil.scala | 4 +- .../cromwell/core/path/BetterFileMethods.scala | 4 +- .../test/scala/cromwell/core/retry/RetrySpec.scala | 2 +- .../main/scala/cromwell/api/CromwellClient.scala | 2 +- .../src/main/scala/cromwell/api/model/Label.scala | 1 + .../migration/custom/BatchedTaskChange.scala | 3 +- .../slick/SummaryStatusSlickDatabase.scala | 3 +- .../cromwell/docker/local/DockerCliFlow.scala | 5 +- .../registryv2/flows/HttpFlowWithRetry.scala | 5 +- .../scala/cromwell/engine/io/gcs/GcsResponse.scala | 2 - .../execution/EngineJobExecutionActor.scala | 2 +- .../execution/callcaching/CallCache.scala | 3 +- .../scala/cromwell/server/CromwellRootActor.scala | 2 +- .../cromwell/webservice/CromwellApiService.scala | 2 +- .../cromwell/webservice/LabelsManagerActor.scala | 2 +- .../webservice/CromwellApiServiceSpec.scala | 15 ++--- .../filesystems/gcs/GoogleConfiguration.scala | 2 +- project/Dependencies.scala | 73 +++++++++++----------- project/Settings.scala | 47 +++++++++----- project/build.properties | 2 +- release/release_workflow.wdl | 6 +- .../metadata/impl/MetadataDatabaseAccess.scala | 1 + .../cromwell/services/ServicesStoreSpec.scala | 4 +- src/bin/travis/testCentaurJes.sh | 4 +- src/bin/travis/testCentaurLocal.sh | 2 +- src/bin/travis/testCentaurTes.sh | 2 +- .../jes/JesAsyncBackendJobExecutionActor.scala | 17 ++--- .../cromwell/backend/impl/jes/JesAttributes.scala | 4 +- .../cromwell/backend/impl/jes/JesJobPaths.scala | 3 +- .../jes/statuspolling/JesApiQueryManager.scala | 3 +- .../impl/jes/statuspolling/JesPollingActor.scala | 4 +- .../tes/TesAsyncBackendJobExecutionActor.scala | 8 +-- 36 files changed, 128 insertions(+), 133 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9c5941c5c..7fc3911b5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ sudo: required dist: trusty language: scala scala: - - 2.11.8 + - 2.12.2 jdk: - oraclejdk8 cache: diff --git a/README.md b/README.md index 362c5e2fe..402c52896 100644 --- a/README.md +++ b/README.md @@ -120,13 +120,13 @@ There is a [Cromwell gitter channel](https://gitter.im/broadinstitute/cromwell) The following is the toolchain used for development of Cromwell. Other versions may work, but these are recommended. -* [Scala 2.11.8](http://www.scala-lang.org/news/2.11.8/) +* [Scala 2.12.2](http://www.scala-lang.org/news/2.12.1#scala-212-notes) * [SBT 0.13.12](https://github.com/sbt/sbt/releases/tag/v0.13.12) * [Java 8](http://www.oracle.com/technetwork/java/javase/overview/java8-2100321.html) # Building -`sbt assembly` will build a runnable JAR in `target/scala-2.11/` +`sbt assembly` will build a runnable JAR in `target/scala-2.12/` Tests are run via `sbt test`. Note that the tests do require Docker to be running. To test this out while downloading the Ubuntu image that is required for tests, run `docker pull ubuntu:latest` prior to running `sbt test` @@ -3788,7 +3788,7 @@ Essentially run `sbt doc` then commit the generated code into the `gh-pages` bra ``` $ sbt doc $ git co gh-pages -$ mv target/scala-2.11/api scaladoc +$ mv target/scala-2.12/api scaladoc $ git add scaladoc $ git commit -m "API Docs" $ git push origin gh-pages diff --git a/backend/src/main/scala/cromwell/backend/standard/StandardAsyncExecutionActor.scala b/backend/src/main/scala/cromwell/backend/standard/StandardAsyncExecutionActor.scala index c33c1733f..19b09fdff 100644 --- a/backend/src/main/scala/cromwell/backend/standard/StandardAsyncExecutionActor.scala +++ b/backend/src/main/scala/cromwell/backend/standard/StandardAsyncExecutionActor.scala @@ -251,9 +251,7 @@ trait StandardAsyncExecutionActor extends AsyncBackendJobExecutionActor with Sta * * @return the execution handle for the job. */ - def executeAsync()(implicit ec: ExecutionContext): Future[ExecutionHandle] = { - Future.fromTry(Try(execute())) - } + def executeAsync(): Future[ExecutionHandle] = Future.fromTry(Try(execute())) /** * Recovers the specified job id, or starts a new job. The default implementation simply calls execute(). @@ -269,9 +267,7 @@ trait StandardAsyncExecutionActor extends AsyncBackendJobExecutionActor with Sta * @param jobId The previously recorded job id. * @return the execution handle for the job. */ - def recoverAsync(jobId: StandardAsyncJob)(implicit ec: ExecutionContext): Future[ExecutionHandle] = { - Future.fromTry(Try(recover(jobId))) - } + def recoverAsync(jobId: StandardAsyncJob): Future[ExecutionHandle] = Future.fromTry(Try(recover(jobId))) /** * Returns the run status for the job. @@ -289,10 +285,7 @@ trait StandardAsyncExecutionActor extends AsyncBackendJobExecutionActor with Sta * @param handle The handle of the running job. * @return The status of the job. */ - def pollStatusAsync(handle: StandardAsyncPendingExecutionHandle) - (implicit ec: ExecutionContext): Future[StandardAsyncRunStatus] = { - Future.fromTry(Try(pollStatus(handle))) - } + def pollStatusAsync(handle: StandardAsyncPendingExecutionHandle): Future[StandardAsyncRunStatus] = Future.fromTry(Try(pollStatus(handle))) /** * Adds custom behavior invoked when polling fails due to some exception. By default adds nothing. diff --git a/backend/src/main/scala/cromwell/backend/standard/StandardSyncExecutionActor.scala b/backend/src/main/scala/cromwell/backend/standard/StandardSyncExecutionActor.scala index c3cb05143..180f4d345 100644 --- a/backend/src/main/scala/cromwell/backend/standard/StandardSyncExecutionActor.scala +++ b/backend/src/main/scala/cromwell/backend/standard/StandardSyncExecutionActor.scala @@ -10,7 +10,6 @@ import cromwell.core.Dispatcher import cromwell.services.keyvalue.KeyValueServiceActor._ import scala.concurrent.{Future, Promise} -import scala.language.existentials trait StandardSyncExecutionActorParams extends StandardJobExecutionActorParams { /** The class for creating an async backend. */ diff --git a/core/src/main/scala/cromwell/core/ConfigUtil.scala b/core/src/main/scala/cromwell/core/ConfigUtil.scala index 881fec686..4098432c1 100644 --- a/core/src/main/scala/cromwell/core/ConfigUtil.scala +++ b/core/src/main/scala/cromwell/core/ConfigUtil.scala @@ -7,7 +7,7 @@ import cats.syntax.validated._ import com.typesafe.config.{Config, ConfigException, ConfigValue} import org.slf4j.LoggerFactory -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ import scala.reflect.{ClassTag, classTag} object ConfigUtil { @@ -15,7 +15,7 @@ object ConfigUtil { val validationLogger = LoggerFactory.getLogger("ConfigurationValidation") implicit class EnhancedConfig(val config: Config) extends AnyVal { - def keys = config.entrySet().toSet map { v: java.util.Map.Entry[String, ConfigValue] => v.getKey } + def keys = config.entrySet().asScala.toSet map { v: java.util.Map.Entry[String, ConfigValue] => v.getKey } /** * For keys that are in the configuration but not in the reference keySet, log a warning. diff --git a/core/src/main/scala/cromwell/core/path/BetterFileMethods.scala b/core/src/main/scala/cromwell/core/path/BetterFileMethods.scala index 5346ec70c..94c780a84 100644 --- a/core/src/main/scala/cromwell/core/path/BetterFileMethods.scala +++ b/core/src/main/scala/cromwell/core/path/BetterFileMethods.scala @@ -214,11 +214,11 @@ trait BetterFileMethods { betterFile.bufferedReader(codec) final def newBufferedWriter(implicit codec: Codec, openOptions: OpenOptions = OpenOptions.default): BufferedWriter = - betterFile.newBufferedWriter(codec) + betterFile.newBufferedWriter(codec, openOptions) final def bufferedWriter(implicit codec: Codec, openOptions: OpenOptions = OpenOptions.default): ManagedResource[BufferedWriter] = - betterFile.bufferedWriter(codec) + betterFile.bufferedWriter(codec, openOptions) final def newFileReader: FileReader = betterFile.newFileReader diff --git a/core/src/test/scala/cromwell/core/retry/RetrySpec.scala b/core/src/test/scala/cromwell/core/retry/RetrySpec.scala index 27f24076c..f62b49d47 100644 --- a/core/src/test/scala/cromwell/core/retry/RetrySpec.scala +++ b/core/src/test/scala/cromwell/core/retry/RetrySpec.scala @@ -34,7 +34,7 @@ class RetrySpec extends TestKitSuite("retry-spec") with FlatSpecLike with Matche isFatal: Throwable => Boolean = Retry.throwableToFalse): Future[Int] = { withRetry( - f = work.doIt, + f = () => work.doIt(), maxRetries = Option(retries), isTransient = isTransient, isFatal = isFatal diff --git a/cromwellApiClient/src/main/scala/cromwell/api/CromwellClient.scala b/cromwellApiClient/src/main/scala/cromwell/api/CromwellClient.scala index b8bbb4dd8..f9e3511e5 100644 --- a/cromwellApiClient/src/main/scala/cromwell/api/CromwellClient.scala +++ b/cromwellApiClient/src/main/scala/cromwell/api/CromwellClient.scala @@ -128,7 +128,7 @@ class CromwellClient(val cromwellUrl: URL, val apiVersion: String)(implicit acto private def decodeResponse(response: HttpResponse): Try[HttpResponse] = { decoders.get(response.encoding) map { decoder => - Try(decoder.decode(response)) + Try(decoder.decodeMessage(response)) } getOrElse Failure(UnsuccessfulRequestException(s"No decoder for ${response.encoding}", response)) } } diff --git a/cromwellApiClient/src/main/scala/cromwell/api/model/Label.scala b/cromwellApiClient/src/main/scala/cromwell/api/model/Label.scala index fb5e97669..fd9d88d21 100644 --- a/cromwellApiClient/src/main/scala/cromwell/api/model/Label.scala +++ b/cromwellApiClient/src/main/scala/cromwell/api/model/Label.scala @@ -1,6 +1,7 @@ package cromwell.api.model import spray.json.{DefaultJsonProtocol, JsObject, JsString, JsValue, RootJsonFormat} +import scala.language.postfixOps object LabelsJsonFormatter extends DefaultJsonProtocol { implicit object LabelJsonFormat extends RootJsonFormat[List[Label]] { diff --git a/database/migration/src/main/scala/cromwell/database/migration/custom/BatchedTaskChange.scala b/database/migration/src/main/scala/cromwell/database/migration/custom/BatchedTaskChange.scala index 17e844479..49db7e444 100644 --- a/database/migration/src/main/scala/cromwell/database/migration/custom/BatchedTaskChange.scala +++ b/database/migration/src/main/scala/cromwell/database/migration/custom/BatchedTaskChange.scala @@ -118,7 +118,8 @@ trait BatchedTaskChange extends MigrationTaskChange { resultBatch.close() val progress = Math.min((page + 1) * 100 / pageCount, 100) - logger.info(s"[$migrationName] $progress%") + val progressMessage = s"[$migrationName] $progress%" + logger.info(progressMessage) } if (batchMigrationCounter != 0) { diff --git a/database/sql/src/main/scala/cromwell/database/slick/SummaryStatusSlickDatabase.scala b/database/sql/src/main/scala/cromwell/database/slick/SummaryStatusSlickDatabase.scala index 6903a29e6..cc75511e2 100644 --- a/database/sql/src/main/scala/cromwell/database/slick/SummaryStatusSlickDatabase.scala +++ b/database/sql/src/main/scala/cromwell/database/slick/SummaryStatusSlickDatabase.scala @@ -9,8 +9,7 @@ trait SummaryStatusSlickDatabase { import dataAccess.driver.api._ - private[slick] def getSummaryStatusEntryMaximumId(summaryTableName: String, summarizedTableName: String) - (implicit ec: ExecutionContext): DBIO[Option[Long]] = { + private[slick] def getSummaryStatusEntryMaximumId(summaryTableName: String, summarizedTableName: String): DBIO[Option[Long]] = { dataAccess. maximumIdForSummaryTableNameSummarizedTableName((summaryTableName, summarizedTableName)). result.headOption diff --git a/dockerHashing/src/main/scala/cromwell/docker/local/DockerCliFlow.scala b/dockerHashing/src/main/scala/cromwell/docker/local/DockerCliFlow.scala index 055ef311e..94088beb4 100644 --- a/dockerHashing/src/main/scala/cromwell/docker/local/DockerCliFlow.scala +++ b/dockerHashing/src/main/scala/cromwell/docker/local/DockerCliFlow.scala @@ -4,7 +4,7 @@ import java.util.concurrent.TimeoutException import akka.actor.Scheduler import akka.stream.scaladsl.{Flow, GraphDSL, Merge, Partition} -import akka.stream.{ActorMaterializer, FlowShape} +import akka.stream.FlowShape import cromwell.docker.DockerHashActor._ import cromwell.docker.{DockerFlow, DockerHashActor, DockerHashResult, DockerImageIdentifierWithoutHash} @@ -15,8 +15,7 @@ import scala.util.{Failure, Success} /** * A docker flow using the CLI to return docker hashes. */ -class DockerCliFlow(implicit ec: ExecutionContext, materializer: ActorMaterializer, scheduler: Scheduler) - extends DockerFlow { +class DockerCliFlow(implicit ec: ExecutionContext, scheduler: Scheduler) extends DockerFlow { // If the docker cli hangs it would be difficult to debug. So timeout the first request after a short duration. // https://github.com/docker/docker/issues/18279 diff --git a/dockerHashing/src/main/scala/cromwell/docker/registryv2/flows/HttpFlowWithRetry.scala b/dockerHashing/src/main/scala/cromwell/docker/registryv2/flows/HttpFlowWithRetry.scala index 29aa39ede..d5d1d5776 100644 --- a/dockerHashing/src/main/scala/cromwell/docker/registryv2/flows/HttpFlowWithRetry.scala +++ b/dockerHashing/src/main/scala/cromwell/docker/registryv2/flows/HttpFlowWithRetry.scala @@ -13,7 +13,6 @@ import org.slf4j.LoggerFactory import scala.concurrent.duration._ import scala.concurrent.{ExecutionContext, Future} -import scala.language.postfixOps import scala.util.Try object HttpFlowWithRetry { @@ -37,8 +36,6 @@ object HttpFlowWithRetry { } } - def defaultRequestBackoff(): Backoff = SimpleExponentialBackoff(1 second, 2 minutes, 3D) - /** * In order to allow for retries, the http context object needs to encapsulate the original request, * so that it can be re-submitted if necessary. @@ -69,7 +66,7 @@ object HttpFlowWithRetry { case class HttpFlowWithRetry[T]( httpClientFlow: RetryableHttpFlow[T], retryBufferSize: Int = 100, - requestBackoff: () => Backoff = defaultRequestBackoff, + requestBackoff: () => Backoff = () => SimpleExponentialBackoff(1 second, 2 minutes, 3D), maxAttempts: Int = 3 )(implicit val scheduler: Scheduler, ec: ExecutionContext, mat: ActorMaterializer) { diff --git a/engine/src/main/scala/cromwell/engine/io/gcs/GcsResponse.scala b/engine/src/main/scala/cromwell/engine/io/gcs/GcsResponse.scala index ca0a7e83e..937e2b660 100644 --- a/engine/src/main/scala/cromwell/engine/io/gcs/GcsResponse.scala +++ b/engine/src/main/scala/cromwell/engine/io/gcs/GcsResponse.scala @@ -2,8 +2,6 @@ package cromwell.engine.io.gcs import cromwell.engine.io.IoActor._ -import scala.language.existentials - /** * ADT used only inside the batch stream * @tparam T final type of the result of the Command diff --git a/engine/src/main/scala/cromwell/engine/workflow/lifecycle/execution/EngineJobExecutionActor.scala b/engine/src/main/scala/cromwell/engine/workflow/lifecycle/execution/EngineJobExecutionActor.scala index c683b5d10..2d440ca34 100644 --- a/engine/src/main/scala/cromwell/engine/workflow/lifecycle/execution/EngineJobExecutionActor.scala +++ b/engine/src/main/scala/cromwell/engine/workflow/lifecycle/execution/EngineJobExecutionActor.scala @@ -570,7 +570,7 @@ class EngineJobExecutionActor(replyTo: ActorRef, case AbortedResponse(_: BackendJobDescriptorKey) => log.debug("{}: Won't save aborted job response to JobStore", jobTag) forwardAndStop(updatedData.response) - case JobFailedNonRetryableResponse(jobKey: BackendJobDescriptorKey, throwable: Throwable, returnCode: Option[Int]) => + case JobFailedNonRetryableResponse(jobKey, throwable: Throwable, returnCode: Option[Int]) => publishHashesToMetadata(updatedData.hashes) writeToMetadata(Map(callCachingAllowReuseMetadataKey -> false)) saveUnsuccessfulJobResults(jobKey, returnCode, throwable, retryable = false) diff --git a/engine/src/main/scala/cromwell/engine/workflow/lifecycle/execution/callcaching/CallCache.scala b/engine/src/main/scala/cromwell/engine/workflow/lifecycle/execution/callcaching/CallCache.scala index 7b069509d..0afff7212 100644 --- a/engine/src/main/scala/cromwell/engine/workflow/lifecycle/execution/callcaching/CallCache.scala +++ b/engine/src/main/scala/cromwell/engine/workflow/lifecycle/execution/callcaching/CallCache.scala @@ -41,8 +41,7 @@ class CallCache(database: CallCachingSqlDatabase) { } private def buildCallCachingJoin(callCachingEntry: CallCachingEntry, callCacheHashes: CallCacheHashes, - result: Iterable[WdlValueSimpleton], jobDetritus: Map[String, Path]) - (implicit ec: ExecutionContext): CallCachingJoin = { + result: Iterable[WdlValueSimpleton], jobDetritus: Map[String, Path]): CallCachingJoin = { val hashesToInsert: Iterable[CallCachingHashEntry] = { callCacheHashes.hashes map { hash => CallCachingHashEntry(hash.hashKey.key, hash.hashValue.value) } diff --git a/engine/src/main/scala/cromwell/server/CromwellRootActor.scala b/engine/src/main/scala/cromwell/server/CromwellRootActor.scala index 3520ce029..21b66b639 100644 --- a/engine/src/main/scala/cromwell/server/CromwellRootActor.scala +++ b/engine/src/main/scala/cromwell/server/CromwellRootActor.scala @@ -94,7 +94,7 @@ import scala.language.postfixOps lazy val googleFlow = new GoogleFlow(dockerHttpPool, dockerConf.gcrApiQueriesPer100Seconds)(ioEc, materializer, system.scheduler) lazy val dockerHubFlow = new DockerHubFlow(dockerHttpPool)(ioEc, materializer, system.scheduler) lazy val quayFlow = new QuayFlow(dockerHttpPool)(ioEc, materializer, system.scheduler) - lazy val dockerCliFlow = new DockerCliFlow()(ioEc, materializer, system.scheduler) + lazy val dockerCliFlow = new DockerCliFlow()(ioEc, system.scheduler) lazy val dockerFlows = dockerConf.method match { case DockerLocalLookup => Seq(dockerCliFlow) case DockerRemoteLookup => Seq(dockerHubFlow, googleFlow, quayFlow) diff --git a/engine/src/main/scala/cromwell/webservice/CromwellApiService.scala b/engine/src/main/scala/cromwell/webservice/CromwellApiService.scala index f59ee64d3..2d29bb4c5 100644 --- a/engine/src/main/scala/cromwell/webservice/CromwellApiService.scala +++ b/engine/src/main/scala/cromwell/webservice/CromwellApiService.scala @@ -89,7 +89,7 @@ trait CromwellApiService { } ~ encodeResponseWith(Gzip, Deflate, NoCoding) { path("workflows" / Segment / Segment / "metadata") { (version, possibleWorkflowId) => - parameters('includeKey.*, 'excludeKey.*, 'expandSubWorkflows.as[Boolean].?) { (includeKeys, excludeKeys, expandSubWorkflowsOption) => + parameters(('includeKey.*, 'excludeKey.*, 'expandSubWorkflows.as[Boolean].?)) { (includeKeys, excludeKeys, expandSubWorkflowsOption) => val includeKeysOption = NonEmptyList.fromList(includeKeys.toList) val excludeKeysOption = NonEmptyList.fromList(excludeKeys.toList) val expandSubWorkflows = expandSubWorkflowsOption.getOrElse(false) diff --git a/engine/src/main/scala/cromwell/webservice/LabelsManagerActor.scala b/engine/src/main/scala/cromwell/webservice/LabelsManagerActor.scala index 7a27e9ce1..e8659a04d 100644 --- a/engine/src/main/scala/cromwell/webservice/LabelsManagerActor.scala +++ b/engine/src/main/scala/cromwell/webservice/LabelsManagerActor.scala @@ -34,7 +34,7 @@ object LabelsManagerActor { } def metadataEventsToLabels(events: Iterable[MetadataEvent]): Map[String, String] = { - events map { case MetadataEvent(MetadataKey(_, _, key), Some(MetadataValue(value, _)), _) => key.split("\\:").last -> value } toMap + events collect { case MetadataEvent(MetadataKey(_, _, key), Some(MetadataValue(value, _)), _) => key.split("\\:").last -> value } toMap } def labelsToMetadataEvents(labels: Labels, workflowId: WorkflowId): Iterable[MetadataEvent] = { diff --git a/engine/src/test/scala/cromwell/webservice/CromwellApiServiceSpec.scala b/engine/src/test/scala/cromwell/webservice/CromwellApiServiceSpec.scala index 2acfa1f89..654a333aa 100644 --- a/engine/src/test/scala/cromwell/webservice/CromwellApiServiceSpec.scala +++ b/engine/src/test/scala/cromwell/webservice/CromwellApiServiceSpec.scala @@ -29,7 +29,7 @@ class CromwellApiServiceSpec extends AsyncFlatSpec with ScalatestRouteTest with val akkaHttpService = new MockApiService() val version = "v1" - implicit def default(implicit system: ActorSystem) = RouteTestTimeout(5.seconds) + implicit def default = RouteTestTimeout(5.seconds) behavior of "REST API /status endpoint" @@ -322,7 +322,7 @@ class CromwellApiServiceSpec extends AsyncFlatSpec with ScalatestRouteTest with check { status should be(StatusCodes.OK) val decoder: Decoder = Gzip - val result = Await.result(Unmarshal(decoder.decode(response)).to[JsObject], 1.second) + val result = Await.result(Unmarshal(decoder.decodeMessage(response)).to[JsObject], 1.second) result.fields.keys should contain allOf("testKey1", "testKey2") result.fields.keys shouldNot contain("testKey3") result.fields("testKey1") should be(JsString("myValue1")) @@ -336,7 +336,7 @@ class CromwellApiServiceSpec extends AsyncFlatSpec with ScalatestRouteTest with check { status should be(StatusCodes.OK) val decoder: Decoder = Gzip - val result = Await.result(Unmarshal(decoder.decode(response)).to[JsObject], 1.second) + val result = Await.result(Unmarshal(decoder.decodeMessage(response)).to[JsObject], 1.second) result.fields.keys should contain allOf("testKey1a", "testKey1b", "testKey2a") result.fields.keys should contain noneOf("testKey2b", "testKey3") result.fields("testKey1a") should be(JsString("myValue1a")) @@ -351,7 +351,7 @@ class CromwellApiServiceSpec extends AsyncFlatSpec with ScalatestRouteTest with check { status should be(StatusCodes.OK) val decoder: Decoder = Gzip - val result = Await.result(Unmarshal(decoder.decode(response)).to[JsObject], 1.second) + val result = Await.result(Unmarshal(decoder.decodeMessage(response)).to[JsObject], 1.second) result.fields.keys should contain allOf("testKey1a", "testKey1b", "testKey2a") result.fields.keys should contain noneOf("testKey2b", "testKey3") result.fields("testKey1a") should be(JsString("myValue1a")) @@ -369,7 +369,7 @@ class CromwellApiServiceSpec extends AsyncFlatSpec with ScalatestRouteTest with } val decoder: Decoder = Gzip - Unmarshal(decoder.decode(response)).to[String] map { r => + Unmarshal(decoder.decodeMessage(response)).to[String] map { r => assertResult( s"""{ | "status": "fail", @@ -512,6 +512,7 @@ object CromwellApiServiceSpec { events.head.key.workflowId match { case CromwellApiServiceSpec.ExistingWorkflowId => sender ! MetadataWriteSuccess(events) case CromwellApiServiceSpec.AbortedWorkflowId => sender ! MetadataWriteFailure(new Exception("mock exception of db failure"), events) + case WorkflowId(_) => throw new Exception("Something untoward happened, this situation is not believed to be possible at this time") } } } @@ -524,10 +525,10 @@ object CromwellApiServiceSpec { sender ! response case AbortWorkflow(id, manager) => val message = id match { - case ExistingWorkflowId => - WorkflowStoreEngineActor.WorkflowAborted(id) + case ExistingWorkflowId => WorkflowStoreEngineActor.WorkflowAborted(id) case AbortedWorkflowId => WorkflowAbortFailed(id, new IllegalStateException(s"Workflow ID '$id' is in terminal state 'Aborted' and cannot be aborted.")) + case WorkflowId(_) => throw new Exception("Something untoward happened") } sender ! message } diff --git a/filesystems/gcs/src/main/scala/cromwell/filesystems/gcs/GoogleConfiguration.scala b/filesystems/gcs/src/main/scala/cromwell/filesystems/gcs/GoogleConfiguration.scala index a183ceae0..34c1bff53 100644 --- a/filesystems/gcs/src/main/scala/cromwell/filesystems/gcs/GoogleConfiguration.scala +++ b/filesystems/gcs/src/main/scala/cromwell/filesystems/gcs/GoogleConfiguration.scala @@ -57,7 +57,7 @@ object GoogleConfiguration { private val log = LoggerFactory.getLogger("GoogleConfiguration") - case class GoogleConfigurationException(errorMessages: List[String]) extends MessageAggregation { + final case class GoogleConfigurationException(errorMessages: List[String]) extends MessageAggregation { override val exceptionContext = "Google configuration" } diff --git a/project/Dependencies.scala b/project/Dependencies.scala index c02a48d5d..86a34562e 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -4,18 +4,19 @@ object Dependencies { lazy val lenthallV = "0.25" lazy val wdl4sV = "0.13" - lazy val akkaV = "2.4.16" - lazy val akkaHttpV = "10.0.5" + lazy val akkaV = "2.4.17" + lazy val akkaHttpV = "10.0.9" lazy val slickV = "3.2.0" - // TODO: Re-combine these when cromwell is 2.12: - lazy val cromwellApiClientAkkaV = "2.4.17" - lazy val cromwellApiClientAkkaHttpV = "10.0.6" + lazy val googleClientApiV = "1.22.0" lazy val googleGenomicsServicesApiV = "1.22.0" lazy val betterFilesV = "2.17.1" lazy val catsV = "0.9.0" - lazy val fs2V = "0.9.6" + lazy val fs2V = "0.9.7" + + lazy val pegdownV = "1.6.0" + lazy val scalatestV = "3.0.2" // Internal collections of dependencies @@ -23,32 +24,32 @@ object Dependencies { private val catsDependencies = List( "org.typelevel" %% "cats" % catsV, - "com.github.benhutchison" %% "mouse" % "0.6" + "com.github.benhutchison" %% "mouse" % "0.9" ) map (_ /* Exclude test framework cats-laws and its transitive dependency scalacheck. If sbt detects scalacheck, it tries to run it. Explicitly excluding the two problematic artifacts instead of including the three (or four?). https://github.com/typelevel/cats/tree/v0.7.2#getting-started - Re "_2.11", see also: https://github.com/sbt/sbt/issues/1518 + Re "_2.12", see also: https://github.com/sbt/sbt/issues/1518 */ - exclude("org.typelevel", "cats-laws_2.11") - exclude("org.typelevel", "cats-kernel-laws_2.11") + exclude("org.typelevel", "cats-laws_2.12") + exclude("org.typelevel", "cats-kernel-laws_2.12") ) private val baseDependencies = List( "org.broadinstitute" %% "lenthall" % lenthallV, - "com.iheart" %% "ficus" % "1.3.0", - "org.scalatest" %% "scalatest" % "3.0.0" % Test, - "org.pegdown" % "pegdown" % "1.6.0" % Test, - "org.specs2" %% "specs2-mock" % "3.8.5" % Test + "com.iheart" %% "ficus" % "1.4.1", + "org.scalatest" %% "scalatest" % scalatestV % Test, + "org.pegdown" % "pegdown" % pegdownV % Test, + "org.specs2" %% "specs2-mock" % "3.8.9" % Test // 3.9.X doesn't enjoy the spark backend or refined ) ++ catsDependencies :+ fs2Test private val slf4jBindingDependencies = List( // http://logback.qos.ch/dependencies.html - "ch.qos.logback" % "logback-classic" % "1.2.1", - "ch.qos.logback" % "logback-access" % "1.2.1", - "org.codehaus.janino" % "janino" % "3.0.1" + "ch.qos.logback" % "logback-classic" % "1.2.3", + "ch.qos.logback" % "logback-access" % "1.2.3", + "org.codehaus.janino" % "janino" % "3.0.7" ) private val slickDependencies = List( @@ -73,7 +74,7 @@ object Dependencies { private val googleApiClientDependencies = List( // Used by swagger, but only in tests. This overrides an older 2.1.3 version of jackson-core brought in by // these Google dependencies, but which isn't properly evicted by IntelliJ's sbt integration. - "com.fasterxml.jackson.core" % "jackson-core" % "2.8.2", + "com.fasterxml.jackson.core" % "jackson-core" % "2.8.9", // The exclusions prevent guava 13 from colliding at assembly time with guava 18 brought in elsewhere. "com.google.api-client" % "google-api-client-java6" % googleClientApiV exclude("com.google.guava", "guava-jdk5"), "com.google.api-client" % "google-api-client-jackson2" % googleClientApiV exclude("com.google.guava", "guava-jdk5") @@ -81,11 +82,11 @@ object Dependencies { private val googleCloudDependencies = List( "com.google.apis" % "google-api-services-genomics" % ("v1alpha2-rev64-" + googleGenomicsServicesApiV), - "com.google.cloud" % "google-cloud-nio" % "0.17.2-alpha" + "com.google.cloud" % "google-cloud-nio" % "0.20.1-alpha" exclude("com.google.api.grpc", "grpc-google-common-protos") exclude("com.google.cloud.datastore", "datastore-v1-protos") exclude("org.apache.httpcomponents", "httpclient"), - "org.apache.httpcomponents" % "httpclient" % "4.5.2" + "org.apache.httpcomponents" % "httpclient" % "4.5.3" ) private val dbmsDependencies = List( @@ -103,7 +104,7 @@ object Dependencies { private val refinedTypeDependenciesList = List( "org.scala-lang" % "scala-compiler" % Settings.ScalaVersion, - "eu.timepit" %% "refined" % "0.7.0" + "eu.timepit" %% "refined" % "0.8.2" ) // Sub-project dependencies, added in addition to any dependencies inherited from .dependsOn(). @@ -115,16 +116,16 @@ object Dependencies { val databaseSqlDependencies = baseDependencies ++ slickDependencies ++ dbmsDependencies ++ refinedTypeDependenciesList val coreDependencies = List( - "com.typesafe.scala-logging" %% "scala-logging" % "3.4.0", + "com.typesafe.scala-logging" %% "scala-logging" % "3.6.0", "org.broadinstitute" %% "wdl4s" % wdl4sV, - "org.apache.commons" % "commons-lang3" % "3.4", + "org.apache.commons" % "commons-lang3" % "3.6", "com.typesafe.akka" %% "akka-http-spray-json" % akkaHttpV, - "com.typesafe" % "config" % "1.3.0", + "com.typesafe" % "config" % "1.3.1", "com.typesafe.akka" %% "akka-actor" % akkaV, "com.typesafe.akka" %% "akka-slf4j" % akkaV, "com.typesafe.akka" %% "akka-testkit" % akkaV % Test, - "com.google.guava" % "guava" % "20.0", - "com.google.auth" % "google-auth-library-oauth2-http" % "0.6.0", + "com.google.guava" % "guava" % "22.0", + "com.google.auth" % "google-auth-library-oauth2-http" % "0.7.0", "com.typesafe.akka" %% "akka-stream-testkit" % akkaV, "com.chuusai" %% "shapeless" % "2.3.2" ) ++ baseDependencies ++ googleApiClientDependencies ++ @@ -135,14 +136,13 @@ object Dependencies { "com.github.pathikrit" %% "better-files" % betterFilesV % Test ) ++ liquibaseDependencies ++ dbmsDependencies - // FIXME: this needs to be cleaned up w/ 2.12 move val cromwellApiClientDependencies = List( - "com.typesafe.akka" %% "akka-actor" % cromwellApiClientAkkaV, - "com.typesafe.akka" %% "akka-http" % cromwellApiClientAkkaHttpV, - "com.typesafe.akka" %% "akka-http-spray-json" % cromwellApiClientAkkaHttpV, - "com.github.pathikrit" %% "better-files" % "3.0.0", - "org.scalatest" %% "scalatest" % "3.0.1" % Test, - "org.pegdown" % "pegdown" % "1.6.0" % Test + "com.typesafe.akka" %% "akka-actor" % akkaV, + "com.typesafe.akka" %% "akka-http" % akkaHttpV, + "com.typesafe.akka" %% "akka-http-spray-json" % akkaHttpV, + "com.github.pathikrit" %% "better-files" % betterFilesV, + "org.scalatest" %% "scalatest" % scalatestV % Test, + "org.pegdown" % "pegdown" % pegdownV % Test ) val engineDependencies = List( @@ -150,9 +150,10 @@ object Dependencies { "commons-io" % "commons-io" % "2.5", "com.storm-enroute" %% "scalameter" % "0.8.2" exclude("com.fasterxml.jackson.core", "jackson-databind") - exclude("com.fasterxml.jackson.module", "jackson-module-scala"), - "com.fasterxml.jackson.core" % "jackson-databind" % "2.7.9.1", - "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.7.9", + exclude("com.fasterxml.jackson.module", "jackson-module-scala") + exclude("org.scala-tools.testing", "test-interface"), + "com.fasterxml.jackson.core" % "jackson-databind" % "2.8.9", + "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.8.9", "io.swagger" % "swagger-parser" % "1.0.22" % Test, "org.yaml" % "snakeyaml" % "1.17" % Test ) ++ akkaHttpServerDependencies diff --git a/project/Settings.scala b/project/Settings.scala index 3a1dc01b6..b59c23041 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -25,17 +25,16 @@ object Settings { https://github.com/sbt/sbt-assembly/issues/69 https://github.com/scala/pickling/issues/10 - Other fancy flags from - - http://blog.threatstack.com/useful-scalac-options-for-better-scala-development-part-1 - - and - - https://tpolecat.github.io/2014/04/11/scalac-flags.html + Other fancy flags from https://tpolecat.github.io/2017/04/25/scalac-flags.html. + The following aren't used (yet), and in general are an exercise in pain for 2.12 with Cromwell. They'd + certainly be nice to have, but params causes a world of hurt and patvars is just going to be a big time sink. + Interested parties are encouraged to take a stab at it. + "-Ywarn-unused:params", // Warn if a value parameter is unused. + "-Ywarn-unused:patvars", // Warn if a variable bound in a pattern is unused. */ val compilerSettings = List( - "-Xlint", + "-explaintypes", "-feature", "-Xmax-classfile-name", "200", "-target:jvm-1.8", @@ -43,12 +42,32 @@ object Settings { "-unchecked", "-deprecation", "-Xfuture", + "-Xlint:adapted-args", + "-Xlint:by-name-right-associative", + "-Xlint:constant", + "-Xlint:delayedinit-select", + "-Xlint:doc-detached", + "-Xlint:inaccessible", + "-Xlint:infer-any", + "-Xlint:missing-interpolator", + "-Xlint:nullary-override", + "-Xlint:nullary-unit", + "-Xlint:option-implicit", + "-Xlint:package-object-classes", + "-Xlint:poly-implicit-overload", + "-Xlint:private-shadow", + "-Xlint:stars-align", + "-Xlint:type-parameter-shadow", + "-Xlint:unsound-match", "-Yno-adapted-args", "-Ywarn-dead-code", "-Ywarn-numeric-widen", "-Ywarn-value-discard", - "-Ywarn-unused", - "-Ywarn-unused-import", + "-Ywarn-inaccessible", + "-Ywarn-unused:implicits", + "-Ywarn-unused:imports", + "-Ywarn-unused:privates", + "-Ywarn-unused:locals", "-Xfatal-warnings" ) @@ -100,7 +119,7 @@ object Settings { ) ) - val ScalaVersion = "2.11.8" + val ScalaVersion = "2.12.2" val commonSettings = ReleasePlugin.projectSettings ++ testSettings ++ assemblySettings ++ dockerSettings ++ cromwellVersionWithGit ++ publishingSettings ++ List( organization := "org.broadinstitute", @@ -139,11 +158,9 @@ object Settings { name := "cromwell-api-client", libraryDependencies ++= cromwellApiClientDependencies, organization := "org.broadinstitute", - scalaVersion := "2.12.1", + scalaVersion := ScalaVersion, + scalacOptions ++= compilerSettings, resolvers ++= commonResolvers - // scalacOptions ++= compilerSettings, - // scalacOptions in (Compile, doc) ++= docSettings, - // parallelExecution := false ) ++ ReleasePlugin.projectSettings ++ testSettings ++ assemblySettings ++ cromwellVersionWithGit ++ publishingSettings diff --git a/project/build.properties b/project/build.properties index 35c88bab7..64317fdae 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=0.13.12 +sbt.version=0.13.15 diff --git a/release/release_workflow.wdl b/release/release_workflow.wdl index 5bd0b004e..49a490465 100644 --- a/release/release_workflow.wdl +++ b/release/release_workflow.wdl @@ -316,8 +316,8 @@ workflow release_cromwell { dependencyCommands = cromwellDependencyCommands.updateCommand } - call wait_for_artifactory as waitForLenthall { input: repo = "lenthall_2.11", version = release_lenthall.version } - call wait_for_artifactory as waitForWdl4s { input: repo = "wdl4s_2.11", version = release_wdl4s.version } + call wait_for_artifactory as waitForLenthall { input: repo = "lenthall_2.12", version = release_lenthall.version } + call wait_for_artifactory as waitForWdl4s { input: repo = "wdl4s_2.12", version = release_wdl4s.version } # Generates commands to update wdl4s dependencies scatter(wdl4sDependency in wdl4sDependencies) { @@ -355,7 +355,7 @@ workflow release_cromwell { } } - File cromwellJar = release_cromwell.executionDir + "/target/scala-2.11/cromwell-" + cromwellPrep.version + ".jar" + File cromwellJar = release_cromwell.executionDir + "/target/scala-2.12/cromwell-" + cromwellPrep.version + ".jar" # Version that was just released Int cromwellVersionAsInt = cromwellPrep.version # Previous version diff --git a/services/src/main/scala/cromwell/services/metadata/impl/MetadataDatabaseAccess.scala b/services/src/main/scala/cromwell/services/metadata/impl/MetadataDatabaseAccess.scala index 6ad24c9e9..6e1b356df 100644 --- a/services/src/main/scala/cromwell/services/metadata/impl/MetadataDatabaseAccess.scala +++ b/services/src/main/scala/cromwell/services/metadata/impl/MetadataDatabaseAccess.scala @@ -125,6 +125,7 @@ trait MetadataDatabaseAccess { case MetadataQuery(_, None, None, Some(includeKeys), Some(excludeKeys), _) => Future.failed( new IllegalArgumentException( s"Include/Exclude keys may not be mixed: include = $includeKeys, exclude = $excludeKeys")) + case _ => Future.failed(new IllegalArgumentException(s"Invalid MetadataQuery: $query")) } futureMetadata map metadataToMetadataEvents(query.workflowId) diff --git a/services/src/test/scala/cromwell/services/ServicesStoreSpec.scala b/services/src/test/scala/cromwell/services/ServicesStoreSpec.scala index 603bf2906..b2a50ae6f 100644 --- a/services/src/test/scala/cromwell/services/ServicesStoreSpec.scala +++ b/services/src/test/scala/cromwell/services/ServicesStoreSpec.scala @@ -482,9 +482,7 @@ object ServicesStoreSpec { (referenceProfile: ReferenceProfile, referenceDatabase: ReferenceProfile#Backend#Database, comparisonProfile: ComparisonProfile, - comparisonDatabase: ComparisonProfile#Backend#Database)(block: DiffResult => T) - (implicit executor: ExecutionContext): T = { - + comparisonDatabase: ComparisonProfile#Backend#Database)(block: DiffResult => T): T = { withConnections(referenceProfile, referenceDatabase, comparisonProfile, comparisonDatabase) { LiquibaseUtils.compare(_, _)(block) } diff --git a/src/bin/travis/testCentaurJes.sh b/src/bin/travis/testCentaurJes.sh index 0d46b7694..aa398e2b2 100755 --- a/src/bin/travis/testCentaurJes.sh +++ b/src/bin/travis/testCentaurJes.sh @@ -108,9 +108,9 @@ fi # Upload the built Cromwell jar to GCS so we can use it in our centaur test. Set an exit trap to clean it up on failure JAR_GCS_PATH=gs://cloud-cromwell-dev/travis-centaur/${CROMWELL_JAR} -gsutil cp target/scala-2.11/cromwell-*.jar "${JAR_GCS_PATH}" +gsutil cp target/scala-2.12/cromwell-*.jar "${JAR_GCS_PATH}" -java -Dconfig.file=./jes.conf -jar target/scala-2.11/cromwell-*.jar run src/bin/travis/resources/centaur.wdl src/bin/travis/resources/centaur.inputs | tee log.txt +java -Dconfig.file=./jes.conf -jar target/scala-2.12/cromwell-*.jar run src/bin/travis/resources/centaur.wdl src/bin/travis/resources/centaur.inputs | tee log.txt EXIT_CODE="${PIPESTATUS[0]}" # The perl code below is to remove our lovely color highlighting diff --git a/src/bin/travis/testCentaurLocal.sh b/src/bin/travis/testCentaurLocal.sh index c7802b30f..ba8138f2c 100755 --- a/src/bin/travis/testCentaurLocal.sh +++ b/src/bin/travis/testCentaurLocal.sh @@ -87,7 +87,7 @@ mysql -u root -e "CREATE USER 'travis'@'localhost' IDENTIFIED BY '';" mysql -u root -e "GRANT ALL PRIVILEGES ON cromwell_test . * TO 'travis'@'localhost';" sbt assembly -CROMWELL_JAR=$(find "$(pwd)/target/scala-2.11" -name "cromwell-*.jar") +CROMWELL_JAR=$(find "$(pwd)/target/scala-2.12" -name "cromwell-*.jar") LOCAL_CONF="$(pwd)/src/bin/travis/resources/local_centaur.conf" git clone https://github.com/broadinstitute/centaur.git cd centaur diff --git a/src/bin/travis/testCentaurTes.sh b/src/bin/travis/testCentaurTes.sh index bce555e12..166a7be61 100755 --- a/src/bin/travis/testCentaurTes.sh +++ b/src/bin/travis/testCentaurTes.sh @@ -42,7 +42,7 @@ mysql -u root -e "GRANT ALL PRIVILEGES ON cromwell_test . * TO 'travis'@'localho WORKDIR=$(pwd) sbt assembly -CROMWELL_JAR=$(find "$(pwd)/target/scala-2.11" -name "cromwell-*.jar") +CROMWELL_JAR=$(find "$(pwd)/target/scala-2.12" -name "cromwell-*.jar") TES_CENTAUR_CONF="$(pwd)/src/bin/travis/resources/tes_centaur.conf" git clone https://github.com/broadinstitute/centaur.git cd centaur diff --git a/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/JesAsyncBackendJobExecutionActor.scala b/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/JesAsyncBackendJobExecutionActor.scala index f617e89ac..5e4869854 100644 --- a/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/JesAsyncBackendJobExecutionActor.scala +++ b/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/JesAsyncBackendJobExecutionActor.scala @@ -31,7 +31,7 @@ import wdl4s.values._ import scala.collection.JavaConverters._ import scala.concurrent.duration._ -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.Future import scala.language.postfixOps import scala.util.{Success, Try} @@ -285,15 +285,11 @@ class JesAsyncBackendJobExecutionActor(override val standardParams: StandardAsyn override def isTransient(throwable: Throwable): Boolean = isTransientJesException(throwable) - override def executeAsync()(implicit ec: ExecutionContext): Future[ExecutionHandle] = { - runWithJes(None) - } + override def executeAsync(): Future[ExecutionHandle] = runWithJes(None) val futureKvJobKey = KvJobKey(jobDescriptor.key.call.fullyQualifiedName, jobDescriptor.key.index, jobDescriptor.key.attempt + 1) - override def recoverAsync(jobId: StandardAsyncJob)(implicit ec: ExecutionContext): Future[ExecutionHandle] = { - runWithJes(Option(jobId)) - } + override def recoverAsync(jobId: StandardAsyncJob): Future[ExecutionHandle] = runWithJes(Option(jobId)) private def runWithJes(jobForResumption: Option[StandardAsyncJob]): Future[ExecutionHandle] = { // Want to force runtimeAttributes to evaluate so we can fail quickly now if we need to: @@ -329,12 +325,7 @@ class JesAsyncBackendJobExecutionActor(override val standardParams: StandardAsyn } } - - override def pollStatusAsync(handle: JesPendingExecutionHandle) - (implicit ec: ExecutionContext): Future[RunStatus] = { - super[JesStatusRequestClient].pollStatus(handle.runInfo.get) - } - + override def pollStatusAsync(handle: JesPendingExecutionHandle): Future[RunStatus] = super[JesStatusRequestClient].pollStatus(handle.runInfo.get) override def customPollStatusFailure: PartialFunction[(ExecutionHandle, Exception), ExecutionHandle] = { case (oldHandle: JesPendingExecutionHandle@unchecked, e: GoogleJsonResponseException) if e.getStatusCode == 404 => diff --git a/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/JesAttributes.scala b/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/JesAttributes.scala index 08e57d87c..3bd1a2c04 100644 --- a/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/JesAttributes.scala +++ b/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/JesAttributes.scala @@ -18,7 +18,7 @@ import net.ceedubs.ficus.Ficus._ import net.ceedubs.ficus.readers.{StringReader, ValueReader} import org.slf4j.{Logger, LoggerFactory} -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ case class JesAttributes(project: String, computeServiceAccount: String, @@ -60,7 +60,7 @@ object JesAttributes { implicit val urlReader: ValueReader[URL] = StringReader.stringValueReader.map { URI.create(_).toURL } def apply(googleConfig: GoogleConfiguration, backendConfig: Config): JesAttributes = { - val configKeys = backendConfig.entrySet().toSet map { entry: java.util.Map.Entry[String, ConfigValue] => entry.getKey } + val configKeys = backendConfig.entrySet().asScala.toSet map { entry: java.util.Map.Entry[String, ConfigValue] => entry.getKey } warnNotRecognized(configKeys, jesKeys, context, Logger) def warnDeprecated(keys: Set[String], deprecated: Map[String, String], context: String, logger: Logger) = { diff --git a/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/JesJobPaths.scala b/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/JesJobPaths.scala index 3ce09f9e4..e3c349ec0 100644 --- a/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/JesJobPaths.scala +++ b/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/JesJobPaths.scala @@ -1,6 +1,5 @@ package cromwell.backend.impl.jes -import akka.actor.ActorSystem import cromwell.backend.BackendJobDescriptorKey import cromwell.backend.io.JobPaths import cromwell.core.path.Path @@ -11,7 +10,7 @@ object JesJobPaths { val GcsExecPathKey = "gcsExec" } -case class JesJobPaths(override val workflowPaths: JesWorkflowPaths, jobKey: BackendJobDescriptorKey)(implicit actorSystem: ActorSystem) extends JobPaths { +final case class JesJobPaths(override val workflowPaths: JesWorkflowPaths, jobKey: BackendJobDescriptorKey) extends JobPaths { val jesLogBasename = { val index = jobKey.index.map(s => s"-$s").getOrElse("") diff --git a/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/statuspolling/JesApiQueryManager.scala b/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/statuspolling/JesApiQueryManager.scala index 53a55b368..dd65d8225 100644 --- a/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/statuspolling/JesApiQueryManager.scala +++ b/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/statuspolling/JesApiQueryManager.scala @@ -78,7 +78,8 @@ class JesApiQueryManager(val qps: Int Refined Positive) extends Actor with Actor workQueue = beheaded.newWorkQueue } - private final case class BeheadedWorkQueue(workToDo: Option[NonEmptyList[JesApiQuery]], newWorkQueue: Queue[JesApiQuery]) + // Intentionally not final, this runs afoul of SI-4440 (I believe) + private case class BeheadedWorkQueue(workToDo: Option[NonEmptyList[JesApiQuery]], newWorkQueue: Queue[JesApiQuery]) private def beheadWorkQueue(maxBatchSize: Int): BeheadedWorkQueue = { val head = workQueue.take(maxBatchSize).toList diff --git a/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/statuspolling/JesPollingActor.scala b/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/statuspolling/JesPollingActor.scala index 4f0aff53d..0d953d251 100644 --- a/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/statuspolling/JesPollingActor.scala +++ b/supportedBackends/jes/src/main/scala/cromwell/backend/impl/jes/statuspolling/JesPollingActor.scala @@ -14,7 +14,7 @@ import eu.timepit.refined.numeric._ import scala.concurrent.{ExecutionContext, Future} import scala.util.{Failure, Success, Try} import scala.concurrent.duration._ -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ /** * Sends batched requests to JES as a worker to the JesApiQueryManager @@ -91,7 +91,7 @@ class JesPollingActor(val pollingManager: ActorRef, val qps: Int Refined Positiv () } - private[statuspolling] def mkErrorString(e: GoogleJsonError) = e.getErrors.toList.mkString(", ") + private[statuspolling] def mkErrorString(e: GoogleJsonError) = e.getErrors.asScala.toList.mkString(", ") } object JesPollingActor { diff --git a/supportedBackends/tes/src/main/scala/cromwell/backend/impl/tes/TesAsyncBackendJobExecutionActor.scala b/supportedBackends/tes/src/main/scala/cromwell/backend/impl/tes/TesAsyncBackendJobExecutionActor.scala index 774b54b88..58a8a0753 100644 --- a/supportedBackends/tes/src/main/scala/cromwell/backend/impl/tes/TesAsyncBackendJobExecutionActor.scala +++ b/supportedBackends/tes/src/main/scala/cromwell/backend/impl/tes/TesAsyncBackendJobExecutionActor.scala @@ -18,7 +18,7 @@ import akka.http.scaladsl.unmarshalling.{Unmarshal, Unmarshaller} import akka.stream.ActorMaterializer import scala.concurrent.duration._ -import scala.concurrent.{ExecutionContext, Future} +import scala.concurrent.Future import scala.language.postfixOps import scala.util.{Failure, Success} @@ -115,7 +115,7 @@ class TesAsyncBackendJobExecutionActor(override val standardParams: StandardAsyn ) } - override def executeAsync()(implicit ec: ExecutionContext): Future[ExecutionHandle] = { + override def executeAsync(): Future[ExecutionHandle] = { // create call exec dir tesJobPaths.callExecutionRoot.createPermissionedDirectories() val taskMessage = createTaskMessage() @@ -126,7 +126,7 @@ class TesAsyncBackendJobExecutionActor(override val standardParams: StandardAsyn } yield PendingExecutionHandle(jobDescriptor, StandardAsyncJob(ctr.id), None, previousStatus = None) } - override def recoverAsync(jobId: StandardAsyncJob)(implicit ec: ExecutionContext) = executeAsync() + override def recoverAsync(jobId: StandardAsyncJob) = executeAsync() override def tryAbort(job: StandardAsyncJob): Unit = { @@ -148,7 +148,7 @@ class TesAsyncBackendJobExecutionActor(override val standardParams: StandardAsyn () } - override def pollStatusAsync(handle: StandardAsyncPendingExecutionHandle)(implicit ec: ExecutionContext): Future[TesRunStatus] = { + override def pollStatusAsync(handle: StandardAsyncPendingExecutionHandle): Future[TesRunStatus] = { makeRequest[MinimalTaskView](HttpRequest(uri = s"$tesEndpoint/${handle.pendingJob.jobId}?view=MINIMAL")) map { response => val state = response.state