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

Reply via email to