[FLINK-30405] Add ResourceLifecycleStatus to CommonStatus and printer column (#524)

Co-authored-by: Marton Balassi <marton@apple.com>
diff --git a/docs/content/docs/custom-resource/reference.md b/docs/content/docs/custom-resource/reference.md
index 7c27192..cb0b839 100644
--- a/docs/content/docs/custom-resource/reference.md
+++ b/docs/content/docs/custom-resource/reference.md
@@ -198,6 +198,7 @@
 | ----------| ---- | ---- |
 | jobStatus | org.apache.flink.kubernetes.operator.api.status.JobStatus | Last observed status of the Flink job on Application/Session cluster. |
 | error | java.lang.String | Error information about the FlinkDeployment/FlinkSessionJob. |
+| lifecycleState | org.apache.flink.kubernetes.operator.api.lifecycle.ResourceLifecycleState | Lifecycle state of the Flink resource (including being rolled back, failed etc.). |
 | clusterInfo | java.util.Map<java.lang.String,java.lang.String> | Information from running clusters. |
 | jobManagerDeploymentStatus | org.apache.flink.kubernetes.operator.api.status.JobManagerDeploymentStatus | Last observed status of the JobManager deployment. |
 | reconciliationStatus | org.apache.flink.kubernetes.operator.api.status.FlinkDeploymentReconciliationStatus | Status of the last reconcile operation. |
@@ -224,6 +225,7 @@
 | ----------| ---- | ---- |
 | jobStatus | org.apache.flink.kubernetes.operator.api.status.JobStatus | Last observed status of the Flink job on Application/Session cluster. |
 | error | java.lang.String | Error information about the FlinkDeployment/FlinkSessionJob. |
+| lifecycleState | org.apache.flink.kubernetes.operator.api.lifecycle.ResourceLifecycleState | Lifecycle state of the Flink resource (including being rolled back, failed etc.). |
 | reconciliationStatus | org.apache.flink.kubernetes.operator.api.status.FlinkSessionJobReconciliationStatus | Status of the last reconcile operation. |
 
 ### JobManagerDeploymentStatus
diff --git a/flink-kubernetes-operator-api/src/main/java/org/apache/flink/kubernetes/operator/api/lifecycle/ResourceLifecycleState.java b/flink-kubernetes-operator-api/src/main/java/org/apache/flink/kubernetes/operator/api/lifecycle/ResourceLifecycleState.java
index 51d52a4..ca580c3 100644
--- a/flink-kubernetes-operator-api/src/main/java/org/apache/flink/kubernetes/operator/api/lifecycle/ResourceLifecycleState.java
+++ b/flink-kubernetes-operator-api/src/main/java/org/apache/flink/kubernetes/operator/api/lifecycle/ResourceLifecycleState.java
@@ -17,6 +17,7 @@
 
 package org.apache.flink.kubernetes.operator.api.lifecycle;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Getter;
 
 import java.util.Collections;
@@ -36,8 +37,8 @@
     ROLLED_BACK(true, "The resource is deployed with the last stable spec"),
     FAILED(true, "The job terminally failed");
 
-    private final boolean terminal;
-    @Getter private final String description;
+    @JsonIgnore private final boolean terminal;
+    @JsonIgnore @Getter private final String description;
 
     ResourceLifecycleState(boolean terminal, String description) {
         this.terminal = terminal;
diff --git a/flink-kubernetes-operator-api/src/main/java/org/apache/flink/kubernetes/operator/api/status/CommonStatus.java b/flink-kubernetes-operator-api/src/main/java/org/apache/flink/kubernetes/operator/api/status/CommonStatus.java
index b90949a..1493ab8 100644
--- a/flink-kubernetes-operator-api/src/main/java/org/apache/flink/kubernetes/operator/api/status/CommonStatus.java
+++ b/flink-kubernetes-operator-api/src/main/java/org/apache/flink/kubernetes/operator/api/status/CommonStatus.java
@@ -22,7 +22,7 @@
 import org.apache.flink.kubernetes.operator.api.spec.AbstractFlinkSpec;
 import org.apache.flink.kubernetes.operator.api.spec.JobState;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.fabric8.kubernetes.model.annotation.PrinterColumn;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -43,6 +43,12 @@
     /** Error information about the FlinkDeployment/FlinkSessionJob. */
     private String error;
 
+    /** Lifecycle state of the Flink resource (including being rolled back, failed etc.). */
+    @PrinterColumn(name = "Lifecycle State")
+    // Calculated from the status, requires no setter. The purpose of this is to expose as a printer
+    // column.
+    private ResourceLifecycleState lifecycleState;
+
     /**
      * Current reconciliation status of this resource.
      *
@@ -50,7 +56,6 @@
      */
     public abstract ReconciliationStatus<SPEC> getReconciliationStatus();
 
-    @JsonIgnore
     public ResourceLifecycleState getLifecycleState() {
         var reconciliationStatus = getReconciliationStatus();
 
diff --git a/flink-kubernetes-operator-api/src/main/java/org/apache/flink/kubernetes/operator/api/status/ReconciliationStatus.java b/flink-kubernetes-operator-api/src/main/java/org/apache/flink/kubernetes/operator/api/status/ReconciliationStatus.java
index c37c7af..bc593a5 100644
--- a/flink-kubernetes-operator-api/src/main/java/org/apache/flink/kubernetes/operator/api/status/ReconciliationStatus.java
+++ b/flink-kubernetes-operator-api/src/main/java/org/apache/flink/kubernetes/operator/api/status/ReconciliationStatus.java
@@ -24,7 +24,6 @@
 import org.apache.flink.kubernetes.operator.api.utils.SpecWithMeta;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import io.fabric8.kubernetes.model.annotation.PrinterColumn;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
@@ -50,7 +49,6 @@
     private String lastStableSpec;
 
     /** Deployment state of the last reconciled spec. */
-    @PrinterColumn(name = "Reconciliation Status")
     private ReconciliationState state = ReconciliationState.UPGRADING;
 
     @JsonIgnore
diff --git a/helm/flink-kubernetes-operator/crds/flinkdeployments.flink.apache.org-v1.yml b/helm/flink-kubernetes-operator/crds/flinkdeployments.flink.apache.org-v1.yml
index 5212526..c31d929 100644
--- a/helm/flink-kubernetes-operator/crds/flinkdeployments.flink.apache.org-v1.yml
+++ b/helm/flink-kubernetes-operator/crds/flinkdeployments.flink.apache.org-v1.yml
@@ -18,9 +18,10 @@
       jsonPath: .status.jobStatus.state
       name: Job Status
       type: string
-    - description: Deployment state of the last reconciled spec.
-      jsonPath: .status.reconciliationStatus.state
-      name: Reconciliation Status
+    - description: "Lifecycle state of the Flink resource (including being rolled\
+        \ back, failed etc.)."
+      jsonPath: .status.lifecycleState
+      name: Lifecycle State
       type: string
     name: v1beta1
     schema:
@@ -9243,6 +9244,17 @@
                 type: object
               error:
                 type: string
+              lifecycleState:
+                enum:
+                - CREATED
+                - SUSPENDED
+                - UPGRADING
+                - DEPLOYED
+                - STABLE
+                - ROLLING_BACK
+                - ROLLED_BACK
+                - FAILED
+                type: string
             type: object
         type: object
     served: true
diff --git a/helm/flink-kubernetes-operator/crds/flinksessionjobs.flink.apache.org-v1.yml b/helm/flink-kubernetes-operator/crds/flinksessionjobs.flink.apache.org-v1.yml
index 1ab2203..4f5e430 100644
--- a/helm/flink-kubernetes-operator/crds/flinksessionjobs.flink.apache.org-v1.yml
+++ b/helm/flink-kubernetes-operator/crds/flinksessionjobs.flink.apache.org-v1.yml
@@ -18,9 +18,10 @@
       jsonPath: .status.jobStatus.state
       name: Job Status
       type: string
-    - description: Deployment state of the last reconciled spec.
-      jsonPath: .status.reconciliationStatus.state
-      name: Reconciliation Status
+    - description: "Lifecycle state of the Flink resource (including being rolled\
+        \ back, failed etc.)."
+      jsonPath: .status.lifecycleState
+      name: Lifecycle State
       type: string
     name: v1beta1
     schema:
@@ -168,6 +169,17 @@
                 type: object
               error:
                 type: string
+              lifecycleState:
+                enum:
+                - CREATED
+                - SUSPENDED
+                - UPGRADING
+                - DEPLOYED
+                - STABLE
+                - ROLLING_BACK
+                - ROLLED_BACK
+                - FAILED
+                type: string
             type: object
         type: object
     served: true