You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@openwhisk.apache.org by GitBox <gi...@apache.org> on 2018/04/13 08:10:46 UTC

[GitHub] markusthoemmes closed pull request #3211: implement ContainerFactory.cpuShare to fix #3110

markusthoemmes closed pull request #3211: implement ContainerFactory.cpuShare to fix #3110
URL: https://github.com/apache/incubator-openwhisk/pull/3211
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/ansible/roles/invoker/tasks/deploy.yml b/ansible/roles/invoker/tasks/deploy.yml
index e9302eb087..a1aca1215b 100644
--- a/ansible/roles/invoker/tasks/deploy.yml
+++ b/ansible/roles/invoker/tasks/deploy.yml
@@ -192,9 +192,9 @@
         {% for item in (invoker_container_network_dns_servers | default()).split(' ')  %}
         -e CONFIG_whisk_containerFactory_containerArgs_dnsServers_{{loop.index0}}={{ item }}
         {% endfor %}
-        -e INVOKER_NUMCORE='{{ invoker.numcore }}'
-        -e INVOKER_CORESHARE='{{ invoker.coreshare }}'
-        -e INVOKER_USE_RUNC='{{ invoker.useRunc }}'
+        -e CONFIG_whisk_containerPool_numCore='{{ invoker.numcore }}'
+        -e CONFIG_whisk_containerPool_coreShare='{{ invoker.coreshare }}'
+        -e CONFIG_whisk_docker_containerFactory_useRunc='{{ invoker.useRunc }}'
         -e INVOKER_NAME='{{ groups['invokers'].index(inventory_hostname) }}'
         -e WHISK_LOGS_DIR='{{ whisk_logs_dir }}'
         -e METRICS_KAMON='{{ metrics.kamon.enabled }}'
