This is an automated email from the ASF dual-hosted git repository.
wangyang0918 pushed a commit to branch release-1.15
in repository https://gitbox.apache.org/repos/asf/flink.git
The following commit(s) were added to refs/heads/release-1.15 by this push:
new 3d910dc8381 [FLINK-27856][k8s] Fix the NPE when no spec is configured
in pod template
3d910dc8381 is described below
commit 3d910dc8381c6965bfce6d948c7cac27cdde1a3c
Author: PengYuan <[email protected]>
AuthorDate: Fri Aug 12 16:30:51 2022 +0800
[FLINK-27856][k8s] Fix the NPE when no spec is configured in pod template
This closes #20558.
---
.../flink/kubernetes/utils/KubernetesUtils.java | 18 +++++++++-----
.../kubernetes/KubernetesPodTemplateTestUtils.java | 12 ++++++++++
.../kubernetes/utils/KubernetesUtilsTest.java | 11 +++++++++
.../resources/testing-nospec-pod-template.yaml | 28 ++++++++++++++++++++++
4 files changed, 63 insertions(+), 6 deletions(-)
diff --git
a/flink-kubernetes/src/main/java/org/apache/flink/kubernetes/utils/KubernetesUtils.java
b/flink-kubernetes/src/main/java/org/apache/flink/kubernetes/utils/KubernetesUtils.java
index f8afbafde0a..f95ccfbf9da 100644
---
a/flink-kubernetes/src/main/java/org/apache/flink/kubernetes/utils/KubernetesUtils.java
+++
b/flink-kubernetes/src/main/java/org/apache/flink/kubernetes/utils/KubernetesUtils.java
@@ -58,6 +58,7 @@ import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
import io.fabric8.kubernetes.api.model.Container;
import io.fabric8.kubernetes.api.model.ContainerBuilder;
import io.fabric8.kubernetes.api.model.KubernetesResource;
+import io.fabric8.kubernetes.api.model.PodSpecBuilder;
import io.fabric8.kubernetes.api.model.Quantity;
import io.fabric8.kubernetes.api.model.ResourceRequirements;
import io.fabric8.kubernetes.api.model.ResourceRequirementsBuilder;
@@ -418,12 +419,18 @@ public class KubernetesUtils {
final List<Container> otherContainers = new ArrayList<>();
Container mainContainer = null;
- for (Container container :
pod.getInternalResource().getSpec().getContainers()) {
- if (mainContainerName.equals(container.getName())) {
- mainContainer = container;
- } else {
- otherContainers.add(container);
+ if (null != pod.getInternalResource().getSpec()) {
+ for (Container container :
pod.getInternalResource().getSpec().getContainers()) {
+ if (mainContainerName.equals(container.getName())) {
+ mainContainer = container;
+ } else {
+ otherContainers.add(container);
+ }
}
+ pod.getInternalResource().getSpec().setContainers(otherContainers);
+ } else {
+ // Set an empty spec for pod template
+ pod.getInternalResource().setSpec(new PodSpecBuilder().build());
}
if (mainContainer == null) {
@@ -433,7 +440,6 @@ public class KubernetesUtils {
mainContainer = new ContainerBuilder().build();
}
- pod.getInternalResource().getSpec().setContainers(otherContainers);
return new FlinkPod(pod.getInternalResource(), mainContainer);
}
diff --git
a/flink-kubernetes/src/test/java/org/apache/flink/kubernetes/KubernetesPodTemplateTestUtils.java
b/flink-kubernetes/src/test/java/org/apache/flink/kubernetes/KubernetesPodTemplateTestUtils.java
index 38ea3c89e42..f27138a42cf 100644
---
a/flink-kubernetes/src/test/java/org/apache/flink/kubernetes/KubernetesPodTemplateTestUtils.java
+++
b/flink-kubernetes/src/test/java/org/apache/flink/kubernetes/KubernetesPodTemplateTestUtils.java
@@ -48,6 +48,9 @@ public class KubernetesPodTemplateTestUtils {
private static final String TESTING_TEMPLATE_FILE_NAME =
"testing-pod-template.yaml";
+ private static final String TESTING_NO_SPEC_TEMPLATE_FILE_NAME =
+ "testing-nospec-pod-template.yaml";
+
public static File getPodTemplateFile() {
final URL podTemplateUrl =
KubernetesPodTemplateTestUtils.class
@@ -57,6 +60,15 @@ public class KubernetesPodTemplateTestUtils {
return new File(podTemplateUrl.getPath());
}
+ public static File getNoSpecPodTemplateFile() {
+ final URL podTemplateUrl =
+ KubernetesPodTemplateTestUtils.class
+ .getClassLoader()
+ .getResource(TESTING_NO_SPEC_TEMPLATE_FILE_NAME);
+ assertThat(podTemplateUrl, not(nullValue()));
+ return new File(podTemplateUrl.getPath());
+ }
+
public static Container createInitContainer() {
return new ContainerBuilder()
.withName("artifacts-fetcher")
diff --git
a/flink-kubernetes/src/test/java/org/apache/flink/kubernetes/utils/KubernetesUtilsTest.java
b/flink-kubernetes/src/test/java/org/apache/flink/kubernetes/utils/KubernetesUtilsTest.java
index 5de12968c6f..203e6867dcd 100644
---
a/flink-kubernetes/src/test/java/org/apache/flink/kubernetes/utils/KubernetesUtilsTest.java
+++
b/flink-kubernetes/src/test/java/org/apache/flink/kubernetes/utils/KubernetesUtilsTest.java
@@ -85,6 +85,17 @@ public class KubernetesUtilsTest extends KubernetesTestBase {
testCheckAndUpdatePortConfigOption("6123", "16123", "6123");
}
+ @Test
+ public void testLoadPodFromNoSpecTemplate() {
+ final FlinkPod flinkPod =
+ KubernetesUtils.loadPodFromTemplateFile(
+ flinkKubeClient,
+
KubernetesPodTemplateTestUtils.getNoSpecPodTemplateFile(),
+
KubernetesPodTemplateTestUtils.TESTING_MAIN_CONTAINER_NAME);
+ assertThat(flinkPod.getMainContainer(),
is(EMPTY_POD.getMainContainer()));
+
assertThat(flinkPod.getPodWithoutMainContainer().getSpec().getContainers().size(),
is(0));
+ }
+
@Test
public void testLoadPodFromTemplateWithNonExistPathShouldFail() {
final String nonExistFile = "/path/of/non-exist.yaml";
diff --git
a/flink-kubernetes/src/test/resources/testing-nospec-pod-template.yaml
b/flink-kubernetes/src/test/resources/testing-nospec-pod-template.yaml
new file mode 100644
index 00000000000..5bd359420c3
--- /dev/null
+++ b/flink-kubernetes/src/test/resources/testing-nospec-pod-template.yaml
@@ -0,0 +1,28 @@
+################################################################################
+# 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.
+################################################################################
+
+apiVersion: v1
+kind: Pod
+metadata:
+ name: pod-template-no-spec
+ annotations:
+ a1: v1-pod-template
+ annotation-key-of-pod-template: annotation-value-of-pod-template
+ labels:
+ label1: value1-pod-template
+ label-key-of-pod-template: label-value-of-pod-template