This is an automated email from the ASF dual-hosted git repository.

mcdan pushed a commit to branch mcdan/ephmeral-scale-factor
in repository https://gitbox.apache.org/repos/asf/openwhisk.git

commit 500fb4166ede6741f00dd8a3ef7cbe5eda7fd393
Author: mcweeney <[email protected]>
AuthorDate: Wed Oct 21 14:07:59 2020 -0400

    Add ability to scale Ephemeral storage along with memory, similar to CPU.
---
 core/invoker/src/main/resources/application.conf   |  4 +-
 .../kubernetes/KubernetesClient.scala              |  2 +-
 .../containerpool/kubernetes/WhiskPodBuilder.scala |  7 +++-
 .../kubernetes/test/WhiskPodBuilderTests.scala     | 45 ++++++++++++++++++++++
 4 files changed, 55 insertions(+), 3 deletions(-)

diff --git a/core/invoker/src/main/resources/application.conf 
b/core/invoker/src/main/resources/application.conf
index a11f454..35c6fc9 100644
--- a/core/invoker/src/main/resources/application.conf
+++ b/core/invoker/src/main/resources/application.conf
@@ -110,10 +110,12 @@ whisk {
     #}
 
     #if missing, the pod will be created without ephermal disk request/limit
-    #if specified, the pod will be created with ephemeral-storage 
request+limit set
+    #if specified, the pod will be created with ephemeral-storage 
request+limit set or using the scale factor
+    #as a multiple of the request memory. If both are set scale-factor takes 
precedence.
     #See: 
https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#local-ephemeral-storage
     #ephemeral-storage {
     #  limit = 2 g
+    #  scale-factor = 2.0
     #}
 
     #enable PodDisruptionBudget creation for pods? (will include same labels 
as pods, and specify minAvailable=1 to prevent termination of action pods 
during maintenance)
diff --git 
a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala
 
b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala
index ca96dd4..b44b2c2 100644
--- 
a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala
+++ 
b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala
@@ -74,7 +74,7 @@ case class KubernetesCpuScalingConfig(millicpus: Int, memory: 
ByteSize, maxMilli
 /**
  * Configuration for kubernetes ephemeral storage limit for the action 
container
  */
-case class KubernetesEphemeralStorageConfig(limit: ByteSize)
+case class KubernetesEphemeralStorageConfig(limit: ByteSize, scaleFactor: 
Double)
 
 /**
  * Exception to indicate a pod took too long to become ready.
diff --git 
a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/WhiskPodBuilder.scala
 
b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/WhiskPodBuilder.scala
index b5eda4d..98410b5 100644
--- 
a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/WhiskPodBuilder.scala
+++ 
b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/WhiskPodBuilder.scala
@@ -108,7 +108,12 @@ class WhiskPodBuilder(client: NamespacedKubernetesClient, 
config: KubernetesClie
       .getOrElse(Map.empty)
 
     val diskLimit = config.ephemeralStorage
-      .map(diskConfig => Map("ephemeral-storage" -> new 
Quantity(diskConfig.limit.toMB + "Mi")))
+      .map(diskConfig => if (diskConfig.scaleFactor > 0) {
+          Map("ephemeral-storage" -> new Quantity(diskConfig.scaleFactor * 
memory.toMB + "Mi"))
+        }
+        else {
+          Map("ephemeral-storage" -> new Quantity(diskConfig.limit.toMB + 
"Mi"))
+        })
       .getOrElse(Map.empty)
 
     //In container its assumed that env, port, resource limits are set 
explicitly
diff --git 
a/tests/src/test/scala/org/apache/openwhisk/core/containerpool/kubernetes/test/WhiskPodBuilderTests.scala
 
b/tests/src/test/scala/org/apache/openwhisk/core/containerpool/kubernetes/test/WhiskPodBuilderTests.scala
index 93bc4b3..f143826 100644
--- 
a/tests/src/test/scala/org/apache/openwhisk/core/containerpool/kubernetes/test/WhiskPodBuilderTests.scala
+++ 
b/tests/src/test/scala/org/apache/openwhisk/core/containerpool/kubernetes/test/WhiskPodBuilderTests.scala
@@ -133,7 +133,12 @@ class WhiskPodBuilderTests extends FlatSpec with Matchers 
with KubeClientSupport
       Some(KubernetesCpuScalingConfig(300, 3.MB, 1000)),
       false,
       None,
+<<<<<<< Updated upstream
       Some(KubernetesEphemeralStorageConfig(1.GB)))
+=======
+      Some(KubernetesEphemeralStorageConfig(1.GB, 0)),
+      KubernetesTerminationStatusCheckConfig(2.seconds, 20.seconds))
+>>>>>>> Stashed changes
     val builder = new WhiskPodBuilder(kubeClient, config)
 
     val (pod, _) = builder.buildPodSpec(name, testImage, 2.MB, Map("foo" -> 
"bar"), Map("fooL" -> "barV"), config)
@@ -143,6 +148,46 @@ class WhiskPodBuilderTests extends FlatSpec with Matchers 
with KubeClientSupport
       
c.getResources.getRequests.asScala.get("ephemeral-storage").map(_.getAmount) 
shouldBe Some("1024Mi")
     }
   }
+<<<<<<< Updated upstream
+=======
+  it should "scale ephemeral storage when scale factor is given" in {
+    val config = KubernetesClientConfig(
+      KubernetesClientTimeoutConfig(1.second, 1.second),
+      KubernetesInvokerNodeAffinity(false, "k", "v"),
+      KubernetesInvokerPodAntiAffinity(false, ""),
+      true,
+      None,
+      None,
+      Some(scalingConfig),
+      false,
+      None,
+      Some(KubernetesEphemeralStorageConfig(1.GB, 1.25)),
+      KubernetesTerminationStatusCheckConfig(2.seconds, 20.seconds))
+    val builder = new WhiskPodBuilder(kubeClient, config)
+
+    val (pod, _) = builder.buildPodSpec(name, testImage, 2.MB, Map("foo" -> 
"bar"), Map("fooL" -> "barV"), config)
+    withClue(Serialization.asYaml(pod)) {
+      val c = getActionContainer(pod)
+      
c.getResources.getLimits.asScala.get("ephemeral-storage").map(_.getAmount) 
shouldBe Some("2.5Mi")
+      
c.getResources.getRequests.asScala.get("ephemeral-storage").map(_.getAmount) 
shouldBe Some("2.5Mi")
+    }
+  }
+
+  it should "set pod anti-affinity when configured" in {
+    val config = KubernetesClientConfig(
+      KubernetesClientTimeoutConfig(1.second, 1.second),
+      KubernetesInvokerNodeAffinity(false, "k", "v"),
+      KubernetesInvokerPodAntiAffinity(true, "topokey"),
+      true,
+      None,
+      None,
+      Some(scalingConfig),
+      false,
+      None,
+      Some(KubernetesEphemeralStorageConfig(1.GB, 0)),
+      KubernetesTerminationStatusCheckConfig(2.seconds, 20.seconds))
+    val builder = new WhiskPodBuilder(kubeClient, config)
+>>>>>>> Stashed changes
 
   it should "extend existing pod template" in {
     val template = """

Reply via email to