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

gyfora pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/flink-kubernetes-operator.git


The following commit(s) were added to refs/heads/main by this push:
     new a643037  [FLINK-28478] Always complete in-progress update
a643037 is described below

commit a6430378553d7405a037f948576bea5ef5be55ce
Author: Gyula Fora <[email protected]>
AuthorDate: Thu Jul 14 14:00:33 2022 +0200

    [FLINK-28478] Always complete in-progress update
---
 .../AbstractFlinkResourceReconciler.java           |  4 ++
 .../kubernetes/operator/TestingFlinkService.java   |  9 ++-
 .../deployment/SessionReconcilerTest.java          | 67 ++++++++++++++++++++--
 3 files changed, 74 insertions(+), 6 deletions(-)

diff --git 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/deployment/AbstractFlinkResourceReconciler.java
 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/deployment/AbstractFlinkResourceReconciler.java
index b0d8abe..7758ac6 100644
--- 
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/deployment/AbstractFlinkResourceReconciler.java
+++ 
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/deployment/AbstractFlinkResourceReconciler.java
@@ -270,6 +270,10 @@ public abstract class AbstractFlinkResourceReconciler<
      * @return True if desired spec was already deployed.
      */
     private boolean checkNewSpecAlreadyDeployed(CR resource, Configuration 
deployConf) {
+        if (resource.getStatus().getReconciliationStatus().getState()
+                == ReconciliationState.UPGRADING) {
+            return false;
+        }
         AbstractFlinkSpec deployedSpec = 
ReconciliationUtils.getDeployedSpec(resource);
         if (resource.getSpec().equals(deployedSpec)) {
             LOG.info(
diff --git 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/TestingFlinkService.java
 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/TestingFlinkService.java
index 439b3ec..64a0b6d 100644
--- 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/TestingFlinkService.java
+++ 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/TestingFlinkService.java
@@ -144,6 +144,10 @@ public class TestingFlinkService extends FlinkService {
         sessions.clear();
     }
 
+    public Set<String> getSessions() {
+        return sessions;
+    }
+
     @Override
     public void submitApplicationCluster(
             JobSpec jobSpec, Configuration conf, boolean requireHaMetadata) 
throws Exception {
@@ -186,7 +190,10 @@ public class TestingFlinkService extends FlinkService {
     }
 
     @Override
-    public void submitSessionCluster(Configuration conf) {
+    public void submitSessionCluster(Configuration conf) throws Exception {
+        if (deployFailure) {
+            throw new Exception("Deployment failure");
+        }
         sessions.add(conf.get(KubernetesConfigOptions.CLUSTER_ID));
     }
 
diff --git 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/reconciler/deployment/SessionReconcilerTest.java
 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/reconciler/deployment/SessionReconcilerTest.java
index 2e13d28..dddd2eb 100644
--- 
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/reconciler/deployment/SessionReconcilerTest.java
+++ 
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/reconciler/deployment/SessionReconcilerTest.java
@@ -23,16 +23,20 @@ import 
org.apache.flink.kubernetes.operator.TestingFlinkService;
 import org.apache.flink.kubernetes.operator.TestingStatusRecorder;
 import org.apache.flink.kubernetes.operator.config.FlinkConfigManager;
 import org.apache.flink.kubernetes.operator.crd.FlinkDeployment;
+import org.apache.flink.kubernetes.operator.crd.status.ReconciliationState;
 import org.apache.flink.kubernetes.operator.utils.EventRecorder;
 
 import io.fabric8.kubernetes.client.KubernetesClient;
 import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient;
-import io.javaoperatorsdk.operator.api.reconciler.Context;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 /**
  * Tests for {@link 
org.apache.flink.kubernetes.operator.reconciler.deployment.SessionReconciler}.
@@ -41,17 +45,21 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 public class SessionReconcilerTest {
 
     private final FlinkConfigManager configManager = new 
FlinkConfigManager(new Configuration());
-    private final EventRecorder eventRecorder = new EventRecorder(null, (r, e) 
-> {});
     private KubernetesClient kubernetesClient;
+    private EventRecorder eventRecorder;
+
+    @BeforeEach
+    public void before() {
+        eventRecorder = new EventRecorder(kubernetesClient, (r, e) -> {});
+    }
 
     @Test
     public void testStartSession() throws Exception {
-        Context context = TestUtils.createEmptyContext();
         var count = new AtomicInteger(0);
         TestingFlinkService flinkService =
                 new TestingFlinkService() {
                     @Override
-                    public void submitSessionCluster(Configuration conf) {
+                    public void submitSessionCluster(Configuration conf) 
throws Exception {
                         super.submitSessionCluster(conf);
                         count.addAndGet(1);
                     }
@@ -66,7 +74,56 @@ public class SessionReconcilerTest {
                         new TestingStatusRecorder<>());
         FlinkDeployment deployment = TestUtils.buildSessionCluster();
         kubernetesClient.resource(deployment).createOrReplace();
-        reconciler.reconcile(deployment, context);
+        reconciler.reconcile(deployment, flinkService.getContext());
         assertEquals(1, count.get());
     }
+
+    @Test
+    public void testFailedUpgrade() throws Exception {
+        var flinkService = new TestingFlinkService();
+        var reconciler =
+                new SessionReconciler(
+                        kubernetesClient,
+                        flinkService,
+                        configManager,
+                        eventRecorder,
+                        new TestingStatusRecorder<>());
+
+        FlinkDeployment deployment = TestUtils.buildSessionCluster();
+        kubernetesClient.resource(deployment).createOrReplace();
+        reconciler.reconcile(deployment, flinkService.getContext());
+
+        assertEquals(
+                ReconciliationState.DEPLOYED,
+                deployment.getStatus().getReconciliationStatus().getState());
+
+        deployment.getSpec().setRestartNonce(1234L);
+
+        flinkService.setDeployFailure(true);
+        try {
+            reconciler.reconcile(deployment, flinkService.getContext());
+            fail();
+        } catch (Exception expected) {
+        }
+
+        assertEquals(
+                ReconciliationState.UPGRADING,
+                deployment.getStatus().getReconciliationStatus().getState());
+        flinkService.setDeployFailure(false);
+        flinkService.clear();
+        assertTrue(flinkService.getSessions().isEmpty());
+        reconciler.reconcile(deployment, flinkService.getContext());
+
+        assertEquals(
+                ReconciliationState.DEPLOYED,
+                deployment.getStatus().getReconciliationStatus().getState());
+        assertEquals(
+                1234L,
+                deployment
+                        .getStatus()
+                        .getReconciliationStatus()
+                        .deserializeLastReconciledSpec()
+                        .getRestartNonce());
+        assertEquals(Set.of(deployment.getMetadata().getName()), 
flinkService.getSessions());
+    }
 }

Reply via email to