Skip to content

Commit 2534ed9

Browse files
committed
add comprehensive test for supported template features
1 parent 7f1dd38 commit 2534ed9

File tree

3 files changed

+80
-15
lines changed

3 files changed

+80
-15
lines changed

resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/features/BasicDriverFeatureStep.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ private[spark] class BasicDriverFeatureStep(
105105
.withNewFieldRef("v1", "status.podIP")
106106
.build())
107107
.endEnv()
108-
.withNewResources()
108+
.editOrNewResources()
109109
.addToRequests("cpu", driverCpuQuantity)
110110
.addToLimits(maybeCpuLimitQuantity.toMap.asJava)
111111
.addToRequests("memory", driverMemoryQuantity)
@@ -121,7 +121,7 @@ private[spark] class BasicDriverFeatureStep(
121121
.endMetadata()
122122
.withNewSpec()
123123
.withRestartPolicy("Never")
124-
.withNodeSelector(conf.nodeSelector().asJava)
124+
.addToNodeSelector(conf.nodeSelector().asJava)
125125
.addToImagePullSecrets(conf.imagePullSecrets(): _*)
126126
.endSpec()
127127
.build()

resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/features/BasicExecutorFeatureStep.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ private[spark] class BasicExecutorFeatureStep(
132132
.withName(Option(pod.container.getName).getOrElse(DEFAULT_EXECUTOR_CONTAINER_NAME))
133133
.withImage(executorContainerImage)
134134
.withImagePullPolicy(kubernetesConf.imagePullPolicy())
135-
.withNewResources()
135+
.editOrNewResources()
136136
.addToRequests("memory", executorMemoryQuantity)
137137
.addToLimits("memory", executorMemoryQuantity)
138138
.addToRequests("cpu", executorCpuQuantity)
@@ -170,7 +170,7 @@ private[spark] class BasicExecutorFeatureStep(
170170
.editOrNewSpec()
171171
.withHostname(hostname)
172172
.withRestartPolicy("Never")
173-
.withNodeSelector(kubernetesConf.nodeSelector().asJava)
173+
.addToNodeSelector(kubernetesConf.nodeSelector().asJava)
174174
.addToImagePullSecrets(kubernetesConf.imagePullSecrets(): _*)
175175
.endSpec()
176176
.build()

resource-managers/kubernetes/core/src/test/scala/org/apache/spark/scheduler/cluster/k8s/KubernetesExecutorBuilderSuite.scala

Lines changed: 76 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -168,31 +168,96 @@ class KubernetesExecutorBuilderSuite extends SparkFunSuite {
168168
new PodBuilder()
169169
.withNewMetadata()
170170
.addToLabels("test-label-key", "test-label-value")
171+
.addToAnnotations("test-annotation-key", "test-annotation-value")
172+
.withNamespace("namespace")
173+
.addNewOwnerReference()
174+
.withController(true)
175+
.withName("owner-reference")
176+
.endOwnerReference()
171177
.endMetadata()
172178
.withNewSpec()
179+
.withDnsPolicy("dns-policy")
180+
.withHostAliases(new HostAliasBuilder().withHostnames("hostname").build())
181+
.withImagePullSecrets(
182+
new LocalObjectReferenceBuilder().withName("local-reference").build())
183+
.withInitContainers(new ContainerBuilder().withName("init-container").build())
184+
.withNodeName("node-name")
185+
.withNodeSelector(Map("node-selector-key" -> "node-selector-value").asJava)
186+
.withSchedulerName("scheduler")
187+
.withNewSecurityContext()
188+
.withRunAsUser(1000L)
189+
.endSecurityContext()
190+
.withServiceAccount("service-account")
191+
.withSubdomain("subdomain")
192+
.withTolerations(new TolerationBuilder()
193+
.withKey("toleration-key")
194+
.withOperator("Equal")
195+
.withEffect("NoSchedule")
196+
.build())
197+
.addNewVolume()
198+
.withNewHostPath()
199+
.withPath("/test")
200+
.endHostPath()
201+
.withName("test-volume")
202+
.endVolume()
173203
.addNewContainer()
204+
.withArgs("arg")
205+
.withCommand("command")
206+
.addNewEnv()
207+
.withName("env-key")
208+
.withValue("env-value")
209+
.endEnv()
210+
.withImagePullPolicy("Always")
174211
.withName("executor-container")
212+
.withNewResources()
213+
.withLimits(Map("gpu" -> new QuantityBuilder().withAmount("1").build()).asJava)
214+
.endResources()
215+
.withNewSecurityContext()
216+
.withRunAsNonRoot(true)
217+
.endSecurityContext()
218+
.withStdin(true)
219+
.withTerminationMessagePath("termination-message-path")
220+
.withTerminationMessagePolicy("termination-message-policy")
175221
.addToVolumeMounts(
176222
new VolumeMountBuilder()
177223
.withName("test-volume")
178224
.withMountPath("/test")
179225
.build())
180226
.endContainer()
181-
.addNewVolume()
182-
.withNewHostPath()
183-
.withPath("/test")
184-
.endHostPath()
185-
.withName("test-volume")
186-
.endVolume()
187227
.endSpec()
188228
.build())
189229

190-
assert(pod.pod.getMetadata.getLabels.containsKey("test-label-key"))
191-
assert(!pod.pod.getSpec.getContainers.asScala.exists(_.getName == "executor-container"))
192-
assert(pod.pod.getMetadata.getLabels.get("test-label-key") === "test-label-value")
193-
assert(pod.container.getName === "executor-container")
230+
val metadata = pod.pod.getMetadata
231+
assert(metadata.getLabels.containsKey("test-label-key"))
232+
assert(metadata.getAnnotations.containsKey("test-annotation-key"))
233+
assert(metadata.getNamespace === "namespace")
234+
assert(metadata.getOwnerReferences.asScala.exists(_.getName == "owner-reference"))
235+
val spec = pod.pod.getSpec
236+
assert(!spec.getContainers.asScala.exists(_.getName == "executor-container"))
237+
assert(spec.getDnsPolicy === "dns-policy")
238+
assert(spec.getHostAliases.asScala.exists(_.getHostnames.asScala.exists(_ == "hostname")))
239+
assert(spec.getImagePullSecrets.asScala.exists(_.getName == "local-reference"))
240+
assert(spec.getInitContainers.asScala.exists(_.getName == "init-container"))
241+
assert(spec.getNodeName == "node-name")
242+
assert(spec.getNodeSelector.get("node-selector-key") === "node-selector-value")
243+
assert(spec.getSchedulerName === "scheduler")
244+
assert(spec.getSecurityContext.getRunAsUser === 1000L)
245+
assert(spec.getServiceAccount === "service-account")
246+
assert(spec.getSubdomain === "subdomain")
247+
assert(spec.getTolerations.asScala.exists(_.getKey == "toleration-key"))
248+
assert(spec.getVolumes.asScala.exists(_.getName == "test-volume"))
249+
val container = pod.container
250+
assert(container.getName === "executor-container")
251+
assert(container.getArgs.contains("arg"))
252+
assert(container.getCommand.equals(List("command").asJava))
253+
assert(container.getEnv.asScala.exists(_.getName == "env-key"))
254+
assert(container.getResources.getLimits.get("gpu") ===
255+
new QuantityBuilder().withAmount("1").build())
256+
assert(container.getSecurityContext.getRunAsNonRoot)
257+
assert(container.getStdin)
258+
assert(container.getTerminationMessagePath === "termination-message-path")
259+
assert(container.getTerminationMessagePolicy === "termination-message-policy")
194260
assert(pod.container.getVolumeMounts.asScala.exists(_.getName == "test-volume"))
195-
assert(pod.pod.getSpec.getVolumes.asScala.exists(_.getName == "test-volume"))
196261
}
197262

198263
private def constructPodWithPodTemplate(pod: Pod) : SparkPod = {

0 commit comments

Comments
 (0)