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 ddada0e8 [FLINK-31246] Beautify the SpecChange message
ddada0e8 is described below
commit ddada0e835a6078be70f0828434d5fada7f335b1
Author: pvary <[email protected]>
AuthorDate: Sun Mar 5 15:30:19 2023 +0100
[FLINK-31246] Beautify the SpecChange message
---
.../AbstractFlinkResourceReconciler.java | 2 +-
.../operator/reconciler/diff/DiffBuilder.java | 14 ++--
.../operator/reconciler/diff/DiffResult.java | 88 ++++++++++++++++++----
.../reconciler/diff/ReflectiveDiffBuilder.java | 24 +++---
.../operator/reconciler/diff/SpecDiffTest.java | 34 +++++++++
5 files changed, 127 insertions(+), 35 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 2098c07c..c74545c9 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
@@ -127,7 +127,7 @@ public abstract class AbstractFlinkResourceReconciler<
cr.getStatus().getReconciliationStatus().deserializeLastReconciledSpec();
SPEC currentDeploySpec = cr.getSpec();
- var specDiff = new ReflectiveDiffBuilder<>(currentDeploySpec,
lastReconciledSpec).build();
+ var specDiff = new ReflectiveDiffBuilder<>(lastReconciledSpec,
currentDeploySpec).build();
boolean specChanged =
DiffType.IGNORE != specDiff.getType()
diff --git
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/diff/DiffBuilder.java
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/diff/DiffBuilder.java
index a58615de..7c27eb88 100644
---
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/diff/DiffBuilder.java
+++
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/diff/DiffBuilder.java
@@ -40,17 +40,17 @@ public class DiffBuilder<T> implements
Builder<DiffResult<?>> {
private static final String DELIMITER = ".";
- private final T left;
- private final T right;
+ private final T before;
+ private final T after;
private final List<Diff<?>> diffs;
private boolean triviallyEqual;
- public DiffBuilder(@NonNull final T left, @NonNull final T right) {
+ public DiffBuilder(@NonNull final T before, @NonNull final T after) {
this.diffs = new ArrayList<>();
- this.left = left;
- this.right = right;
- this.triviallyEqual = left == right || left.equals(right);
+ this.before = before;
+ this.after = after;
+ this.triviallyEqual = before == after || before.equals(after);
}
public DiffBuilder<T> testTriviallyEqual(boolean testTriviallyEqual) {
@@ -348,6 +348,6 @@ public class DiffBuilder<T> implements
Builder<DiffResult<?>> {
@Override
public DiffResult<T> build() {
- return new DiffResult<>(left, right, diffs);
+ return new DiffResult<>(before, after, diffs);
}
}
diff --git
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/diff/DiffResult.java
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/diff/DiffResult.java
index 7ada6d01..d53921b1 100644
---
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/diff/DiffResult.java
+++
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/diff/DiffResult.java
@@ -21,10 +21,11 @@ import org.apache.flink.annotation.Experimental;
import org.apache.flink.kubernetes.operator.api.diff.DiffType;
import org.apache.flink.kubernetes.operator.api.diff.Diffable;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.fabric8.zjsonpatch.JsonDiff;
import lombok.Getter;
import lombok.NonNull;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
import java.util.List;
@@ -38,13 +39,15 @@ import java.util.List;
@Getter
public class DiffResult<T> {
@NonNull private final List<Diff<?>> diffList;
- @NonNull private final T left;
- @NonNull private final T right;
+ @NonNull private final T before;
+ @NonNull private final T after;
@NonNull private final DiffType type;
- DiffResult(@NonNull T left, @NonNull T right, @NonNull List<Diff<?>>
diffList) {
- this.left = left;
- this.right = right;
+ private static final ObjectMapper objectMapper = new ObjectMapper();
+
+ DiffResult(@NonNull T before, @NonNull T after, @NonNull List<Diff<?>>
diffList) {
+ this.before = before;
+ this.after = after;
this.diffList = diffList;
this.type = getSpechChangeType(diffList);
}
@@ -59,18 +62,42 @@ public class DiffResult<T> {
return "";
}
- final ToStringBuilder lhsBuilder =
- new ToStringBuilder(left, ToStringStyle.SHORT_PREFIX_STYLE);
- final ToStringBuilder rhsBuilder =
- new ToStringBuilder(right, ToStringStyle.SHORT_PREFIX_STYLE);
+ final StringBuilder builder = new StringBuilder();
+ builder.append(before.getClass().getSimpleName()).append("[");
diffList.forEach(
diff -> {
- lhsBuilder.append(diff.getFieldName(), diff.getLeft());
- rhsBuilder.append(diff.getFieldName(), diff.getRight());
+ try {
+ JsonNode diffBefore =
+ objectMapper.readTree(
+
objectMapper.writeValueAsString(diff.getLeft()));
+ JsonNode diffAfter =
+ objectMapper.readTree(
+
objectMapper.writeValueAsString(diff.getRight()));
+ JsonNode jsonDiff = JsonDiff.asJson(diffBefore,
diffAfter);
+ jsonDiff.forEach(
+ row -> {
+ addField(
+ builder,
+ diffBefore,
+ diffAfter,
+ diff.getFieldName(),
+ row);
+ builder.append(", ");
+ });
+ builder.setLength(builder.length() - 2);
+ } catch (Exception je) {
+ builder.append(diff.getFieldName())
+ .append(" : ")
+ .append(diff.getLeft())
+ .append(" -> ")
+ .append(diff.getRight());
+ }
+ builder.append(", ");
});
-
- return String.format("%s differs from %s", lhsBuilder.build(),
rhsBuilder.build());
+ builder.setLength(builder.length() - 2);
+ builder.append("]");
+ return String.format("Diff: %s", builder);
}
private static DiffType getSpechChangeType(List<Diff<?>> diffs) {
@@ -83,4 +110,35 @@ public class DiffResult<T> {
}
return type;
}
+
+ private static void addField(
+ StringBuilder sb,
+ JsonNode parentBefore,
+ JsonNode parentAfter,
+ String fieldName,
+ JsonNode diff) {
+ JsonNode beforeNode = parentBefore;
+ JsonNode afterNode = parentAfter;
+ String extraPath = "";
+ if (!diff.get("path").asText().equals("/")) {
+ extraPath = diff.get("path").asText().replaceAll("/", ".");
+ beforeNode = beforeNode.at(diff.get("path").asText());
+ afterNode = afterNode.at(diff.get("path").asText());
+ }
+ sb.append(fieldName).append(extraPath).append(" : ");
+ if ((afterNode.isNull() || afterNode.isMissingNode()) &&
beforeNode.asText().equals("")) {
+ sb.append("{..}");
+ } else {
+ sb.append(getText(beforeNode));
+ }
+ sb.append(" -> ").append(getText(afterNode));
+ }
+
+ private static String getText(JsonNode node) {
+ if (node.isNull() || node.isMissingNode()) {
+ return null;
+ }
+ String text = node.asText();
+ return text.equals("") ? node.toString() : text;
+ }
}
diff --git
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/diff/ReflectiveDiffBuilder.java
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/diff/ReflectiveDiffBuilder.java
index 73cbdc65..2bbf618b 100644
---
a/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/diff/ReflectiveDiffBuilder.java
+++
b/flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/reconciler/diff/ReflectiveDiffBuilder.java
@@ -46,23 +46,23 @@ import static
org.apache.flink.kubernetes.operator.api.diff.DiffType.UPGRADE;
@Experimental
public class ReflectiveDiffBuilder<T> implements Builder<DiffResult<T>> {
- private final Object left;
- private final Object right;
+ private final Object before;
+ private final Object after;
private final DiffBuilder<T> diffBuilder;
- public ReflectiveDiffBuilder(@NonNull final T lhs, @NonNull final T rhs) {
- this.left = lhs;
- this.right = rhs;
- diffBuilder = new DiffBuilder<>(lhs, rhs);
+ public ReflectiveDiffBuilder(@NonNull final T before, @NonNull final T
after) {
+ this.before = before;
+ this.after = after;
+ diffBuilder = new DiffBuilder<>(before, after);
}
@Override
public DiffResult<T> build() {
- if (left.equals(right)) {
+ if (before.equals(after)) {
return diffBuilder.build();
}
- appendFields(left.getClass());
+ appendFields(before.getClass());
return diffBuilder.build();
}
@@ -70,8 +70,8 @@ public class ReflectiveDiffBuilder<T> implements
Builder<DiffResult<T>> {
for (final Field field : FieldUtils.getAllFields(clazz)) {
if (accept(field)) {
try {
- var leftField = readField(field, left, true);
- var rightField = readField(field, right, true);
+ var leftField = readField(field, before, true);
+ var rightField = readField(field, after, true);
if (field.isAnnotationPresent(SpecDiff.Config.class)
&& Map.class.isAssignableFrom(field.getType())) {
diffBuilder.append(
@@ -99,8 +99,8 @@ public class ReflectiveDiffBuilder<T> implements
Builder<DiffResult<T>> {
} else {
diffBuilder.append(
field.getName(),
- readField(field, left, true),
- readField(field, right, true),
+ readField(field, before, true),
+ readField(field, after, true),
UPGRADE);
}
diff --git
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/reconciler/diff/SpecDiffTest.java
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/reconciler/diff/SpecDiffTest.java
index 30c75e62..3f36970c 100644
---
a/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/reconciler/diff/SpecDiffTest.java
+++
b/flink-kubernetes-operator/src/test/java/org/apache/flink/kubernetes/operator/reconciler/diff/SpecDiffTest.java
@@ -30,6 +30,7 @@ import
org.apache.flink.kubernetes.operator.api.utils.BaseTestUtils;
import org.apache.flink.kubernetes.operator.api.utils.SpecUtils;
import
org.apache.flink.kubernetes.operator.config.KubernetesOperatorConfigOptions;
+import io.fabric8.kubernetes.api.model.HostAlias;
import org.junit.jupiter.api.Test;
import java.util.List;
@@ -181,4 +182,37 @@ public class SpecDiffTest {
assertEquals(DiffType.UPGRADE, diff.getType());
assertEquals(11, diff.getNumDiffs());
}
+
+ @Test
+ public void testPodTemplateChanges() {
+ var left = BaseTestUtils.buildApplicationCluster().getSpec();
+ left.setPodTemplate(BaseTestUtils.getTestPod("localhost1", "v1",
List.of()));
+ left.getPodTemplate()
+ .getSpec()
+ .getHostAliases()
+ .add(new HostAlias(List.of("host1", "host2"), "ip"));
+ left.setImage("img1");
+ IngressSpec ingressSpec = new IngressSpec();
+ ingressSpec.setTemplate("temp");
+ left.setIngress(ingressSpec);
+ var right = BaseTestUtils.buildApplicationCluster().getSpec();
+ right.setPodTemplate(BaseTestUtils.getTestPod("localhost2", "v2",
List.of()));
+ right.getPodTemplate()
+ .getSpec()
+ .getHostAliases()
+ .add(new HostAlias(List.of("host1"), "ip"));
+ right.setImage("img2");
+ right.setRestartNonce(1L);
+
+ var diff = new ReflectiveDiffBuilder<>(left, right).build();
+ assertEquals(DiffType.UPGRADE, diff.getType());
+ assertEquals(
+ "Diff: FlinkDeploymentSpec[image : img1 -> img2, "
+ + "ingress : {..} -> null, "
+ + "podTemplate.apiVersion : v1 -> v2, "
+ + "podTemplate.spec.hostAliases.0.hostnames.1 : host2
-> null, "
+ + "podTemplate.spec.hostname : localhost1 ->
localhost2, "
+ + "restartNonce : null -> 1]",
+ diff.toString());
+ }
}