diff --git a/common/scala/src/main/scala/whisk/core/WhiskConfig.scala b/common/scala/src/main/scala/whisk/core/WhiskConfig.scala
index 87793230ef..eb22e9de43 100644
--- a/common/scala/src/main/scala/whisk/core/WhiskConfig.scala
+++ b/common/scala/src/main/scala/whisk/core/WhiskConfig.scala
@@ -58,9 +58,6 @@ class WhiskConfig(requiredProperties: Map[String, String],
   val dockerImagePrefix = this(WhiskConfig.dockerImagePrefix)
   val dockerImageTag = this(WhiskConfig.dockerImageTag)
 
-  val invokerNumCore = this(WhiskConfig.invokerNumCore)
-  val invokerCoreShare = this(WhiskConfig.invokerCoreShare)
-  val invokerUseRunc = this.getAsBoolean(WhiskConfig.invokerUseRunc, true)
   val invokerName = this(WhiskConfig.invokerName)
 
   val wskApiHost = this(WhiskConfig.wskApiProtocol) + "://" + this(WhiskConfig.wskApiHostname) + ":" + this(
@@ -170,9 +167,6 @@ object WhiskConfig {
   val dockerImagePrefix = "docker.image.prefix"
   val dockerImageTag = "docker.image.tag"
 
-  val invokerNumCore = "invoker.numcore"
-  val invokerCoreShare = "invoker.coreshare"
-  val invokerUseRunc = "invoker.use.runc"
   val invokerName = "invoker.name"
 
   val wskApiProtocol = "whisk.api.host.proto"
@@ -233,10 +227,12 @@ object ConfigKeys {
 
   val docker = "whisk.docker"
   val dockerTimeouts = s"$docker.timeouts"
+  val dockerContainerFactory = s"${docker}.container-factory"
   val runc = "whisk.runc"
   val runcTimeouts = s"$runc.timeouts"
   val containerFactory = "whisk.container-factory"
   val containerArgs = s"$containerFactory.container-args"
+  val containerPool = "whisk.container-pool"
   val blacklist = "whisk.blacklist"
 
   val kubernetes = "whisk.kubernetes"
diff --git a/common/scala/src/main/scala/whisk/core/containerpool/ContainerFactory.scala b/common/scala/src/main/scala/whisk/core/containerpool/ContainerFactory.scala
index 17860c015c..35d3b8bb0c 100644
--- a/common/scala/src/main/scala/whisk/core/containerpool/ContainerFactory.scala
+++ b/common/scala/src/main/scala/whisk/core/containerpool/ContainerFactory.scala
@@ -31,6 +31,23 @@ case class ContainerArgsConfig(network: String,
                                dnsServers: Seq[String] = Seq.empty,
                                extraArgs: Map[String, Set[String]] = Map.empty)
 
+case class ContainerPoolConfig(numCore: Int, coreShare: Int) {
+
+  /**
+   * The total number of containers is simply the number of cores dilated by the cpu sharing.
+   */
+  def maxActiveContainers = numCore * coreShare
+
+  /**
+   * The shareFactor indicates the number of containers that would share a single core, on average.
+   * cpuShare is a docker option (-c) whereby a container's CPU access is limited.
+   * A value of 1024 is the full share so a strict resource division with a shareFactor of 2 would yield 512.
+   * On an idle/underloaded system, a container will still get to use underutilized CPU shares.
+   */
+  private val totalShare = 1024.0 // This is a pre-defined value coming from docker and not our hard-coded value.
+  def cpuShare = (totalShare / maxActiveContainers).toInt
+}
+
 /**
  * An abstraction for Container creation
  */
@@ -41,7 +58,8 @@ trait ContainerFactory {
                       name: String,
                       actionImage: ExecManifest.ImageName,
                       userProvidedImage: Boolean,
-                      memory: ByteSize)(implicit config: WhiskConfig, logging: Logging): Future[Container]
+                      memory: ByteSize,
+                      cpuShares: Int)(implicit config: WhiskConfig, logging: Logging): Future[Container]
 
   /** perform any initialization */
   def init(): Unit
diff --git a/common/scala/src/main/scala/whisk/core/mesos/MesosContainerFactory.scala b/common/scala/src/main/scala/whisk/core/mesos/MesosContainerFactory.scala
index 9d6204b00c..c9e634e7de 100644
--- a/common/scala/src/main/scala/whisk/core/mesos/MesosContainerFactory.scala
+++ b/common/scala/src/main/scala/whisk/core/mesos/MesosContainerFactory.scala
@@ -100,7 +100,8 @@ class MesosContainerFactory(config: WhiskConfig,
                                name: String,
                                actionImage: ExecManifest.ImageName,
                                userProvidedImage: Boolean,
-                               memory: ByteSize)(implicit config: WhiskConfig, logging: Logging): Future[Container] = {
+                               memory: ByteSize,
+                               cpuShares: Int)(implicit config: WhiskConfig, logging: Logging): Future[Container] = {
     implicit val transid = tid
     val image = if (userProvidedImage) {
       actionImage.publicImageName
@@ -117,7 +118,7 @@ class MesosContainerFactory(config: WhiskConfig,
       image = image,
       userProvidedImage = userProvidedImage,
       memory = memory,
-      cpuShares = config.invokerCoreShare.toInt,
+      cpuShares = cpuShares,
       environment = Map("__OW_API_HOST" -> config.wskApiHost),
       network = containerArgs.network,
       dnsServers = containerArgs.dnsServers,
diff --git a/core/invoker/src/main/resources/application.conf b/core/invoker/src/main/resources/application.conf
index 3ee046d490..aaff48f287 100644
--- a/core/invoker/src/main/resources/application.conf
+++ b/core/invoker/src/main/resources/application.conf
@@ -18,6 +18,16 @@ whisk {
     unpause: 10 seconds
   }
 
+  docker.container-factory {
+    # Use runc (docker-runc) for pause/resume functionality in DockerContainerFactory
+    use-runc: true
+  }
+
+  container-pool {
+    num-core: 4      # used for computing --cpushares, and max number of containers allowed
+    core-share: 2    # used for computing --cpushares, and max number of containers allowed
+  }
+
   kubernetes {
     # Timeouts for k8s commands. Set to "Inf" to disable timeout.
     timeouts {
@@ -42,7 +52,7 @@ whisk {
   container-factory.container-args {
     network: bridge
     dns-servers: []
-    extra-args: {}
+    extra-args: {}   # to pass additional args to 'docker run'; format is `{key1: [v1, v2], key2: [v1, v2]}`
   }
 
   container-proxy {
diff --git a/core/invoker/src/main/scala/whisk/core/containerpool/ContainerPool.scala b/core/invoker/src/main/scala/whisk/core/containerpool/ContainerPool.scala
index 801fc09273..183556942e 100644
--- a/core/invoker/src/main/scala/whisk/core/containerpool/ContainerPool.scala
+++ b/core/invoker/src/main/scala/whisk/core/containerpool/ContainerPool.scala
@@ -54,16 +54,14 @@ case class WorkerData(data: ContainerData, state: WorkerState)
  * (kind, memory) and there is space in the pool.
  *
  * @param childFactory method to create new container proxy actor
- * @param maxActiveContainers maximum amount of containers doing work
- * @param maxPoolSize maximum size of containers allowed in the pool
  * @param feed actor to request more work from
  * @param prewarmConfig optional settings for container prewarming
+ * @param poolConfig config for the ContainerPool
  */
 class ContainerPool(childFactory: ActorRefFactory => ActorRef,
-                    maxActiveContainers: Int,
-                    maxPoolSize: Int,
                     feed: ActorRef,
-                    prewarmConfig: Option[PrewarmingConfig] = None)
+                    prewarmConfig: Option[PrewarmingConfig] = None,
+                    poolConfig: ContainerPoolConfig)
     extends Actor {
   implicit val logging = new AkkaLogging(context.system.log)
 
@@ -98,7 +96,7 @@ class ContainerPool(childFactory: ActorRefFactory => ActorRef,
     // their requests and send them back to the pool for rescheduling (this may happen if "docker" operations
     // fail for example, or a container has aged and was destroying itself when a new request was assigned)
     case r: Run =>
-      val createdContainer = if (busyPool.size < maxActiveContainers) {
+      val createdContainer = if (busyPool.size < poolConfig.maxActiveContainers) {
 
         // Schedule a job to a warm container
         ContainerPool
@@ -107,7 +105,7 @@ class ContainerPool(childFactory: ActorRefFactory => ActorRef,
             (container, "warm")
           })
           .orElse {
-            if (busyPool.size + freePool.size < maxPoolSize) {
+            if (busyPool.size + freePool.size < poolConfig.maxActiveContainers) {
               takePrewarmContainer(r.action)
                 .map(container => {
                   (container, "prewarmed")
@@ -147,7 +145,7 @@ class ContainerPool(childFactory: ActorRefFactory => ActorRef,
             logging.error(
               this,
               s"Rescheduling Run message, too many message in the pool, freePoolSize: ${freePool.size}, " +
-                s"busyPoolSize: ${busyPool.size}, maxActiveContainers $maxActiveContainers, " +
+                s"busyPoolSize: ${busyPool.size}, maxActiveContainers ${poolConfig.maxActiveContainers}, " +
                 s"userNamespace: ${r.msg.user.namespace}, action: ${r.action}")(r.msg.transid)
             Some(logMessageInterval.fromNow)
           } else {
@@ -282,11 +280,10 @@ object ContainerPool {
   }
 
   def props(factory: ActorRefFactory => ActorRef,
-            maxActive: Int,
-            size: Int,
+            poolConfig: ContainerPoolConfig,
             feed: ActorRef,
             prewarmConfig: Option[PrewarmingConfig] = None) =
-    Props(new ContainerPool(factory, maxActive, size, feed, prewarmConfig))
+    Props(new ContainerPool(factory, feed, prewarmConfig, poolConfig))
 }
 
 /** Contains settings needed to perform container prewarming */
diff --git a/core/invoker/src/main/scala/whisk/core/containerpool/ContainerProxy.scala b/core/invoker/src/main/scala/whisk/core/containerpool/ContainerProxy.scala
index 99557e6657..dd9885e7db 100644
--- a/core/invoker/src/main/scala/whisk/core/containerpool/ContainerProxy.scala
+++ b/core/invoker/src/main/scala/whisk/core/containerpool/ContainerProxy.scala
@@ -94,11 +94,12 @@ case object RescheduleJob // job is sent back to parent and could not be process
  * @param pauseGrace time to wait for new work before pausing the container
  */
 class ContainerProxy(
-  factory: (TransactionId, String, ImageName, Boolean, ByteSize) => Future[Container],
+  factory: (TransactionId, String, ImageName, Boolean, ByteSize, Int) => Future[Container],
   sendActiveAck: (TransactionId, WhiskActivation, Boolean, InstanceId) => Future[Any],
   storeActivation: (TransactionId, WhiskActivation) => Future[Any],
   collectLogs: (TransactionId, Identity, WhiskActivation, Container, ExecutableWhiskAction) => Future[ActivationLogs],
   instance: InstanceId,
+  poolConfig: ContainerPoolConfig,
   unusedTimeout: FiniteDuration,
   pauseGrace: FiniteDuration)
     extends FSM[ContainerState, ContainerData]
@@ -117,7 +118,8 @@ class ContainerProxy(
         ContainerProxy.containerName(instance, "prewarm", job.exec.kind),
         job.exec.image,
         job.exec.pull,
-        job.memoryLimit)
+        job.memoryLimit,
+        poolConfig.cpuShare)
         .map(container => PreWarmedData(container, job.exec.kind, job.memoryLimit))
         .pipeTo(self)
 
@@ -133,7 +135,8 @@ class ContainerProxy(
         ContainerProxy.containerName(instance, job.msg.user.namespace.name, job.action.name.name),
         job.action.exec.image,
         job.action.exec.pull,
-        job.action.limits.memory.megabytes.MB)
+        job.action.limits.memory.megabytes.MB,
+        poolConfig.cpuShare)
 
       // container factory will either yield a new container ready to execute the action, or
       // starting up the container failed; for the latter, it's either an internal error starting
@@ -413,14 +416,15 @@ final case class ContainerProxyTimeoutConfig(idleContainer: FiniteDuration, paus
 
 object ContainerProxy {
   def props(
-    factory: (TransactionId, String, ImageName, Boolean, ByteSize) => Future[Container],
+    factory: (TransactionId, String, ImageName, Boolean, ByteSize, Int) => Future[Container],
     ack: (TransactionId, WhiskActivation, Boolean, InstanceId) => Future[Any],
     store: (TransactionId, WhiskActivation) => Future[Any],
     collectLogs: (TransactionId, Identity, WhiskActivation, Container, ExecutableWhiskAction) => Future[ActivationLogs],
     instance: InstanceId,
+    poolConfig: ContainerPoolConfig,
     unusedTimeout: FiniteDuration = timeouts.idleContainer,
     pauseGrace: FiniteDuration = timeouts.pauseGrace) =
-    Props(new ContainerProxy(factory, ack, store, collectLogs, instance, unusedTimeout, pauseGrace))
+    Props(new ContainerProxy(factory, ack, store, collectLogs, instance, poolConfig, unusedTimeout, pauseGrace))
 
   // Needs to be thread-safe as it's used by multiple proxies concurrently.
   private val containerCount = new Counter
diff --git a/core/invoker/src/main/scala/whisk/core/containerpool/docker/DockerContainerFactory.scala b/core/invoker/src/main/scala/whisk/core/containerpool/docker/DockerContainerFactory.scala
index ff0dfb5f78..3f2ee86406 100644
--- a/core/invoker/src/main/scala/whisk/core/containerpool/docker/DockerContainerFactory.scala
+++ b/core/invoker/src/main/scala/whisk/core/containerpool/docker/DockerContainerFactory.scala
@@ -36,26 +36,28 @@ import pureconfig._
 import whisk.core.ConfigKeys
 import whisk.core.containerpool.ContainerArgsConfig
 
-class DockerContainerFactory(config: WhiskConfig,
-                             instance: InstanceId,
+case class DockerContainerFactoryConfig(useRunc: Boolean)
+
+class DockerContainerFactory(instance: InstanceId,
                              parameters: Map[String, Set[String]],
-                             containerArgs: ContainerArgsConfig =
-                               loadConfigOrThrow[ContainerArgsConfig](ConfigKeys.containerArgs))(
+                             containerArgsConfig: ContainerArgsConfig =
+                               loadConfigOrThrow[ContainerArgsConfig](ConfigKeys.containerArgs),
+                             dockerContainerFactoryConfig: DockerContainerFactoryConfig =
+                               loadConfigOrThrow[DockerContainerFactoryConfig](ConfigKeys.dockerContainerFactory))(
   implicit actorSystem: ActorSystem,
   ec: ExecutionContext,
-  logging: Logging)
+  logging: Logging,
+  docker: DockerApiWithFileAccess,
+  runc: RuncApi)
     extends ContainerFactory {
 
-  /** Initialize container clients */
-  implicit val docker = new DockerClientWithFileAccess()(ec)
-  implicit val runc = new RuncClient()(ec)
-
   /** Create a container using docker cli */
   override def createContainer(tid: TransactionId,
                                name: String,
                                actionImage: ExecManifest.ImageName,
                                userProvidedImage: Boolean,
-                               memory: ByteSize)(implicit config: WhiskConfig, logging: Logging): Future[Container] = {
+                               memory: ByteSize,
+                               cpuShares: Int)(implicit config: WhiskConfig, logging: Logging): Future[Container] = {
     val image = if (userProvidedImage) {
       actionImage.publicImageName
     } else {
@@ -67,13 +69,13 @@ class DockerContainerFactory(config: WhiskConfig,
       image = image,
       userProvidedImage = userProvidedImage,
       memory = memory,
-      cpuShares = config.invokerCoreShare.toInt,
+      cpuShares = cpuShares,
       environment = Map("__OW_API_HOST" -> config.wskApiHost),
-      network = containerArgs.network,
-      dnsServers = containerArgs.dnsServers,
+      network = containerArgsConfig.network,
+      dnsServers = containerArgsConfig.dnsServers,
       name = Some(name),
-      useRunc = config.invokerUseRunc,
-      parameters ++ containerArgs.extraArgs)
+      useRunc = dockerContainerFactoryConfig.useRunc,
+      parameters ++ containerArgsConfig.extraArgs.map { case (k, v) => ("--" + k, v) })
   }
 
   /** Perform cleanup on init */
@@ -111,7 +113,7 @@ class DockerContainerFactory(config: WhiskConfig,
         containers =>
           logging.info(this, s"removing ${containers.size} action containers.")
           val removals = containers.map { id =>
-            (if (config.invokerUseRunc) {
+            (if (dockerContainerFactoryConfig.useRunc) {
                runc.resume(id)
              } else {
                docker.unpause(id)
@@ -135,6 +137,14 @@ object DockerContainerFactoryProvider extends ContainerFactoryProvider {
                                    logging: Logging,
                                    config: WhiskConfig,
                                    instanceId: InstanceId,
-                                   parameters: Map[String, Set[String]]): ContainerFactory =
-    new DockerContainerFactory(config, instanceId, parameters)(actorSystem, actorSystem.dispatcher, logging)
+                                   parameters: Map[String, Set[String]]): ContainerFactory = {
+
+    new DockerContainerFactory(instanceId, parameters)(
+      actorSystem,
+      actorSystem.dispatcher,
+      logging,
+      new DockerClientWithFileAccess()(actorSystem.dispatcher)(logging, actorSystem),
+      new RuncClient()(actorSystem.dispatcher)(logging, actorSystem))
+  }
+
 }
diff --git a/core/invoker/src/main/scala/whisk/core/containerpool/kubernetes/KubernetesContainerFactory.scala b/core/invoker/src/main/scala/whisk/core/containerpool/kubernetes/KubernetesContainerFactory.scala
index 8b2d9189a3..e332b84861 100644
--- a/core/invoker/src/main/scala/whisk/core/containerpool/kubernetes/KubernetesContainerFactory.scala
+++ b/core/invoker/src/main/scala/whisk/core/containerpool/kubernetes/KubernetesContainerFactory.scala
@@ -64,7 +64,8 @@ class KubernetesContainerFactory(label: String, config: WhiskConfig)(implicit ac
                                name: String,
                                actionImage: ImageName,
                                userProvidedImage: Boolean,
-                               memory: ByteSize)(implicit config: WhiskConfig, logging: Logging): Future[Container] = {
+                               memory: ByteSize,
+                               cpuShares: Int)(implicit config: WhiskConfig, logging: Logging): Future[Container] = {
     val image = if (userProvidedImage) {
       actionImage.publicImageName
     } else {
diff --git a/core/invoker/src/main/scala/whisk/core/invoker/Invoker.scala b/core/invoker/src/main/scala/whisk/core/invoker/Invoker.scala
index e8e1daef14..58a4d1d097 100644
--- a/core/invoker/src/main/scala/whisk/core/invoker/Invoker.scala
+++ b/core/invoker/src/main/scala/whisk/core/invoker/Invoker.scala
@@ -56,11 +56,7 @@ object Invoker {
       ExecManifest.requiredProperties ++
       kafkaHosts ++
       zookeeperHosts ++
-      wskApiHost ++ Map(
-      dockerImageTag -> "latest",
-      invokerNumCore -> "4",
-      invokerCoreShare -> "2",
-      invokerUseRunc -> "true") ++
+      wskApiHost ++ Map(dockerImageTag -> "latest") ++
       Map(invokerName -> "")
 
   def main(args: Array[String]): Unit = {
diff --git a/core/invoker/src/main/scala/whisk/core/invoker/InvokerReactive.scala b/core/invoker/src/main/scala/whisk/core/invoker/InvokerReactive.scala
index 0729103a6f..8601e4c9da 100644
--- a/core/invoker/src/main/scala/whisk/core/invoker/InvokerReactive.scala
+++ b/core/invoker/src/main/scala/whisk/core/invoker/InvokerReactive.scala
@@ -41,7 +41,11 @@ import scala.concurrent.{ExecutionContext, Future}
 import scala.concurrent.duration._
 import scala.util.{Failure, Success}
 
-class InvokerReactive(config: WhiskConfig, instance: InstanceId, producer: MessageProducer)(
+class InvokerReactive(
+  config: WhiskConfig,
+  instance: InstanceId,
+  producer: MessageProducer,
+  poolConfig: ContainerPoolConfig = loadConfigOrThrow[ContainerPoolConfig](ConfigKeys.containerPool))(
   implicit actorSystem: ActorSystem,
   logging: Logging) {
 
@@ -91,7 +95,7 @@ class InvokerReactive(config: WhiskConfig, instance: InstanceId, producer: Messa
 
   /** Initialize message consumers */
   private val topic = s"invoker${instance.toInt}"
-  private val maximumContainers = config.invokerNumCore.toInt * config.invokerCoreShare.toInt
+  private val maximumContainers = poolConfig.maxActiveContainers
   private val msgProvider = SpiLoader.get[MessagingProvider]
   private val consumer = msgProvider.getConsumer(
     config,
@@ -140,7 +144,9 @@ class InvokerReactive(config: WhiskConfig, instance: InstanceId, producer: Messa
 
   /** Creates a ContainerProxy Actor when being called. */
   private val childFactory = (f: ActorRefFactory) =>
-    f.actorOf(ContainerProxy.props(containerFactory.createContainer, ack, store, logsProvider.collectLogs, instance))
+    f.actorOf(
+      ContainerProxy
+        .props(containerFactory.createContainer, ack, store, logsProvider.collectLogs, instance, poolConfig))
 
   private val prewarmKind = "nodejs:6"
   private val prewarmExec = ExecManifest.runtimesManifest
@@ -149,12 +155,7 @@ class InvokerReactive(config: WhiskConfig, instance: InstanceId, producer: Messa
     .get
 
   private val pool = actorSystem.actorOf(
-    ContainerPool.props(
-      childFactory,
-      maximumContainers,
-      maximumContainers,
-      activationFeed,
-      Some(PrewarmingConfig(2, prewarmExec, 256.MB))))
+    ContainerPool.props(childFactory, poolConfig, activationFeed, Some(PrewarmingConfig(2, prewarmExec, 256.MB))))
 
   /** Is called when an ActivationMessage is read from Kafka */
   def processActivationMessage(bytes: Array[Byte]): Future[Unit] = {
diff --git a/tests/src/test/scala/common/LoggedFunction.scala b/tests/src/test/scala/common/LoggedFunction.scala
index 3789de7396..e8b726179a 100644
--- a/tests/src/test/scala/common/LoggedFunction.scala
+++ b/tests/src/test/scala/common/LoggedFunction.scala
@@ -72,6 +72,15 @@ class LoggedFunction5[A1, A2, A3, A4, A5, B](body: (A1, A2, A3, A4, A5) => B) ex
     body(v1, v2, v3, v4, v5)
   }
 }
+class LoggedFunction6[A1, A2, A3, A4, A5, A6, B](body: (A1, A2, A3, A4, A5, A6) => B)
+    extends Function6[A1, A2, A3, A4, A5, A6, B] {
+  val calls = mutable.Buffer[(A1, A2, A3, A4, A5, A6)]()
+
+  override def apply(v1: A1, v2: A2, v3: A3, v4: A4, v5: A5, v6: A6): B = {
+    calls += ((v1, v2, v3, v4, v5, v6))
+    body(v1, v2, v3, v4, v5, v6)
+  }
+}
 
 object LoggedFunction {
   def apply[A1, B](body: (A1) => B) = new LoggedFunction1(body)
@@ -79,4 +88,5 @@ object LoggedFunction {
   def apply[A1, A2, A3, B](body: (A1, A2, A3) => B) = new LoggedFunction3(body)
   def apply[A1, A2, A3, A4, B](body: (A1, A2, A3, A4) => B) = new LoggedFunction4(body)
   def apply[A1, A2, A3, A4, A5, B](body: (A1, A2, A3, A4, A5) => B) = new LoggedFunction5(body)
+  def apply[A1, A2, A3, A4, A5, A6, B](body: (A1, A2, A3, A4, A5, A6) => B) = new LoggedFunction6(body)
 }
diff --git a/tests/src/test/scala/whisk/core/containerpool/docker/test/DockerContainerFactoryTests.scala b/tests/src/test/scala/whisk/core/containerpool/docker/test/DockerContainerFactoryTests.scala
new file mode 100644
index 0000000000..31139dc802
--- /dev/null
+++ b/tests/src/test/scala/whisk/core/containerpool/docker/test/DockerContainerFactoryTests.scala
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package whisk.core.containerpool.docker.test
+
+import common.StreamLogging
+import common.TimingHelpers
+import common.WskActorSystem
+import org.junit.runner.RunWith
+import org.scalamock.scalatest.MockFactory
+import org.scalatest.BeforeAndAfterEach
+import org.scalatest.FlatSpec
+import org.scalatest.Matchers
+import org.scalatest.junit.JUnitRunner
+import scala.concurrent.Await
+import scala.concurrent.Future
+import scala.concurrent.duration._
+import whisk.common.TransactionId
+import whisk.core.WhiskConfig
+import whisk.core.WhiskConfig._
+import whisk.core.containerpool.ContainerAddress
+import whisk.core.containerpool.ContainerArgsConfig
+import whisk.core.containerpool.ContainerId
+import whisk.core.containerpool.docker.DockerApiWithFileAccess
+import whisk.core.containerpool.docker.DockerContainerFactory
+import whisk.core.containerpool.docker.DockerContainerFactoryConfig
+import whisk.core.containerpool.docker.RuncApi
+import whisk.core.entity.ExecManifest
+import whisk.core.entity.InstanceId
+import whisk.core.entity.size._
+
+@RunWith(classOf[JUnitRunner])
+class DockerContainerFactoryTests
+    extends FlatSpec
+    with Matchers
+    with MockFactory
+    with StreamLogging
+    with BeforeAndAfterEach
+    with WskActorSystem
+    with TimingHelpers {
+
+  implicit val config = new WhiskConfig(
+    ExecManifest.requiredProperties ++ Map(dockerImagePrefix -> "testing", dockerImageTag -> "testtag"))
+  ExecManifest.initialize(config) should be a 'success
+
+  behavior of "DockerContainerFactory"
+
+  it should "set the docker run args based on ContainerArgsConfig" in {
+
+    val image = ExecManifest.runtimesManifest.manifests("nodejs").image
+
+    implicit val tid = TransactionId.testing
+    val dockerApiStub = mock[DockerApiWithFileAccess]
+    //setup run expectation
+    (dockerApiStub
+      .run(_: String, _: Seq[String])(_: TransactionId))
+      .expects(
+        image.localImageName(config.dockerRegistry, config.dockerImagePrefix, Some(config.dockerImageTag)),
+        List(
+          "--cpu-shares",
+          "32", //should be calculated as 1024/(numcore * sharefactor) via ContainerFactory.cpuShare
+          "--memory",
+          "10m",
+          "--memory-swap",
+          "10m",
+          "--network",
+          "net1",
+          "-e",
+          "__OW_API_HOST=://:",
+          "--dns",
+          "dns1",
+          "--dns",
+          "dns2",
+          "--name",
+          "testContainer",
+          "--env",
+          "e1",
+          "--env",
+          "e2"),
+        *)
+      .returning(Future.successful { ContainerId("fakecontainerid") })
+    //setup inspect expectation
+    (dockerApiStub
+      .inspectIPAddress(_: ContainerId, _: String)(_: TransactionId))
+      .expects(ContainerId("fakecontainerid"), "net1", *)
+      .returning(Future.successful { ContainerAddress("1.2.3.4", 1234) })
+    //setup rm expectation
+    (dockerApiStub
+      .rm(_: ContainerId)(_: TransactionId))
+      .expects(ContainerId("fakecontainerid"), *)
+      .returning(Future.successful(Unit))
+
+    val factory =
+      new DockerContainerFactory(
+        InstanceId(0),
+        Map(),
+        ContainerArgsConfig("net1", Seq("dns1", "dns2"), Map("env" -> Set("e1", "e2"))),
+        DockerContainerFactoryConfig(true))(actorSystem, executionContext, logging, dockerApiStub, mock[RuncApi])
+
+    val cf = factory.createContainer(tid, "testContainer", image, false, 10.MB, 32)
+
+    val c = Await.result(cf, 5000.milliseconds)
+
+    Await.result(c.destroy(), 500.milliseconds)
+
+  }
+
+}
diff --git a/tests/src/test/scala/whisk/core/containerpool/mesos/test/MesosContainerFactoryTest.scala b/tests/src/test/scala/whisk/core/containerpool/mesos/test/MesosContainerFactoryTest.scala
index deb23ffc26..9a46509118 100644
--- a/tests/src/test/scala/whisk/core/containerpool/mesos/test/MesosContainerFactoryTest.scala
+++ b/tests/src/test/scala/whisk/core/containerpool/mesos/test/MesosContainerFactoryTest.scala
@@ -49,6 +49,7 @@ import whisk.common.TransactionId
 import whisk.core.WhiskConfig
 import whisk.core.WhiskConfig._
 import whisk.core.containerpool.ContainerArgsConfig
+import whisk.core.containerpool.ContainerPoolConfig
 import whisk.core.containerpool.logging.DockerToActivationLogStore
 import whisk.core.entity.ExecManifest.ImageName
 import whisk.core.entity.size._
@@ -66,7 +67,7 @@ class MesosContainerFactoryTest
   def await[A](f: Future[A], timeout: FiniteDuration = 500.milliseconds) = Await.result[A](f, timeout)
 
   implicit val wskConfig =
-    new WhiskConfig(Map(invokerCoreShare -> "2", dockerImageTag -> "latest", wskApiHostname -> "apihost") ++ wskApiHost)
+    new WhiskConfig(Map(dockerImageTag -> "latest", wskApiHostname -> "apihost") ++ wskApiHost)
   var count = 0
   var lastTaskId: String = null
   def testTaskId() = {
@@ -75,8 +76,9 @@ class MesosContainerFactoryTest
     lastTaskId
   }
 
-  //TODO: adjust this once the invokerCoreShare issue is fixed see #3110
-  def cpus() = wskConfig.invokerCoreShare.toInt / 1024.0 //
+  val poolConfig = ContainerPoolConfig(8, 10)
+  val dockerCpuShares = poolConfig.cpuShare
+  val mesosCpus = poolConfig.cpuShare / 1024.0
 
   val containerArgsConfig =
     new ContainerArgsConfig("net1", Seq("dns1", "dns2"), Map("extra1" -> Set("e1", "e2"), "extra2" -> Set("e3", "e4")))
@@ -116,14 +118,20 @@ class MesosContainerFactoryTest
         testTaskId)
 
     expectMsg(Subscribe)
-    factory.createContainer(TransactionId.testing, "mesosContainer", ImageName("fakeImage"), false, 1.MB)
+    factory.createContainer(
+      TransactionId.testing,
+      "mesosContainer",
+      ImageName("fakeImage"),
+      false,
+      1.MB,
+      poolConfig.cpuShare)
 
     expectMsg(
       SubmitTask(TaskDef(
         lastTaskId,
         "mesosContainer",
         "fakeImage:" + wskConfig.dockerImageTag,
-        cpus,
+        mesosCpus,
         1,
         List(8080),
         Some(0),
@@ -159,13 +167,19 @@ class MesosContainerFactoryTest
     probe.reply(new SubscribeComplete)
 
     //create the container
-    val c = factory.createContainer(TransactionId.testing, "mesosContainer", ImageName("fakeImage"), false, 1.MB)
+    val c = factory.createContainer(
+      TransactionId.testing,
+      "mesosContainer",
+      ImageName("fakeImage"),
+      false,
+      1.MB,
+      poolConfig.cpuShare)
     probe.expectMsg(
       SubmitTask(TaskDef(
         lastTaskId,
         "mesosContainer",
         "fakeImage:" + wskConfig.dockerImageTag,
-        cpus,
+        mesosCpus,
         1,
         List(8080),
         Some(0),
@@ -228,14 +242,20 @@ class MesosContainerFactoryTest
     probe.reply(new SubscribeComplete)
 
     //create the container
-    val c = factory.createContainer(TransactionId.testing, "mesosContainer", ImageName("fakeImage"), false, 1.MB)
+    val c = factory.createContainer(
+      TransactionId.testing,
+      "mesosContainer",
+      ImageName("fakeImage"),
+      false,
+      1.MB,
+      poolConfig.cpuShare)
 
     probe.expectMsg(
       SubmitTask(TaskDef(
         lastTaskId,
         "mesosContainer",
         "fakeImage:" + wskConfig.dockerImageTag,
-        cpus,
+        mesosCpus,
         1,
         List(8080),
         Some(0),
diff --git a/tests/src/test/scala/whisk/core/containerpool/test/ContainerArgsConfigTest.scala b/tests/src/test/scala/whisk/core/containerpool/test/ContainerArgsConfigTest.scala
index 9990c15b97..82ad2317e8 100644
--- a/tests/src/test/scala/whisk/core/containerpool/test/ContainerArgsConfigTest.scala
+++ b/tests/src/test/scala/whisk/core/containerpool/test/ContainerArgsConfigTest.scala
@@ -41,8 +41,8 @@ class ContainerArgsConfigTest extends FlatSpec with Matchers {
     System.setProperty("whisk.container-factory.container-args.extra-args.label.0", "l1")
     System.setProperty("whisk.container-factory.container-args.extra-args.label.1", "l2")
     System.setProperty("whisk.container-factory.container-args.extra-args.label.3", "l3")
-    System.setProperty("whisk.container-factory.container-args.extra-args.environment.0", "e1")
-    System.setProperty("whisk.container-factory.container-args.extra-args.environment.1", "e2")
+    System.setProperty("whisk.container-factory.container-args.extra-args.env.0", "e1")
+    System.setProperty("whisk.container-factory.container-args.extra-args.env.1", "e2")
 
     System.setProperty("whisk.container-factory.container-args.dns-servers.0", "google.com")
     System.setProperty("whisk.container-factory.container-args.dns-servers.1", "1.2.3.4")
@@ -52,7 +52,7 @@ class ContainerArgsConfigTest extends FlatSpec with Matchers {
     config.dnsServers shouldBe Seq[String]("google.com", "1.2.3.4")
     //check map parsing of extra-args config
     config.extraArgs.get("label") shouldBe Some(Set("l1", "l2", "l3"))
-    config.extraArgs.get("environment") shouldBe Some(Set("e1", "e2"))
+    config.extraArgs.get("env") shouldBe Some(Set("e1", "e2"))
 
   }
 }
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 ff6d49ea2e..e41cea6895 100644
--- a/tests/src/test/scala/whisk/core/containerpool/test/ContainerPoolTests.scala
+++ b/tests/src/test/scala/whisk/core/containerpool/test/ContainerPoolTests.scala
@@ -123,7 +123,7 @@ class ContainerPoolTests
   it should "reuse a warm container" in within(timeout) {
     val (containers, factory) = testContainers(2)
     val feed = TestProbe()
-    val pool = system.actorOf(ContainerPool.props(factory, 2, 2, feed.ref))
+    val pool = system.actorOf(ContainerPool.props(factory, ContainerPoolConfig(2, 2), feed.ref))
 
     pool ! runMessage
     containers(0).expectMsg(runMessage)
@@ -137,7 +137,7 @@ class ContainerPoolTests
   it should "reuse a warm container when action is the same even if revision changes" in within(timeout) {
     val (containers, factory) = testContainers(2)
     val feed = TestProbe()
-    val pool = system.actorOf(ContainerPool.props(factory, 2, 2, feed.ref))
+    val pool = system.actorOf(ContainerPool.props(factory, ContainerPoolConfig(2, 2), feed.ref))
 
     pool ! runMessage
     containers(0).expectMsg(runMessage)
@@ -152,7 +152,7 @@ class ContainerPoolTests
     val (containers, factory) = testContainers(2)
     val feed = TestProbe()
 
-    val pool = system.actorOf(ContainerPool.props(factory, 2, 2, feed.ref))
+    val pool = system.actorOf(ContainerPool.props(factory, ContainerPoolConfig(2, 2), feed.ref))
     pool ! runMessage
     containers(0).expectMsg(runMessage)
     // Note that the container doesn't respond, thus it's not free to take work
@@ -166,7 +166,7 @@ class ContainerPoolTests
     val feed = TestProbe()
 
     // a pool with only 1 slot
-    val pool = system.actorOf(ContainerPool.props(factory, 1, 1, feed.ref))
+    val pool = system.actorOf(ContainerPool.props(factory, ContainerPoolConfig(1, 1), feed.ref))
     pool ! runMessage
     containers(0).expectMsg(runMessage)
     containers(0).send(pool, NeedWork(warmedData()))
@@ -181,7 +181,7 @@ class ContainerPoolTests
     val feed = TestProbe()
 
     // a pool with only 1 active slot but 2 slots in total
-    val pool = system.actorOf(ContainerPool.props(factory, 1, 2, feed.ref))
+    val pool = system.actorOf(ContainerPool.props(factory, ContainerPoolConfig(1, 2), feed.ref))
 
     // Run the first container
     pool ! runMessage
@@ -207,7 +207,7 @@ class ContainerPoolTests
     val feed = TestProbe()
 
     // a pool with only 1 slot
-    val pool = system.actorOf(ContainerPool.props(factory, 1, 1, feed.ref))
+    val pool = system.actorOf(ContainerPool.props(factory, ContainerPoolConfig(1, 1), feed.ref))
     pool ! runMessage
     containers(0).expectMsg(runMessage)
     containers(0).send(pool, NeedWork(warmedData()))
@@ -222,7 +222,7 @@ class ContainerPoolTests
     val feed = TestProbe()
 
     // a pool with only 1 slot
-    val pool = system.actorOf(ContainerPool.props(factory, 1, 1, feed.ref))
+    val pool = system.actorOf(ContainerPool.props(factory, ContainerPoolConfig(1, 1), feed.ref))
     pool ! runMessage
     containers(0).expectMsg(runMessage)
     containers(0).send(pool, RescheduleJob) // emulate container failure ...
@@ -239,7 +239,8 @@ class ContainerPoolTests
     val feed = TestProbe()
 
     val pool =
-      system.actorOf(ContainerPool.props(factory, 0, 0, feed.ref, Some(PrewarmingConfig(1, exec, memoryLimit))))
+      system.actorOf(
+        ContainerPool.props(factory, ContainerPoolConfig(0, 0), feed.ref, Some(PrewarmingConfig(1, exec, memoryLimit))))
     containers(0).expectMsg(Start(exec, memoryLimit))
   }
 
@@ -248,7 +249,8 @@ class ContainerPoolTests
     val feed = TestProbe()
 
     val pool =
-      system.actorOf(ContainerPool.props(factory, 1, 1, feed.ref, Some(PrewarmingConfig(1, exec, memoryLimit))))
+      system.actorOf(
+        ContainerPool.props(factory, ContainerPoolConfig(1, 1), feed.ref, Some(PrewarmingConfig(1, exec, memoryLimit))))
     containers(0).expectMsg(Start(exec, memoryLimit))
     containers(0).send(pool, NeedWork(preWarmedData(exec.kind)))
     pool ! runMessage
@@ -262,7 +264,8 @@ class ContainerPoolTests
     val alternativeExec = CodeExecAsString(RuntimeManifest("anotherKind", ImageName("testImage")), "testCode", None)
 
     val pool = system.actorOf(
-      ContainerPool.props(factory, 1, 1, feed.ref, Some(PrewarmingConfig(1, alternativeExec, memoryLimit))))
+      ContainerPool
+        .props(factory, ContainerPoolConfig(1, 1), feed.ref, Some(PrewarmingConfig(1, alternativeExec, memoryLimit))))
     containers(0).expectMsg(Start(alternativeExec, memoryLimit)) // container0 was prewarmed
     containers(0).send(pool, NeedWork(preWarmedData(alternativeExec.kind)))
     pool ! runMessage
@@ -276,7 +279,9 @@ class ContainerPoolTests
     val alternativeLimit = 128.MB
 
     val pool =
-      system.actorOf(ContainerPool.props(factory, 1, 1, feed.ref, Some(PrewarmingConfig(1, exec, alternativeLimit))))
+      system.actorOf(
+        ContainerPool
+          .props(factory, ContainerPoolConfig(1, 1), feed.ref, Some(PrewarmingConfig(1, exec, alternativeLimit))))
     containers(0).expectMsg(Start(exec, alternativeLimit)) // container0 was prewarmed
     containers(0).send(pool, NeedWork(preWarmedData(exec.kind, alternativeLimit)))
     pool ! runMessage
@@ -290,7 +295,7 @@ class ContainerPoolTests
     val (containers, factory) = testContainers(2)
     val feed = TestProbe()
 
-    val pool = system.actorOf(ContainerPool.props(factory, 2, 2, feed.ref))
+    val pool = system.actorOf(ContainerPool.props(factory, ContainerPoolConfig(2, 2), feed.ref))
 
     // container0 is created and used
     pool ! runMessage
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 5a130848c4..7f2e55319b 100644
--- a/tests/src/test/scala/whisk/core/containerpool/test/ContainerProxyTests.scala
+++ b/tests/src/test/scala/whisk/core/containerpool/test/ContainerProxyTests.scala
@@ -158,7 +158,7 @@ class ContainerProxyTests
 
   /** Creates an inspectable factory */
   def createFactory(response: Future[Container]) = LoggedFunction {
-    (_: TransactionId, _: String, _: ImageName, _: Boolean, _: ByteSize) =>
+    (_: TransactionId, _: String, _: ImageName, _: Boolean, _: ByteSize, _: Int) =>
       response
   }
 
@@ -176,6 +176,8 @@ class ContainerProxyTests
     Future.successful(())
   }
 
+  val poolConfig = ContainerPoolConfig(1, 2)
+
   behavior of "ContainerProxy"
 
   /*
@@ -188,12 +190,19 @@ class ContainerProxyTests
     val machine =
       childActorOf(
         ContainerProxy
-          .props(factory, createAcker, store, createCollector(), InstanceId(0, Some("myname")), pauseGrace = timeout))
+          .props(
+            factory,
+            createAcker,
+            store,
+            createCollector(),
+            InstanceId(0, Some("myname")),
+            poolConfig,
+            pauseGrace = timeout))
     registerCallback(machine)
     preWarm(machine)
 
     factory.calls should have size 1
-    val (tid, name, _, _, memory) = factory.calls(0)
+    val (tid, name, _, _, memory, cpuShares) = factory.calls(0)
     tid shouldBe TransactionId.invokerWarmup
     name should fullyMatch regex """wskmyname\d+_\d+_prewarm_actionKind"""
     memory shouldBe memoryLimit
@@ -208,7 +217,8 @@ class ContainerProxyTests
     val collector = createCollector()
 
     val machine =
-      childActorOf(ContainerProxy.props(factory, acker, store, collector, InstanceId(0), pauseGrace = timeout))
+      childActorOf(
+        ContainerProxy.props(factory, acker, store, collector, InstanceId(0), poolConfig, pauseGrace = timeout))
     registerCallback(machine)
 
     preWarm(machine)
@@ -243,7 +253,8 @@ class ContainerProxyTests
     val collector = createCollector()
 
     val machine =
-      childActorOf(ContainerProxy.props(factory, acker, store, collector, InstanceId(0), pauseGrace = timeout))
+      childActorOf(
+        ContainerProxy.props(factory, acker, store, collector, InstanceId(0), poolConfig, pauseGrace = timeout))
     registerCallback(machine)
     preWarm(machine)
 
@@ -289,7 +300,8 @@ class ContainerProxyTests
     val collector = createCollector()
 
     val machine =
-      childActorOf(ContainerProxy.props(factory, acker, store, collector, InstanceId(0), pauseGrace = timeout))
+      childActorOf(
+        ContainerProxy.props(factory, acker, store, collector, InstanceId(0), poolConfig, pauseGrace = timeout))
     registerCallback(machine)
     preWarm(machine)
 
@@ -326,7 +338,8 @@ class ContainerProxyTests
     val collector = createCollector()
 
     val machine =
-      childActorOf(ContainerProxy.props(factory, acker, store, collector, InstanceId(0), pauseGrace = timeout))
+      childActorOf(
+        ContainerProxy.props(factory, acker, store, collector, InstanceId(0), poolConfig, pauseGrace = timeout))
     registerCallback(machine)
     run(machine, Uninitialized)
 
@@ -358,7 +371,8 @@ class ContainerProxyTests
     val collector = createCollector()
 
     val machine =
-      childActorOf(ContainerProxy.props(factory, acker, store, collector, InstanceId(0), pauseGrace = timeout))
+      childActorOf(
+        ContainerProxy.props(factory, acker, store, collector, InstanceId(0), poolConfig, pauseGrace = timeout))
     registerCallback(machine)
     machine ! Run(action, message)
     expectMsg(Transition(machine, Uninitialized, Running))
@@ -392,7 +406,8 @@ class ContainerProxyTests
     val collector = createCollector()
 
     val machine =
-      childActorOf(ContainerProxy.props(factory, acker, store, collector, InstanceId(0), pauseGrace = timeout))
+      childActorOf(
+        ContainerProxy.props(factory, acker, store, collector, InstanceId(0), poolConfig, pauseGrace = timeout))
     registerCallback(machine)
     machine ! Run(action, message)
     expectMsg(Transition(machine, Uninitialized, Running))
@@ -430,7 +445,8 @@ class ContainerProxyTests
     val collector = createCollector()
 
     val machine =
-      childActorOf(ContainerProxy.props(factory, acker, store, collector, InstanceId(0), pauseGrace = timeout))
+      childActorOf(
+        ContainerProxy.props(factory, acker, store, collector, InstanceId(0), poolConfig, pauseGrace = timeout))
     registerCallback(machine)
     machine ! Run(action, message)
     expectMsg(Transition(machine, Uninitialized, Running))
@@ -459,7 +475,8 @@ class ContainerProxyTests
       createCollector(Future.failed(LogCollectingException(ActivationLogs(partialLogs))))
 
     val machine =
-      childActorOf(ContainerProxy.props(factory, acker, store, collector, InstanceId(0), pauseGrace = timeout))
+      childActorOf(
+        ContainerProxy.props(factory, acker, store, collector, InstanceId(0), poolConfig, pauseGrace = timeout))
     registerCallback(machine)
     machine ! Run(action, message)
     expectMsg(Transition(machine, Uninitialized, Running))
@@ -487,7 +504,8 @@ class ContainerProxyTests
     val collector = createCollector(Future.failed(new Exception))
 
     val machine =
-      childActorOf(ContainerProxy.props(factory, acker, store, collector, InstanceId(0), pauseGrace = timeout))
+      childActorOf(
+        ContainerProxy.props(factory, acker, store, collector, InstanceId(0), poolConfig, pauseGrace = timeout))
     registerCallback(machine)
     machine ! Run(action, message)
     expectMsg(Transition(machine, Uninitialized, Running))
@@ -519,7 +537,8 @@ class ContainerProxyTests
     val store = createStore
 
     val machine =
-      childActorOf(ContainerProxy.props(factory, acker, store, createCollector(), InstanceId(0), pauseGrace = timeout))
+      childActorOf(
+        ContainerProxy.props(factory, acker, store, createCollector(), InstanceId(0), poolConfig, pauseGrace = timeout))
     registerCallback(machine)
     run(machine, Uninitialized) // first run an activation
     timeout(machine) // times out Ready state so container suspends
@@ -553,7 +572,8 @@ class ContainerProxyTests
     val store = createStore
 
     val machine =
-      childActorOf(ContainerProxy.props(factory, acker, store, createCollector(), InstanceId(0), pauseGrace = timeout))
+      childActorOf(
+        ContainerProxy.props(factory, acker, store, createCollector(), InstanceId(0), poolConfig, pauseGrace = timeout))
     registerCallback(machine)
     run(machine, Uninitialized)
     timeout(machine) // times out Ready state so container suspends
@@ -588,7 +608,8 @@ class ContainerProxyTests
     val collector = createCollector()
 
     val machine =
-      childActorOf(ContainerProxy.props(factory, acker, store, collector, InstanceId(0), pauseGrace = timeout))
+      childActorOf(
+        ContainerProxy.props(factory, acker, store, collector, InstanceId(0), poolConfig, pauseGrace = timeout))
     registerCallback(machine)
 
     // Start running the action
@@ -638,7 +659,8 @@ class ContainerProxyTests
     val collector = createCollector()
 
     val machine =
-      childActorOf(ContainerProxy.props(factory, acker, store, collector, InstanceId(0), pauseGrace = timeout))
+      childActorOf(
+        ContainerProxy.props(factory, acker, store, collector, InstanceId(0), poolConfig, pauseGrace = timeout))
     registerCallback(machine)
     run(machine, Uninitialized)
     timeout(machine)


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services